【问题标题】:Order of tests in python unittestpython unittest中的测试顺序
【发布时间】:2015-05-17 11:14:20
【问题描述】:

我正在查看类似的问题,但找不到问题的答案。

我在派生自 unittest.TestCase 的 python 类中编写了测试

class TestEffortFormula(unittest.TestCase)

我需要对测试下达命令(请不要告诉我我不应该依赖测试的命令,我只是这样做)。

在我需要对测试下达命令之前,我用来运行测试的命令是:

unittest.main(testRunner=TeamcityTestRunner())

然后我想让订单消失,所以我尝试了以下:

loader = unittest.TestLoader()
loader.sortTestMethodsUsing(None)
loader.loadTestsFromTestCase(TestEffortFormula)
suite = loader.suiteClass()

但是从这里我不知道如何运行测试,特别是testRunner=TeamcityTestRunner() 和以前一样。

感谢您的帮助

【问题讨论】:

  • unittest 不保证执行顺序。如果您的测试依赖于顺序,那么您就没有正确地进行单元测试!初始状态和最终状态应由 setup 和 teardown 处理,而不是其他测试方法
  • 我在 stackoverflow 上阅读了一些地方,其中有一种方法可以做到这一点,但在我的条件下我无法理解。另外,我要求不要告诉我为什么我不应该......
  • 你需要单元测试,还是可以使用其他框架? AFAIR proboscis 允许测试依赖。
  • 这能回答你的问题吗? Python unittest.TestCase execution order

标签: python python-unittest unittest2


【解决方案1】:

选项 1。

对此的一种解决方案(作为一种解决方法)是given here - 它建议以编号方法step1step2 等编写测试,然后通过dir(self) 收集和存储它们并将它们归为一个test_ 方法,每个 trys。

不理想,但符合您的期望。每个测试序列必须是一个单独的 TestClass(或调整那里给定的方法以具有多个序列生成方法)。

选项 2。

另一个解决方案(也在链接问题中)是您将测试命名为按字母+数字排序,以便它们按该顺序执行。

但在这两种情况下,都要编写单体测试,每个测试都在自己的测试类中。

附:我同意所有认为不应该以这种方式进行单元测试的 cmets。但在某些情况下,单元测试框架(如unittestpytest)习惯于进行需要模块化独立步骤才能发挥作用的集成测试。此外,如果 QA 无法影响 Dev 编写模块化代码,则必须做这些事情。

【讨论】:

    【解决方案2】:

    我自己找了很久才解决这个问题。
    this question 中的答案之一正是您所需要的。

    应用于您的代码:

    ln = lambda f: getattr(TestEffortFormula, f).im_func.func_code.co_firstlineno
    lncmp = lambda _, a, b: cmp(ln(a), ln(b))
    unittest.TestLoader.sortTestMethodsUsing = lncmp
    
    suite = unittest.TestLoader().loadTestsFromTestCase(TestEffortFormula)
    unittest.TextTestRunner(failfast=True).run(suite)
    

    不幸的是,设置unittest.TestLoader.sortTestMethodsUsing=None 不起作用,尽管设置documented 应该避免按字母顺序对测试进行排序。

    【讨论】:

    • 因为unittest 调用dir() 来获取(可能的)测试方法的列表并且它们已经排序... :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多