2012-01-11 24 views
4

我即將開始我的第三個中型項目,並希望(我承認我的生活中第一次)開始使用unittests。 雖然我不知道使用哪種方法,unitests或doctests。 哪種方法最有效,或者初學者應該選擇哪種方法來實現? 謝謝Django - Unitest還是Doctest?

回答

9

我碰巧喜歡單元測試,但都是優秀和發達的測試方法,並且都得到了Django的很好支持(詳情請參見here)。總之,有一些關鍵的優點和缺點每個:

單元測試的

優點

  • unittests可以很容易地創建更復雜的測試。如果您有涉及調用多個輔助函數,迭代和其他分析的測試,則doctests可能會受到限制。另一方面,另一方面,它只是編寫Python代碼 - 任何你可以在Python中執行的操作都可以輕鬆完成。把這個代碼(單元測試我曾經寫過的修改版本):

    def basic_tests(self, cacheclass, outer=10, inner=100, hit_rate=None): 
        c = cacheclass(lambda x: x + 1) 
        for n in xrange(outer): 
         for i in xrange(inner): 
          self.assertEqual(c(i), i + 1) 
        if hit_rate != None: 
         self.assertEqual(c.hit_rate(), hit_rate) 
    
    def test_single_cache(self): 
        self.basic_tests(SingleCache, outer=10, inner=100, hit_rate=0) 
        sc = SingleCache(lambda x: x + 1) 
        for input in [0, 1, 2, 2, 2, 2, 1, 1, 0, 0]: 
         self.assertEqual(sc(input), input + 1) 
        self.assertEqual(sc.hit_rate(), .5) 
    

    我用basic_tests方法運行在一個類中的一些測試,然後內運行斷言for循環。有些方法可以在文檔測試中做到這一點,但它們需要大量的思考 - 文檔測試最好是檢查具體的個人對函數的調用是否返回應該返回的值。 (這是內Django的,它具有神奇的工具進行單元測試尤其如此(見django.test.client)。

  • 文檔測試可以弄亂你的代碼。當我在寫一個類或方法,我把儘可能多的文檔成我需要明確說明該方法的用法,但如果您的文檔字符串長度超過20行,那麼您最終可能會在代碼中擁有儘可能多的文檔,從而增加了閱讀和編輯的難度它(Python作爲編程語言我最喜歡的一件事是它的緊湊性)

Pro文檔字符串

  • 你的測試s的特別的類和方法有關。這意味着如果測試失敗,您立即知道哪個類和方法失敗。您還可以使用工具來確定您的班級中的測試覆蓋範圍。 (當然,如果你想測試覆蓋你的代碼的許多不同部分,這也可以是限制性的)。

  • 您的測試緊挨着代碼,這意味着它們更容易保持同步。當我對某個類或方法進行更改時,我經常忘記對測試用例進行相應的更改(當然,當我運行它們時,很快會提醒我)。在您的方法聲明和代碼旁邊放置文檔測試可以輕鬆實現。

  • 測試作爲一種文檔。查看代碼的人可以預先包含如何調用和使用每種方法的示例。

結論:我當然喜歡單元測試,但對於要麼被做出了很大的情況下。

+2

值得注意的是,Django本身已經將所有測試都轉換爲Unittests。 – Wogan 2012-01-11 08:14:51

+0

確實信息量大。當然,這並不會改變它被Django很好支持的事實。 – 2012-01-11 08:16:43

+0

非常感謝David!另一件事,是有可能運行簡單函數的doctests和複雜的單元測試嗎?或者我應該選擇一個並堅持下去。 – thyagx 2012-01-11 17:41:00