在《单元测试unittest:执行测试用例》中,我们发现testclass.py文件的运行结果中4个测试用例执行的顺序为test_first、test_second、test_fourth、test_third。该顺序和测试用例的摆放顺序并不相同,因为测试用例执行的顺序依照的是方法和函数名的ASCII值排序。testclass.py文件中包含两个类,分别是MyTestClassOne和MyTestClassTwo,前11个字符test_相同,从第12个字符开始不同,O排在T前面,因此MyTestClassOne类先执行。MyTestClassOne类中有两个测试用例,用例名分别是test_first和test_second,按ASCII值来排序的话test_first比test_second先执行,同理test_fourth比test_third先执行。
如果想让测试用例按照某种顺序来执行,我们可以将用例按顺序添加到集合或者调整测试用例名称:
将用例按顺序添加到集合
import unittestfrom learning_unittest import testclass
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(testclass.MyTestClassOne('test_first'))
suite.addTest(testclass.MyTestClassOne('test_second'))
suite.addTest(testclass.MyTestClassTwo('test_third'))
suite.addTest(testclass.MyTestClassTwo('test_fourth'))
unittest.TextTestRunner()`.run(suite)
我们按照test_first、test_second、test_third、test_fourth的顺序把测试用例组装成测试集合,然后再执行这个测试集合,运行结果如下。
setUpClasssetUp
test_first
tearDown
setUp
test_second
tearDown
tearDownClass
setUpClass
setUp
test_third
tearDown
setUp
test_fourth
tearDown
tearDownClass
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
测试用例执行的顺序和我们组合测试集合的顺序是一致的。但是当测试用例非常多的时候,我们不可能人工去判断每条用例名的ASCII值,况且一条条地将测试用例加到测试集合中也是不小的工作量。因此,应对该问题我们有更合适的解决方案——调整测试用例名称。
调整测试用例名称
既然测试用例默认的执行顺序依照的是ASCII值的排序,那么我们构造合适的类名和方法名就可以了。我们在testclass.py文件的基础上调整类名或者方法名,在用例名中间加上数字:
# testclass.pyimport unittest
class MyTestClassOne(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('setUpClass')
def setUp(self):
print('setUp')
def test_001(self):
print('test_first')
self.assertEqual(0, 0)
def test_002(self):
print('test_second')
self.assertEqual(0, 0)
def tearDown(self):
print('tearDown')
@classmethod
def tearDownClass(cls):
print('tearDownClass')
class MyTestClassTwo(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('setUpClass')
def setUp(self):
print('setUp')
def test_003(self):
print('test_third')
self.assertEqual(0, 0)
def test_004(self):
print('test_fourth')
self.assertEqual(0, 0)
def tearDown(self):
print('tearDown')
@classmethod
def tearDownClass(cls):
print('tearDownClass')
if __name__ == '__main__':
unittest.main
执行结果如下:
============================= test session starts =============================collecting ... collected 4 items
testclass.py::MyTestClassOne::test_001
setUpClass
setUp
test_first
tearDown
testclass.py::MyTestClassOne::test_002
setUp
test_second
tearDown
tearDownClass
testclass.py::MyTestClassTwo::test_003
setUpClass
setUp
test_third
tearDown
testclass.py::MyTestClassTwo::test_004
]setUp
test_fourth
tearDown
tearDownClass
============================== 4 passed in 0.04s ==============================
Process finished with exit code 0
同样,我们在一个目录下新建的测试用例文件也是按照文件名的ASCII值的排序来编排和执行的,我们也可以通过在文件名中添加数字来指定测试用例的执行顺序。在实际项目中,部分测试用例可能存在前后的依赖关系,这时候我们就会期望它们按照顺序执行。