2010-10-23 21 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軟件包並導入它。