Python unittest执行测试用例顺序坑点

背景:在一个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()

这样就可以解决执行顺序混乱的问题了

扫描二维码关注公众号,回复: 13313176 查看本文章

猜你喜欢

转载自blog.csdn.net/SKY_PLA/article/details/115719711