[英]Python unittest counting the number of tests
這是我第一次使用Python的單元測試在學校進行作業。 我基本上有一個Circle對象,在這里我使用pyunit來確保數據正確存儲。
我注意到,Python僅將方法的數量視為測試用例,而不是assert語句的數量。
例如,我想測試方法是否正常工作,盡管有4條assert語句,Python卻僅將以下內容計為2次測試。 確實讓我措手不及,因為使用Java的JUnit,它將改為計算assert語句的數量。
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中的“規范”是什么? 每個方法應該只有一個assert語句嗎?
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
是密切相關的,因此最好在代碼中將它們保持在一起。
因此,回到您的問題:每個方法可以(有時應該)有多個斷言,因為它可以導致代碼更簡單明了,並且混亂更少。 引用“ Zen of Python”(通過在Python shell中運行import this
找到import this
):“簡單勝於復雜”。 因此,通過在一個方法中將相似的斷言分組,可以使單元測試變得簡單和結構化。
您的問題的答案'''python中的“規范”是什么? 每個方法應該只有一個assert語句嗎?'''是“ No”。 有人可能會說“是”,但是包括我在內的CPython核心開發人員通常在測試方法中使用多個斷言。 查看Lib/test
中的test_xyz
文件(如果您的安裝包括該目錄)。
的確,一種方法應該測試一個單元甚至一個單元的一種行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.