2016-09-19 176 views
1

假設我有在其工作期間創建SVN分支的實體。要執行功能測試我創建多個基本相同的方法(我使用Python單元測試框架,但問題涉及到任何測試框架):將參數傳遞給tearDown方法

class Tester(unittest.TestCase): 

def test_valid1_url(self): 
    url="valid1" 
    BranchCreator().create_branch(url) 
    self.assertUrlExists(url) # assume I have this method implemented 

def test_valid2_url(self): 
    url="valid2" 
    BranchCreator().create_branch(url) 
    self.assertUrlExists(url) # assume I have this method implemented 

def test_invalid_url(self): 
    url="invalid" 
    self.assertRaises(ValueError, BranchCreator().create_branch, url) 

每次測試我想刪除所產生的分支或做什麼,如果測試失敗之後。理想情況下,我會使用以下內容:

@teardown_params(url='valid1') 
def test_valid1_url(self): 

def tearDown(self, url): 
    if (url_exists(url)): remove_branch(url) 

但是tearDown不接受任何參數。 我看到一些很骯髒的解決方案:

一)創建測試場「used_url」,將其設置在每一個方法和拆卸使用:

def test_valid1_url(self): 
    self.used_url="valid1" 
    BranchCreator().create_branch(self.used_url) 
    self.assertUrlExists(url) 
... 
def tearDown(self): 
    if (url_exists(self.used_url)): remove_branch(self.used_url) 

它應該工作,因爲(至少在我的環境)所有的測試都是順序運行的,所以不會有衝突。但是這個解決方案由於共享變量而違反了測試的獨立性原則,如果我設法同時啓動測試,它將不起作用。

b)利用單獨的方法,像cleanup(self, url)並從每一個方法

是否有任何其他的方式調用它呢?

+0

有些人認爲''tearDown''應該永遠不會被添加到測試框架中。讓你的「b」解決方案成爲正確的解決方案。我會用適當的異常處理來創建參數化測試以消除重複。 – zhon

回答

0

我認爲b)解決方案即使在每次測試中都要求調用助手方法,並且對我來說似乎是一種重複,也可以工作。 另一種方法可能是調用「assertUrlExists」函數內的幫助器方法。通過這種方式,重複被刪除,您可以避免再次檢查URL的存在以管理清理:您擁有斷言結果,您可以使用它。