單元測(cè)試的基本構(gòu)建塊是測(cè)試用例 — 必須設(shè)置和檢查其正確性的單個(gè)方案。在 ?unittest
?中,測(cè)試用例由 unittest.TestCase 實(shí)例表示。要?jiǎng)?chuàng)建自己的測(cè)試用例,您必須編寫(xiě) TestCase 的子類(lèi)或使用 FunctionTestCase。
TestCase 實(shí)例的測(cè)試代碼應(yīng)該完全獨(dú)立,這樣它既可以單獨(dú)運(yùn)行,也可以與任意數(shù)量的其他測(cè)試用例任意組合運(yùn)行。
最簡(jiǎn)單的 TestCase 子類(lèi)將簡(jiǎn)單地實(shí)現(xiàn)一個(gè)測(cè)試方法(即名稱(chēng)以?test
?) 開(kāi)頭的方法,以便執(zhí)行特定的測(cè)試代碼:
import unittest
class DefaultWidgetSizeTestCase(unittest.TestCase):
def test_default_widget_size(self):
widget = Widget('The widget')
self.assertEqual(widget.size(), (50, 50))
請(qǐng)注意,為了測(cè)試某些內(nèi)容,我們使用 TestCase 基類(lèi)提供的 ?assert*()
?方法之一。如果測(cè)試失敗,將引發(fā)異常并帶有解釋性消息,并且 ?unittest
?會(huì)將測(cè)試用例標(biāo)識(shí)為失敗。任何其他異常都將被視為錯(cuò)誤。
測(cè)試可能很多,并且它們的設(shè)置可能是重復(fù)的。幸運(yùn)的是,我們可以通過(guò)實(shí)現(xiàn)一個(gè)名為 setUp() 的方法來(lái)分解設(shè)置代碼,測(cè)試框架將為我們運(yùn)行的每個(gè)測(cè)試自動(dòng)調(diào)用該方法:
import unittest
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget('The widget')
def test_default_widget_size(self):
self.assertEqual(self.widget.size(), (50,50),
'incorrect default size')
def test_widget_resize(self):
self.widget.resize(100,150)
self.assertEqual(self.widget.size(), (100,150),
'wrong size after resize')
注意
各種測(cè)試的運(yùn)行順序是通過(guò)相對(duì)于字符串的內(nèi)置排序?qū)y(cè)試方法名稱(chēng)進(jìn)行排序來(lái)確定的。
如果 setUp() 方法在測(cè)試運(yùn)行時(shí)引發(fā)異常,框架將認(rèn)為測(cè)試已遭受錯(cuò)誤,并且不會(huì)執(zhí)行測(cè)試方法。
類(lèi)似地,我們可以提供一個(gè) tearDown() 方法,該方法在測(cè)試方法運(yùn)行后進(jìn)行整理:
import unittest
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget('The widget')
def tearDown(self):
self.widget.dispose()
如果 setUp() 成功,則無(wú)論測(cè)試方法是否成功,都將運(yùn)行 tearDown()。
這種用于測(cè)試代碼的工作環(huán)境稱(chēng)為測(cè)試夾具。創(chuàng)建一個(gè)新的 TestCase 實(shí)例作為用于執(zhí)行每個(gè)單獨(dú)的測(cè)試方法的唯一測(cè)試夾具。因此每次測(cè)試都會(huì)調(diào)用一次 setUp()、tearDown() 和 __init__()。
建議您使用 TestCase 實(shí)現(xiàn),根據(jù)測(cè)試的功能將測(cè)試組合在一起。unittest為此提供了一種機(jī)制:測(cè)試套件,由unittest的TestSuite類(lèi)表示。在大多數(shù)情況下,調(diào)用unittest.main()將做正確的事情,并為您收集所有模塊的測(cè)試用例并執(zhí)行它們。
但是,如果要自定義測(cè)試套件的構(gòu)建,可以自己操作:
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase('test_default_widget_size'))
suite.addTest(WidgetTestCase('test_widget_resize'))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
您可以將測(cè)試用例和測(cè)試套件的定義與它們要測(cè)試的代碼(例如 ?widget.py
?)放在相同的模塊中,但是將測(cè)試代碼放在單獨(dú)的模塊中有幾個(gè)優(yōu)點(diǎn),例如 ?test_widget.py
? :
測(cè)試模塊可以從命令行獨(dú)立運(yùn)行。
測(cè)試代碼可以更容易地與附帶的代碼分開(kāi)。
更多建議: