2012-08-17 111 views
13

我正在測試用python編寫的web應用程序。Python鼻子測試跳過某些測試

假設我在我的test_login.py模塊中有5個測試。

每一個測試都是一個類。

經常有一個擴展TestFlow類的基礎測試,它是我們預定義的測試類。

然後本模塊中的其他測試擴展了該基礎測試。

例如:

#The base test 

TestLogin(TestFlow): 
    #do login_test_stuff_here 

#Another test in the same module 

TestAccountDetails(TestLogin) 
    #do account_details_test_stuff_here 

... 

這實際上是相當方便的,因爲爲了測試例如AccountDetails用戶必須先登錄,這樣我就可以從TESTLOGIN測試繼承,我準備好測試等功能作爲登錄用戶。

所有測試都在Project/project/tests文件夾中。

我們使用nosent與選項--with-pylons進行測試。

而我的問題是,如果有一種方法來標記某些TestClass爲「不要測試這一個」。

因爲我不想浪費時間直接執行這些「基本測試」,因爲它們將由其他測試執行,並由它們執行。

可能會有這些測試的音調,我希望每一秒都可以保存。

我已經發現了一些像跳躍,SkipTest或@nottest,但對於一個ceratin的TestClass內test_methods這些唯一的工作,所以我不認爲它會在這裏工作,是我對每一個類測試用例。

回答

2

http://nose.readthedocs.org/en/latest/writing_tests.html

寫作考試

與py.test,鼻試驗不必 的unittest.TestCase生成子類。與默認配置的 testMatch正則表達式((?:^ | [\ b _ \ .-])[Tt] est)相匹配的任何函數或類,即在單詞邊界處具有test或Test或 - 或_) 並且生活在一個與該表達式匹配的模塊中將作爲 運行一個測試。爲了兼容舊版單元測試測試用例, nose還將加載unittest.TestCase子類的測試,就像 unittest那樣。像py.test一樣,鼻子以 的順序運行功能測試,它們出現在模塊文件中。 TestCase派生的測試和其他測試類按字母順序運行。

注意上面的正則表達式和規則。將函數/方法/類命名爲不匹配正則表達式,並且它們不會運行。

這是說,我不建議你的鏈接繼承測試的建議。這是一個沮喪和混亂的祕訣。

在製作mixin類或定義一個沒有任何實際測試的基類時,你可能會更好 - 但有很多繼承類的輔助函數可以調用並用作它們自己的函數。

如果你看看更受歡迎的軟件包的測試,他們幾乎都會使用這種方法。

+0

請注意,匹配正則表達式不是唯一包含的門 - * nose還會從unittest.TestCase子類*加載測試。它似乎也會爲它輸入的任何內容執行此操作。我在名爲'foo_helpers.py'的模塊中有一個名爲'FooMixin'的測試,因爲它是從'unittest.TestCase'派生出來的,所以我們將其視爲一個測試。 – 2013-05-29 12:41:12

12

形式nosetests可以如下通過指定屬性 http://nose.readthedocs.org/en/latest/plugins/attrib.html

通常情況下測試你將要選擇基於標準而不是簡單地通過文件名測試時進行。例如,您可能想要運行除慢速測試以外的所有測試。你可以通過在你的測試方法中設置屬性來完成屬性選擇器插件。這裏有一個例子:

def test_big_download(): 
    import urllib 
    # commence slowness... 

test_big_download.slow = 1 

一旦指定慢= 1的屬性,您可以排除測試和運行

$ nosetests -a '!slow' 
2

實際上,你可以使用具有緩慢的屬性的所有其他測試Classes的skiptest也是如此。

import unittest 

@unittest.skip("Class disabled") 
class TestLogin(TestFlow): 
    ... 
+0

請注意,在Python <= 2.6中,您需要安裝unittest2才能使其工作。 – gaborous 2015-11-11 11:51:58

+1

這不適用於提供的用例。將skip裝飾器添加到基類將導致所有子類也被跳過。即使您在子類上使用了「@ unittest.skipIf(True,」基類「)」和子類上的@ @ unittest.skipIf(False,「」)「,子類仍然會被跳過 – 2017-01-31 22:51:33