背景:在一个testcase类中,存在多个接口方法,其中A接口的值要作为B接口的参数,B接口的返回值要作为C接口的参数,通常的解决方法是使用unittest中的globals 来进行参数管理。但是在执行中缺老是报错
import requests
class TestGos(unittest.TestCase):
def setUp(self):
pass
def test_one(self):
print(111)
def test_two(self):
print(222)
def test_four(self):
print(333)
if __name__ == '__main__':
unittest.main()
你以为的顺序是123吗?
不是
出来的结果是乱的
怎么控制unittest用例执行的顺序呢?
在loader.py的loadTestsFromTestCase方法里边,调用了getTestCaseNames方法来获取测试用例的名称
def getTestCaseNames(self, testCaseClass):
"""Return a sorted sequence of method names found within testCaseClass
"""
def isTestMethod(attrname, testCaseClass=testCaseClass,
prefix=self.testMethodPrefix):
return attrname.startswith(prefix) and \
callable(getattr(testCaseClass, attrname))
testFnNames = list(filter(isTestMethod, dir(testCaseClass)))
if self.sortTestMethodsUsing:
testFnNames.sort(key=functools.cmp_to_key(self.sortTestMethodsUsing))
return testFnNames
可以看到,getTestCaseNames方法对测试用例的名称进行了排序
testFnNames.sort(key=functools.cmp_to_key(self.sortTestMethodsUsing))
看看排序方法
def three_way_cmp(x, y):
"""Return -1 if x < y, 0 if x == y and 1 if x > y"""
return (x > y) - (x < y)
根据排序规则,unittest执行测试用例,默认是根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。
网上有两种方式可以控制用例的执行顺序
第一种:
suite = unittest.TestSuite()
suite.addTest(TestGos(“test_one”))
suite.addTest(TestGos(“test_two”))
suite.addTest(TestGos(“test_three”))
unittest.TextTestRunner(verbosity=3).run(suite)
第二种:修改函数名
import requests
class TestGos(unittest.TestCase):
def setUp(self):
pass
def test_1_one(self):
print(111)
def test_2_two(self):
print(222)
def test_3_four(self):
print(333)
if __name__ == '__main__':
unittest.main()
这样就可以解决执行顺序混乱的问题了