系统学习Python——单元测试unittest:用例执行次序

本文详细讲解了如何在Python的unittest框架中,通过调整测试用例名称或组织结构来控制测试执行顺序,并介绍了两种方法:按ASCII值排序和使用数字标识。通过实例演示了如何确保复杂测试集按照预设顺序执行,提高测试效率和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分类目录:《系统学习Python》总目录
相关文章:
· 单元测试unittest:框架结构
· 单元测试unittest:测试固件
· 单元测试unittest:编写测试用例
· 单元测试unittest:执行测试用例
· 单元测试unittest:用例执行次序
· 单元测试unittest:内置装饰器
· 单元测试unittest:命令行执行测试
· 单元测试unittest:批量执行测试文件
· 单元测试unittest:测试断言
· 单元测试unittest:测试报告


《单元测试unittest:执行测试用例》中,我们发现testclass.py文件的运行结果中4个测试用例执行的顺序为test_firsttest_secondtest_fourthtest_third。该顺序和测试用例的摆放顺序并不相同,因为测试用例执行的顺序依照的是方法和函数名的ASCII值排序。testclass.py文件中包含两个类,分别是MyTestClassOneMyTestClassTwo,前11个字符test_相同,从第12个字符开始不同,O排在T前面,因此MyTestClassOne类先执行。MyTestClassOne类中有两个测试用例,用例名分别是test_firsttest_second,按ASCII值来排序的话test_firsttest_second先执行,同理test_fourthtest_third先执行。

如果想让测试用例按照某种顺序来执行,我们可以将用例按顺序添加到集合或者调整测试用例名称

将用例按顺序添加到集合
import unittest
from 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_firsttest_secondtest_thirdtest_fourth的顺序把测试用例组装成测试集合,然后再执行这个测试集合,运行结果如下。

setUpClass
setUp
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.py
import 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值的排序来编排和执行的,我们也可以通过在文件名中添加数字来指定测试用例的执行顺序。在实际项目中,部分测试用例可能存在前后的依赖关系,这时候我们就会期望它们按照顺序执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

von Neumann

您的赞赏是我创作最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值