Python中如何使用unittest按顺序执行测试用例

我发现不是按顺序执行的,怎么才能按顺序执行呢?
Python中如何使用unittest按顺序执行测试用例

17 回复

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

感觉有点僵硬

最近我们也在写测试,不过是投入 pytest 的怀抱

我想用 nose 但是感觉跟 unitest 区别不大

我是说不能调顺序挺僵硬的

根据我上回的发现,这个顺序是按测试方法的首字母顺序来的…

有这个需求基本上意味着你错了

测试不应该有前置条件?

一般情况下前置条件用 setUp,而不是用另一个 test

单元测试啊,单元就是边界

感谢指点

回到顶部