2010-10-23 37 views
25

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

+1

它还排除了在多核上并行运行测试,或者跨群集分布测试。不是一个好主意。 – 2010-10-24 03:50:02

+9

这将是重要的,如果1.您需要调试,并希望运行测试按顺序增加复杂性和2.如果一小部分的测试计算量很大,但有一些错误可以通过简单的测试发现,那么让他们下令会让你的工作更快,更快。 – 2012-10-22 11:31:40

+0

听起来像集成测试,而不是单元测试。 – 2013-03-01 20:04:32

回答

23

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

例如,你可以这样做回复您的测试的执行顺序:

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

这并没有回答上面的问题 – Udi 2013-08-28 21:48:23

+1

这个*确实*回答了上面的问题 – chown 2015-03-07 22:37:43

+1

这看起来确实如此招。那么默认的订单总是与声明的顺序相反吗? – BenB 2015-07-31 22:09:44

15

聪明的命名。

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

是强制特定订单的一种方法。

+2

稍微更聪明的名字是Test010_Run_Me_First,所以如果你决定在两个之间推新的,你可以。 – Mansour 2012-02-06 16:59:01

+0

对我来说这些数字根本没有帮助.. – holms 2015-07-04 06:54:38

+0

对于我来说这些数字都不起作用...... – Caumons 2016-07-12 14:23:24

2

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

1

使用proboscis库作为我mentioned already(请参阅下面简短描述那里)。

+0

试过长鼻涕......值得一提的是,它劫持了测试加载过程,所以如果你使用鼻子,任何利用该鼻子插件(例如testid)将停止工作 – Clintm 2015-04-01 22:01:21

4

如上所述,通常测试用例中的测试应该以任何(即随机)顺序进行测试。但是,如果您确实想要在测试用例中排列测试,显然这不是微不足道的。 使用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) 
+1

好戏,但是你的代码有错误。它应该是''lncomp = lambda _,a,b:cmp(ln(a),ln(b))'' – saroele 2013-11-14 11:38:55

+0

如何在多个测试用例上使用它? – cat 2016-03-10 21:16:50

+0

[Nevermind,我自己做了。](http://stackoverflow.com/q/35930811/4532996) – cat 2016-03-11 01:54:50

0

我发现使用PyTest排序它插件提供的here的解决方案。

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

我做了同样的事情,并为我工作得很好。

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