2017-02-17 92 views
1

這是我第一次使用Python的單元測試在學校進行任務。我基本上有一個Circle對象,我使用pyunit來確保數據正確存儲。Python單元測試計數測試的次數

我注意到Python只將方法的數量作爲測試用例進行計數,而不是斷言語句的數量。

例如,我想測試這些方法是否正常工作,儘管有4個斷言語句,但Python僅將以下內容計爲2個測試。它真的讓我感到不安,就像Java的JUnit一樣,它會計數斷言語句的數量。

def test_xcrd(self): 
    self.assertTrue(self.point.xcrd() == 1) 
    self.assertFalse(self.point.xcrd() == 5) 

def test_ycrd(self): 
    self.assertTrue(self.point.ycrd() == 2) 
    self.assertFalse(self.point.ycrd() == 10) 

python中的「規範」是什麼?每個方法是否應該只有一個斷言聲明?

+1

「與Java的JUnit一樣,它會計算斷言語句的數量,而不是」 - 什麼?從何時起? – user2357112

+0

在過去的經驗中,只要我有@Test我想測試的上述方法,相應方法中的所有斷言語句都會顯示在Eclipse的JUnit Testing面板中。例如,一個包含4個以Java編寫的斷言語句的方法 - 全部四個斷言將在Eclipse中顯示。 pyunit用Python編寫的這些相同的斷言,說「Ran 1測試0.001秒,好吧。」 –

+1

'pyunit'是第三方測試模塊,它與標準庫中的CPython自帶的'unittest'模塊不同。如果你使用'unittest',那麼你應該編輯文本來刪除'pyunit'和'pyunit'標籤。如果您發佈了MCVE https://stackoverflow.com/help/mcve,那麼您使用的是哪個模塊就沒有問題。 –

回答

2

Python的unittest軟件包允許您使用單獨的方法構建單元測試,就像您注意到的一樣。如果您想測試非常密切相關的事物並且不需要單獨的單元測試,這很有用。

unittest測試通過子類別unittest.Test開始,然後向其中添加方法。因此,您可以在不同的單元測試之間添加多個圖層分隔,這些圖層之間的關聯更少。

Python Docs一個例子說明了什麼被認爲是對Python的單元測試最佳實踐:

import unittest 

class TestStringMethods(unittest.TestCase): 

    def test_upper(self): 
     self.assertEqual('foo'.upper(), 'FOO') 

    def test_isupper(self): 
     self.assertTrue('FOO'.isupper()) 
     self.assertFalse('Foo'.isupper()) 

    def test_split(self): 
     s = 'hello world' 
     self.assertEqual(s.split(), ['hello', 'world']) 
     # check that s.split fails when the separator is not a string 
     with self.assertRaises(TypeError): 
      s.split(2) 

if __name__ == '__main__': 
    unittest.main() 

有許多的東西,你可以在這裏看到:

  1. 的三種方法TestStringMethods是獨立的單元測試。
  2. test_isuppertest_split都包含兩個斷言,因爲它們密切相關。爲test_isupper中的兩個斷言添加單獨的測試會增加代碼的膨脹量,並且可能導致非常奇怪的問題。

例如,如果str.isupper()會以奇怪的方式破壞,則覆蓋該單一函數的單個單元測試將會中斷。但是,如果"FOO""Foo"的兩個測試是分開的,則一個測試可能通過,另一個測試失敗。因此,測試單個函數的功能最好保存在具有幾個斷言的單個單元測試中。

這同樣適用於test_split方法;檢查str.split()是否正常工作並檢查它是否產生TypeError密切相關,因此最好在代碼中保持密切相關。

所以,回到你的問題:每個方法都可以(有時應該)多於一個斷言,因爲它導致更簡單,更清晰的代碼,並且更少混淆。引用「Python的禪」(通過在python shell中運行import this找到):「簡單勝於複雜」。因此,通過用單一方法分組類似的斷言,讓你的單元測試變得簡單和結構化。

0

你問題的答案'''python中的「規範」是什麼?每個方法應該只有一個斷言聲明?'''是「否」。有些人可能會說'是',但包括我在內的CPython核心開發人員經常在測試方法中使用多個斷言。查看Lib/test中的test_xyz文件(如果您的安裝包含該目錄)。

確實,一種方法應該測試一個單位甚至一個單位的一個行爲。