Django TestCase 测试顺序

32 投票
3 回答
19594 浏览
提问于 2025-04-15 21:16

如果测试类里面有好几个方法,我发现它们的执行顺序是按字母顺序来的。但是我想自定义一下执行的顺序。那该怎么定义执行的顺序呢?

举个例子:testTestA会比testTestB先执行。

class Test(TestCase):
    def setUp(self):
        ...

    def testTestB(self):
        #test code

    def testTestA(self):
        #test code

3 个回答

8

关于这个话题的更新(来自文档):

测试执行的顺序

为了确保所有的 TestCase 代码都是在一个干净的数据库上开始运行,Django 的测试运行器会按照以下顺序重新排列测试:

  • 首先运行所有的 TestCase 子类。
  • 接着,运行所有其他基于 Django 的测试(这些测试是基于 SimpleTestCase 的,包括 TransactionTestCase),这些测试之间没有特别的顺序保证。
  • 最后,运行任何其他的 unittest.TestCase 测试(包括 doctests),这些测试可能会改变数据库的状态,但不会把它恢复到原来的状态。

注意:新的测试顺序可能会暴露出测试用例之间意想不到的依赖关系。比如,有些 doctests 依赖于某个 TransactionTestCase 测试在数据库中留下的状态,因此它们需要更新,以便能够独立运行。

11

据我了解,除了重命名测试用例之外,似乎没有其他方法可以对测试进行排序。你能解释一下为什么需要按照特定顺序运行测试用例吗?在单元测试中,通常认为这样做是不好的做法,因为这意味着你的测试用例之间并不是独立的。

76

单元测试的一个原则是,每个测试都应该独立于其他测试。如果在你的情况下,testTestA 必须在 testTestB 之前执行,那么你可以把这两个测试合并成一个:

def testTestA_and_TestB(self):
    # test code from testTestA
    ...
    # test code from testTestB

或者,可能更好的做法是:

def TestA(self):
    # test code
def TestB(self):
    # test code
def test_A_then_B(self):
    self.TestA()
    self.TestB()

Test 类只会测试那些名字以小写 test... 开头的方法。所以你可以添加一些额外的辅助方法 TestATestB,这些方法只有在你明确调用它们的时候才会被执行。

撰写回答