2012-02-02 79 views
4

我有一個小的命令行應用程序(約6k行)。它沒有單元測試,因爲我不知道如何寫它們;但我現在追溯添加一些。我讀了this tutorial,但我對如何使用此模塊測試整個應用程序感到困惑;事實上,我甚至不確定我想做什麼就是所謂的「單元測試」。在Python中對整個應用程序進行迴歸測試

具體來說,如果我用某些參數運行我的應用程序,它應該會生成某些輸出文件。我想確保那些輸出文件不變。

也就是說,我的應用程序下面的命令行調用:

main.py config1.txt 100 15 
main.py config2.txt def 10 qa 
etc..... 

創建一些小的輸出文本文件(每個< 10 MB),並把它們放入單獨的文件夾(每個每次調用一個),命名例如:

output/config1.100.15.201202011733/ 
output/config2.def.10.qa.201202011733/ 
etc... 

每個文件夾包含一些小的文本文件(10MB <每個)。每次代碼更改後,我想用幾十個命令行參數運行我的應用程序,並注意輸出文件不同的任何情況。 (理想情況下,我想要做的比這更多;例如,對於某些輸出文件,將它們與具有特定主鍵的製表符分隔表進行比較,以便如果行順序發生更改,它們仍會評估爲相等;但這不是危急)。

什麼是設置它的好方法?

回答

11

第1步。把你的應用分成兩部分。

  1. 使用optparse(或​​)來解析命令行選項的片。

  2. 做了真正的工作。然後

你的「主」腳本執行部分1把所有的選項,並調用第2部分做實際工作。

這被稱爲「可測性設計」,是單元測試中比較重要的部分。

第2步。一旦你有兩件,測試真正的工作的部分。

編寫單元測試腳本from the_app import the_function_or_class_that_does_real_work

測試該功能或類或什麼,做真正的工作。

class Test_With_File(TestCase): 
    def assertFileMatches(self, expected, actual, error=None): 
     # use difflib or whatever to compare the two files. 

class TestMain_Sample_File1(Test_With_File): 
    def test_should_produce_known_output(self): 
     with open("temp","w") as target: 
      the_function_that_does_real_work('config1.txt', arg2=100, arg3=15, out=target) 
     self.assertFileMatches("output/config1.100.15.201202011733", "temp") 

你可以寫上了「TestMain_Sample_File1」級的變化,你覺得有趣,以覆蓋儘可能多的測試案例。

+1

S.Lott說的內容也可以理解爲:不要使用文件來驗證輸出;重構一下你的應用程序來驗證函數返回/副作用。並且我同意。它仍然不是單元測試(如果你只是想驗證整個應用程序運行良好,而不是它的部件/單元),那麼它並不是單元測試(但不一定是),但它肯定更加麻煩。 – pkoch 2012-02-02 04:55:02

相關問題