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()
有許多的東西,你可以在這裏看到:
- 的三種方法
TestStringMethods
是獨立的單元測試。
test_isupper
和test_split
都包含兩個斷言,因爲它們密切相關。爲test_isupper
中的兩個斷言添加單獨的測試會增加代碼的膨脹量,並且可能導致非常奇怪的問題。
例如,如果str.isupper()
會以奇怪的方式破壞,則覆蓋該單一函數的單個單元測試將會中斷。但是,如果"FOO"
和"Foo"
的兩個測試是分開的,則一個測試可能通過,另一個測試失敗。因此,測試單個函數的功能最好保存在具有幾個斷言的單個單元測試中。
這同樣適用於test_split
方法;檢查str.split()
是否正常工作並檢查它是否產生TypeError
密切相關,因此最好在代碼中保持密切相關。
所以,回到你的問題:每個方法都可以(有時應該)多於一個斷言,因爲它導致更簡單,更清晰的代碼,並且更少混淆。引用「Python的禪」(通過在python shell中運行import this
找到):「簡單勝於複雜」。因此,通過用單一方法分組類似的斷言,讓你的單元測試變得簡單和結構化。
「與Java的JUnit一樣,它會計算斷言語句的數量,而不是」 - 什麼?從何時起? – user2357112
在過去的經驗中,只要我有@Test我想測試的上述方法,相應方法中的所有斷言語句都會顯示在Eclipse的JUnit Testing面板中。例如,一個包含4個以Java編寫的斷言語句的方法 - 全部四個斷言將在Eclipse中顯示。 pyunit用Python編寫的這些相同的斷言,說「Ran 1測試0.001秒,好吧。」 –
'pyunit'是第三方測試模塊,它與標準庫中的CPython自帶的'unittest'模塊不同。如果你使用'unittest',那麼你應該編輯文本來刪除'pyunit'和'pyunit'標籤。如果您發佈了MCVE https://stackoverflow.com/help/mcve,那麼您使用的是哪個模塊就沒有問題。 –