我怎样才能这样做,以便Python中的单元测试(使用unittest
)按照文件中指定的顺序运行?
答案 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)
使用proboscis库mentioned 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)