Python中如何使用unittest按顺序执行测试用例
我发现不是按顺序执行的,怎么才能按顺序执行呢?
Python中如何使用unittest按顺序执行测试用例
TestLoader 有一个 sortTestMethodsUsing 方法,给一个新的 sorting function 可以覆盖默认的按测试名称排序的方法,也可以直接设为 None 关闭排序。如果测试有一些先决条件请参考 test 的 setup 部分。
在unittest中,默认情况下测试用例的执行顺序是不确定的,因为测试方法名会被收集到一个字典中(Python 3.7之前)或列表(Python 3.7+),但字典键的顺序不稳定。要按顺序执行,有几种方法:
方法1:使用TestLoader的sortTestMethodsUsing参数(推荐)
import unittest
import types
class TestOrder(unittest.TestCase):
def test_third(self):
print("Running test_third")
self.assertTrue(True)
def test_first(self):
print("Running test_first")
self.assertTrue(True)
def test_second(self):
print("Running test_second")
self.assertTrue(True)
# 创建自定义排序函数
def custom_sort(x, y):
order = {'test_first': 0, 'test_second': 1, 'test_third': 2}
return order.get(x, 999) - order.get(y, 999)
if __name__ == '__main__':
loader = unittest.TestLoader()
loader.sortTestMethodsUsing = custom_sort
suite = loader.loadTestsFromTestCase(TestOrder)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
方法2:重命名测试方法 最简单的方法是按字母顺序命名:
class TestOrder(unittest.TestCase):
def test_01_first(self):
print("Running first test")
def test_02_second(self):
print("Running second test")
def test_03_third(self):
print("Running third test")
方法3:使用测试套件手动指定顺序
import unittest
class TestA(unittest.TestCase):
def test_one(self):
print("Test A - one")
class TestB(unittest.TestCase):
def test_two(self):
print("Test B - two")
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(TestA('test_one'))
suite.addTest(TestB('test_two'))
runner = unittest.TextTestRunner()
runner.run(suite)
方法4:使用pytest-ordering插件(如果可用)
import pytest
@pytest.mark.order(1)
def test_first():
assert True
@pytest.mark.order(2)
def test_second():
assert True
总结: 推荐使用TestLoader的自定义排序或按字母顺序命名方法。
测试应该是独立的吧,顺序不影响啊
class TestCase():
def one(self):
put()
def two(self):
get()
我想先执行 1 才能执行 2
#3 test_1_one, test_2_two
OK
???
最近我们也在写测试,不过是投入 pytest 的怀抱
我想用 nose 但是感觉跟 unitest 区别不大
我是说不能调顺序挺僵硬的
根据我上回的发现,这个顺序是按测试方法的首字母顺序来的…
有这个需求基本上意味着你错了
测试不应该有前置条件?
一般情况下前置条件用 setUp,而不是用另一个 test
单元测试啊,单元就是边界
感谢指点


