【问题标题】:changing order of unit tests in Python在 Python 中更改单元测试的顺序
【发布时间】:2020-04-29 17:39:23
【问题描述】:

如何使 Python 中的单元测试(使用 unittest)按照文件中指定的顺序运行?

【问题讨论】:

  • 它还排除了在多核上并行运行测试,或分布在集群中。不是个好主意。
  • 如果 1. 您需要调试并希望按照复杂性增加的顺序运行测试和 2. 如果一小部分测试的计算量很大,但可能存在错误发现更简单的测试,然后订购它们将使您的工作变得更快。
  • 听起来像是集成测试,而不是单元测试。
  • 那么集成测试的 Python 标准是什么?不是...单元测试吗?

标签: python unit-testing


【解决方案1】:

您可以通过设置自定义比较函数来更改默认排序行为。在unittest.py中可以找到类变量unittest.TestLoader.sortTestMethodsUsing,默认设置为内置函数cmp

例如,您可以通过以下方式恢复测试的执行顺序:

import unittest
unittest.TestLoader.sortTestMethodsUsing = lambda _, x, y: cmp(y, x)

【讨论】:

  • 这不能回答上面的问题
  • 确实回答了上面的问题
  • 这似乎可以解决问题。那么默认顺序是否总是与声明顺序相反?
  • 文档表明它取决于字符串的默认排序:--- 请注意,运行各种测试用例的顺序是通过相对于内置的测试函数名称排序来确定的为字符串排序。
【解决方案2】:

巧妙的命名。

class Test01_Run_Me_First( unittest.TestCase ):
    def test010_do_this( self ):
        assertTrue( True )
    def test020_do_that( self ):
        etc.

是强制执行特定订单的一种方式。

【讨论】:

  • 稍微聪明一点的名字是 Test010_Run_Me_First 所以如果你决定在两个之间推一个新的,你可以。
  • 确实,聪明:)。
【解决方案3】:

如上所述,通常测试用例中的测试应该以任何(即随机)顺序进行测试。

但是,如果您确实想在测试用例中对测试进行排序,显然这并非易事。 使用dir(MyTest) 从测试用例中检索测试(方法名称),它返回成员的排序列表。您可以使用巧妙的 (?) hack 按行号对方法进行排序。这适用于一个测试用例:

if __name__ == "__main__":
    loader = unittest.TestLoader()
    ln = lambda f: getattr(MyTestCase, f).im_func.func_code.co_firstlineno
    lncmp = lambda a, b: cmp(ln(a), ln(b))
    loader.sortTestMethodsUsing = lncmp
    unittest.main(testLoader=loader, verbosity=2)

【讨论】:

  • 不错的技巧,但您的代码中有错误。应该是lncomp = lambda _, a, b: cmp(ln(a), ln(b))
  • 如何在多个测试用例中使用它?
【解决方案4】:

也有测试运行者自己做这件事——我认为 py.test 做的。

【讨论】:

    【解决方案5】:

    像我一样使用proboscismentioned already(请在此处查看简短说明)。

    【讨论】:

    • 尝试过 proboscis...值得一提的是,它会劫持测试加载过程,因此如果您使用鼻子,任何利用它的鼻子插件(例如 testid)都将停止工作
    【解决方案6】:

    默认顺序是字母顺序。您可以在每个测试前加上test_<int> 来指定执行顺序。

    您也可以设置unittest.TestLoader.sortTestMethodsUsing = None 来消除排序。

    查看Unittest Documentation了解更多详情。

    【讨论】:

      【解决方案7】:

      我使用 here 提供的 PyTest 排序插件找到了解决方案。

      在 CLI 中尝试py.test YourModuleName.py -vv,测试将按照它们在您的模块中出现的顺序运行。

      我做了同样的事情,对我来说效果很好。

      注意:需要安装 PyTest 包并导入。

      【讨论】:

        【解决方案8】:

        hacky 方式(在 pycharm 或其他单元测试运行器中运行此文件)

        #!/usr/bin/env python
        # -*- coding: UTF-8 -*-
        import unittest
        
        
        def make_suite():
            class Test(unittest.TestCase):
                def test_32(self):
                    print "32"
                def test_23(self):
                    print "23"
        
            suite = unittest.TestSuite()
            suite.addTest(Test('test_32'))
            suite.addTest(Test('test_23'))
            return suite
        
        suite = make_suite()
        
        class T(unittest.TestCase):
            counter = 0
            def __call__(self, *args, **kwargs):
                res = suite._tests[T.counter](*args, **kwargs)
                T.counter += 1
                return res
        
        for t in suite._tests:
            name = "{}${}".format(t._testMethodName, t.__class__.__name__)
            setattr(T, name, t)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多