2010-01-21 86 views
2

我是新來的單元測試我自己的項目,所以這是我第一次嘗試從頭開始編寫單元測試。我使用python和unittest模塊。在這裏測試的TodoList類是實際列表的一個包裝,有一些額外的方法用於保存到光盤等內容。它還定義了一些通過列表中的ID獲取項目的方法(與列表索引不同)。我在做這些單元測試嗎?

測試(我剪了幾個輔助方法,並沒有老百姓着想的好幾個測試永遠滾動):

class TodoListTests(unittest.TestCase): 

    def setUp(self): 
     self.testdata = open("./testdata.json", "r") 
     self.testdata_text = self.testdata.read() 
     self.testdata.close() 

    def tearDown(self): 
     try: 
      os.remove("./todo.json") 
     except OSError: 
      # File not created, no need to delete. 
      pass 

    def create_todolist_and_safe_list(self): 
     self.create_data_file() 
     self.todolist = todolist.TodoList("./todo.json") 
     self.list = json.loads(self.testdata_text) 

    def create_data_file(self): 
     datafile = open("./todo.json", "w") 
     datafile.write(self.testdata_text) 
     datafile.close() 

    # Snip out a few more helper methods 

    def test_loop(self): 
     self.create_todolist_and_safe_list() 
     test_list = [] 
     for item in self.todolist: 
     test_list.append(item) 

     self.assertEquals(test_list, self.list) 


    def test_save(self):  
     self.create_todolist_and_safe_list() 
     self.todolist.save() 
     newfile_text = self.get_data_file_as_string() 
     self.assertEquals(newfile_text, self.testdata_text) 

    # Snip out the rest of the tests. 

Full link to source

回答

2

我認爲你是以正確的方式進行。但我會提出一些建議;

  • self.testdata.close()setUp()移到tearDown()函數。
  • 用try/finally塊圍住其他人打開/關閉。所以,如果一個文件沒有打開成功,它將被關閉。

    try: 
     file.open() 
    finally: 
     file.close() 

  • 更好地組織你的測試文件夾。我建議你創建一個名爲_tests的文件夾,在這個文件夾中你應該放置測試模塊(在你的情況下你只有一個模塊)。然後,爲每個模塊創建一個帶有模塊名稱的文件夾,並將模塊測試使用的文件放入此文件夾中。

要了解更多關於TDD和測試,你應該閱讀這本書Test Driven Development: By Example

1

不,它並不完全像你。單元測試應該小巧,快速並且簡單。 做「複雜」測試(任何依賴於外部數據庫,文件系統,配置,環境或測試本身之外的任何東西以及測試代碼)是非常有價值的,但不應該是「核心單元」的一部分測試」。 單元測試應該驗證代碼是否符合規範。一個測試應該通過正確的輸入來驗證,你會得到預期的輸出。應該存在另一個單元測試來驗證錯誤輸入的正確行爲。對於不同類型的正確或不正確的輸入,這通常會重複,但通常對於不正確輸入的測試比任何測試都多。 不過,沒有規範,你真的沒有太多的單元測試。 通常的問題是缺乏技術規範(規範),告訴你什麼是正確的或不正確的輸入以及在每種情況下應該怎麼做。

除了你敲擊文件系統的事實,你的測試看起來不錯。