在Python中改变单元测试的顺序

时间:2010-10-23 19:32:10

标签: python unit-testing

我怎样才能这样做,以便Python中的单元测试(使用unittest)按照文件中指定的顺序运行?

8 个答案:

答案 0 :(得分:27)

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

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

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

答案 1 :(得分:17)

聪明的命名。

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

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

答案 2 :(得分:5)

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

但是,如果您确实想在测试用例中订购测试,显然这并非易事。 使用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)

答案 3 :(得分:2)

也有测试跑步者自己做 - 我认为py.test做到了。

答案 4 :(得分:1)

使用proboscismentioned already(请参阅那里的简短说明)。

答案 5 :(得分:1)

默认顺序为字母顺序。您可以将test_<int>放在每个测试之前,以指定执行顺序。

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

查看Unittest Documentation了解更多详细信息。

答案 6 :(得分:0)

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

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

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

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

答案 7 :(得分:0)

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)