大多數測試框架假定「1測試= 1 Python方法/函數」, 並且考慮在函數執行時傳遞的測試,而不是 提升聲明。每個輸入文件分開測試用例?
我測試編譯樣的程序(一個程序,讀取*.foo
文件並處理其內容),爲此,我想很多輸入(*.foo
)文件執行相同的測試。 IOW,我的測試是這樣的:
class Test(unittest.TestCase):
def one_file(self, filename):
# do the actual test
def list_testcases(self):
# essentially os.listdir('tests/') and filter *.foo files.
def test_all(self):
for f in self.list_testcases():
one_file(f)
我當前的代碼使用 unittest從 Python的標準庫,即one_file
使用self.assert...(...)
語句來檢查測試是否通過。
這工作,因爲我得到一個計劃,成功感/失敗 時,我的代碼是OK /越野車,但我失去了很多的 優勢的測試框架:
我沒有得到相關報告,如「X失敗的Y測試」,也沒有 通過/失敗的測試列表。 (我打算用這樣的系統 不僅考驗我自己的發展也年級學生的代碼 作爲一個老師,所以報告是非常重要的對我來說)
我沒有得到測試的獨立性。第二個測試運行在第一個等待的環境 上,依此類推。第一次失敗停止 測試套件:失敗後的測試用例根本沒有運行。
我得到我濫用我的測試框架的感覺:這麼單元測試的自動測試發現聲音 矯枉過正例如這裏只有一個 測試功能。相同的代碼可以(應該?)寫入 普通Python中,其基本爲
assert
。
一個顯而易見的選擇是我的代碼更改爲類似
class Test(unittest.TestCase):
def one_file(self, filename):
# do the actual test
def test_file1(self):
one_file("first-testcase.foo")
def test_file2(self):
one_file("second-testcase.foo")
然後我得到的單元測試的所有優點回來,但是:
這是一個很大更多的代碼寫。
很容易「忘記」測試用例,即在
tests/
中創建一個測試文件,並忘記將其添加到Python測試中。
我可以想象一個解決方案,其中我會動態地生成每一個測試用例方法(沿setattr(self, 'test_file' + str(n), ...)
的線),以產生用於所述第二溶液中的代碼,而無需手工編寫它。但是這聽起來對於一個看似不那麼複雜的用例來說太過於誇張了。
我怎樣才能獲得最好的兩個,即 自動測試發現(列表tests/*.foo
文件),測試 獨立性和正確的報告?
你可以看一下http://pythonhosted.org/behave/。它包含強大的參數化功能。 – Laszlowaty
感謝您的提示,但我不明白這將如何解決我的問題(儘管我可能錯過了某些東西......)。從本質上講,行爲將允許我編寫自然語言而不是Python,並且['Scenario Outlines'](http://pythonhosted.org/behave/tutorial.html#scenario-outlines)將允許因式分解代碼(有點像我的'one_file'函數),但測試套件仍然需要顯式列出所有測試文件,對嗎? –
關於行爲:此外,在這種情況下,我寧願直接編寫比自然語言更多的Python代碼。無論如何,再次感謝這個建議,我正在尋找食物尋找真正的解決方案;-)。 –