Django TestCase测试订单

zs2*_*020 24 python django unit-testing

如果测试类中有多个方法,我发现执行的顺序是按字母顺序排列的.但我想自定义执行顺序.如何定义执行顺序?

例如:testTestA将首先加载testTestB.

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

    def testTestB(self):
        #test code

    def testTestA(self):
        #test code
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 52

单元测试的一个原则是每个测试应该独立于所有其他测试.如果在您的情况下testTestA中的代码必须在testTestB之前,​​那么您可以将两者结合到一个测试中:

def testTestA_and_TestB(self):
    # test code from testTestA
    ...
    # test code from testTestB
Run Code Online (Sandbox Code Playgroud)

或者,或许会更好

def TestA(self):
    # test code
def TestB(self):
    # test code
def test_A_then_B(self):
    self.TestA()
    self.TestB()
Run Code Online (Sandbox Code Playgroud)

Test班仅测试谁名称以小写的方法test....所以你可以放入额外的辅助方法TestA,TestB除非你明确地调用它们,否则它们将无法运行.

  • +1:不止一次完成这项工作,将测试链接在一起,缩短了设置时间. (6认同)

Yar*_*lav 10

据我所知,除了重命名之外,没有办法订购测试.您能解释为什么需要按特定顺序运行测试用例吗?在单元测试中,它通常被认为是不好的做法,因为这意味着你的案件不是独立的.

  • 我喜欢逻辑上订购测试.并不是说它们是依赖的,但是测试(我在这里的测试方法)越相似,我就越接近它们.使用failfast选项运行测试(与Django一样)很烦人,如果你在那里放置一个pdb行,它将不会被触发,除非它是按字母顺序排在第一次失败的测试. (2认同)
  • @sleske 太有趣了,我在搜索同样的东西时再次在这里看到了我的评论。我已将按特定顺序调用 20 个测试(否则其他测试将失败)的函数移至“setUp()”,这实际上很好。在编写 selenium 测试时,我需要精确的命令顺序,否则整个 20 表单程序将失败。它们不能单独测试。 (2认同)

Wto*_*wer 6

要更新主题(来自文档):

执行测试的顺序

为了保证所有TestCase代码都以干净的数据库开头,Django测试运行器以下列方式重新排序测试:

  • TestCase首先运行所有子类.
  • 然后,所有其他基于Django的测试(基于测试用例SimpleTestCase,包括 测试用例TransactionTestCase)在没有特定排序的情况下运行,也不会在其中强制执行.
  • 然后运行可能改变数据库而不将其恢复到其原始状态的任何其他unittest.TestCase测试(包括doctests).

注意:新的测试顺序可能会显示对测试用例排序的意外依赖性.这是doctests的情况,它依赖于给定TransactionTestCase测试在数据库中留下的状态,它们必须更新才能独立运行.