本節(jié)深入介紹了unittest的API。
8.1 測(cè)試用例Test cases相關(guān)
unittest.TestCase()類:
用法:class unittest.TestCase(methodName='runTest')
TestCase類的實(shí)例表示unittest中的邏輯測(cè)試單元。該類旨在用作基類,具體測(cè)試由具體子類實(shí)現(xiàn)。TestCase類實(shí)現(xiàn)測(cè)試運(yùn)行器所需的接口,以允許測(cè)試運(yùn)行器驅(qū)動(dòng)測(cè)試,并且實(shí)現(xiàn)測(cè)試代碼可用于檢查和報(bào)告各種故障的方法。
每個(gè)TestCase類的實(shí)例都會(huì)單獨(dú)運(yùn)行一個(gè)基本方法,這個(gè)方法叫methodName。在TestCase的大多數(shù)用法中,既不會(huì)更改methodName,也不會(huì)重寫默認(rèn)的runTest()方法。
3.2版本中的修改:可以在不提供methodName的情況下成功實(shí)例化TestCase。這樣可以更容易地從交互式解釋器中試驗(yàn)TestCase。
TestCase實(shí)例提供了三組方法:一組用來運(yùn)行測(cè)試,一組用來檢查測(cè)試實(shí)現(xiàn)的檢查條件和報(bào)告失敗,還有一組是查詢方法允許收集有關(guān)測(cè)試本身的信息。
第一組方法有:
setUP()
在準(zhǔn)備測(cè)試腳手架時(shí)該方法被調(diào)用。在調(diào)用測(cè)試方法之前立即調(diào)用它;除了AssertionError和SkipTest之外,此方法拋出的任何異常都將被視為錯(cuò)誤而非測(cè)試失敗。默認(rèn)實(shí)現(xiàn)是什么都不做。
tearDown()
調(diào)用測(cè)試方法后立即調(diào)用該方法并記錄結(jié)果。即使測(cè)試方法引發(fā)異常,該方法也會(huì)被調(diào)用,因此子類中的實(shí)現(xiàn)可能需要特別注意檢查內(nèi)部狀態(tài)。由此方法引發(fā)的任何異常(除了AssertionError和SkipTest)都將被視為額外錯(cuò)誤,而非測(cè)試失敗(從而增加報(bào)告錯(cuò)誤的總數(shù))。tearDown()方法只在setUp()方法成功時(shí)才會(huì)被調(diào)用,與測(cè)試方法的成功與否無關(guān)。默認(rèn)實(shí)現(xiàn)是什么都不做。
setUpClass()
一個(gè)在單個(gè)類測(cè)試運(yùn)行之前調(diào)用的類方法。setUpClass()方法在被調(diào)用時(shí)使用類作為唯一參數(shù),并且setUpClass()方法必須被裝飾成classmethod():
@classmethod
def setUpClass(cls):
...
閱讀類和模塊腳手架以獲得更多信息。
新增于3.2
tearDownClass()
一個(gè)在單個(gè)類測(cè)試運(yùn)行之后調(diào)用的類方法。tearDownClass()方法在被調(diào)用時(shí)使用類作為唯一參數(shù),并且tearDownClass()方法必須被裝飾成classmethod():
@classmethod
def tearDownClass(cls):
...
閱讀類和模塊腳手架以獲得更多信息。
新增于3.2
run(result=None)
運(yùn)行測(cè)試,將結(jié)果收集到作為結(jié)果傳遞的TestResult對(duì)象中。如果省略result或者None,則將創(chuàng)建臨時(shí)結(jié)果對(duì)象(通過調(diào)用defaultTestResult()方法)并使用。結(jié)果對(duì)象返回給run()的調(diào)用者。
只需調(diào)用TestCase實(shí)例即可獲得相同效果。
修改于3.3:以前版本的run()不會(huì)返回結(jié)果,也不會(huì)調(diào)用實(shí)例。
skipTest(reason)
在測(cè)試方法或setUp()期間調(diào)用此方法會(huì)跳過當(dāng)前測(cè)試。閱讀跳過測(cè)試和預(yù)期的故障已獲得更多信息。
新增于3.1
subTest(msg=None, **params)
返回一個(gè)執(zhí)行封閉代碼塊作為子測(cè)試的上下文管理器。msg和params是可選的,任何子測(cè)試時(shí)失敗的值都會(huì)顯示,允許你清楚識(shí)別它們。
測(cè)試用例可以包含任意數(shù)量的子測(cè)試聲明,并且它們可以任意嵌套。
閱讀使用子測(cè)試區(qū)分測(cè)試迭代以獲得更多信息。
新增于3.4
debug()
運(yùn)行測(cè)試而不收集結(jié)果。這個(gè)方法允許測(cè)試拋出的異常傳給調(diào)用者,并可用于支持在調(diào)試器下運(yùn)行測(cè)試。
TestCase類提供了幾種斷言方法來檢查和報(bào)告失敗。下表列出了最常用的方法:
| Method | Checks that | New in |
|---|---|---|
| assertEqual(a, b) | a == b | |
| assertNotEqual(a, b) | a != b | |
| assertTrue(x) | bool(x) is True | |
| assertFalse(x) | bool(x) is False | |
| assertIs(a, b) | a is b | 3.1 |
| assertIsNot(a, b) | a is not b | 3.1 |
| assertIsNone(x) | x is None | 3.1 |
| assertIsNotNone(x) | x is not None | 3.1 |
| assertIn(a, b) | a in b | 3.1 |
| assertNotIn(a, b) | a not in b | 3.1 |
| assertIsInstance(a, b) | isinstance(a, b) | 3.2 |
| assertNotIsInstance(a, b) | not isinstance(a, b) | 3.2 |
所有assert方法都接受一個(gè)msg參數(shù)。如果指定該參數(shù),則該參數(shù)將用作失敗時(shí)的錯(cuò)誤消息(另參見longMessage)。請(qǐng)注意,對(duì)于assertRaises()、assertRaisesRegex()、assertWarns()、assertWarnsRegex()這四個(gè)方法,僅在它們用作上下文管理器時(shí)msg關(guān)鍵字參數(shù)才能傳遞給它們。
assertEqual(first, second, msg=None)
測(cè)試first參數(shù)和second參數(shù)是否相等。如果值不相等,則測(cè)試將失敗。
另外,如果first和second是完全相同的類型,并且是list、tuple、dict、set、frozenset、str或是使用addTypeEqualityFunc()注冊(cè)的子類型之一,那么將調(diào)用特定類型的相等函數(shù)以生成更有用的默認(rèn)錯(cuò)誤信息(另參見特定類型的方法列表)。
修改于3.1:增加了特定類型相等函數(shù)的自動(dòng)調(diào)用。
修改于3.2:assertMultiEqual()方法被添加為用于比較字符串的默認(rèn)類型相等函數(shù)。
assertNotEqual(first, second, msg=None)
測(cè)試first參數(shù)和second參數(shù)是否不相等。如果值相等,則測(cè)試將失敗。
assertTrue(expr, msg=None)
assertFalse(expr, msg=None)
測(cè)試expr參數(shù)是真(或假)。
請(qǐng)注意,這相當(dāng)于bool(expr)為真,而不是expr為真(expr為真,使用assertIs(expr, True)實(shí)現(xiàn))。
assertIs(first, second, msg=None)
assertIsNot(first, second, msg=None)
測(cè)試first參數(shù)和second參數(shù)評(píng)定的是同一個(gè)對(duì)象或評(píng)定的不是同一個(gè)對(duì)象。
新增于3.1
assertIsNone(expr, msg=None)
assertIsNotNone(expr, msg=None)
測(cè)試expr參數(shù)是(或不是)None。
新增于3.1
assertIn(first, second, msg=None)
assertNotIn(first, second, msg=None)
測(cè)試first參數(shù)是(或不是)second的子集。
新增于3.1
assertIsInstance(obj, cls, msg=None)
assertNotIsInstance(obj, cls, msg=None)
測(cè)試obj參數(shù)是(或不是)cls的實(shí)例(cls可以是類或類的元祖,由isinstance()提供支持)。要檢查確切的類型,請(qǐng)使用assertIs(type(obj), cls)。
新增于3.2
還可以使用以下方法檢查異常、警告和日志信息的生成:
| Method | Checks that | New in |
|---|---|---|
| assertRaises(exc, fun, *args, **kwds) |
fun(*args, **kwds)拋出exc
|
|
| assertRaisesRegex(exc, r, fun, *args, **kwds) |
fun(*args, **kwds)拋出exc并且信息正則匹配r
|
3.1 |
| assertWarns(warn, fun, *args, **kwds) |
fun(*args, **kwds)拋出warn
|
3.2 |
| assertWarnsRegex(warn, r, fun, *args, **kwds) |
fun(*args, **kwds)拋出warn并且信息正則匹配r
|
3.2 |
| assertLogs(logger, level) | with塊使用最小level在logger記錄日志 |
3.4 |
assertRaises(exception, callable, *args, **kwds)
assertRaises(exception, *, msg=None)
當(dāng)傳遞位置或關(guān)鍵字參數(shù)來調(diào)用callable時(shí),如果這些參數(shù)也傳遞給assertRaises(),那么測(cè)試將會(huì)拋出一個(gè)異常。如果拋出的異常為exception,那么測(cè)試通過,如果是其他異常則為錯(cuò)誤,如果沒有拋出異常則失敗。如果要捕獲一組異常,可以將包含異常類的元祖作為exception傳遞。
如果只給出exception和可能的msg參數(shù),則返回一個(gè)上下文管理器,以便測(cè)試中的代碼可以內(nèi)聯(lián)而不是寫成函數(shù):
with self.assertRaises(SomeException):
do_something()
當(dāng)assertRaises()被當(dāng)成上下文管理器使用時(shí),它接受額外的關(guān)鍵字參數(shù)msg。
當(dāng)assertRaises()被當(dāng)成上下文管理器使用時(shí),它會(huì)將捕獲的異常對(duì)象存儲(chǔ)在它的exception屬性中。如果打算對(duì)拋出的異常進(jìn)行額外的檢查,這點(diǎn)就可能派上用場(chǎng):
with self.assertRaises(SomeException) as cm:
do_something()
the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
修改于3.1:添加了使用assertRaises()作為上下文管理器的功能。
修改于3.2:添加了exception屬性。
修改于3.3:添加了當(dāng)用作上下文管理器時(shí)的msg關(guān)鍵字參數(shù)。
assertRaisesRegex(exception, regex, callable, *args, **kwds)
assertRaisesRegex(exception, regex, *, msg=None)
與assertRaises()類似,但是測(cè)試regex與拋出的異常的字符串表示形式匹配。regex可以是一個(gè)正則表達(dá)式對(duì)象,也可以是一個(gè)包含適合re.search()使用的正則表達(dá)式的字符串。舉個(gè)例子:
self.assertRaisesRegex(ValueError, "invalid literal for .*XYZ' $", int, 'XYZ')
也可以寫成:
with self.assertRaisesRegex(ValueError, 'literal'):
int('XYZ')
新增于3.1:使用assertRaisesRegexp作為名字。
修改于3.2:重命名為assertRaisesRegex()。
修改于3.3:添加了當(dāng)用作上下文管理器時(shí)的msg關(guān)鍵字參數(shù)。
assertWarns(warning, callable, *args, **kwds)
assertWarns(warning, *, msg=None)
測(cè)試當(dāng)調(diào)用callable的位置或關(guān)鍵字參數(shù)也傳遞給assertWarns()時(shí)警告是否被觸發(fā)。如果警告被觸發(fā)則測(cè)試通過,否則測(cè)試失敗。拋出任何異常都是錯(cuò)誤。要捕獲一組警告,可以將包含警告類的元祖作為warning傳遞。
如果只給出warning和可能的msg參數(shù),則返回一個(gè)上下文管理器,以便測(cè)試中的代碼可以內(nèi)聯(lián)而不是寫成函數(shù):
with self.assertWarns(SomeWarning):
do_something()
當(dāng)assertWarns()被當(dāng)成上下文管理器使用時(shí),它接受額外的關(guān)鍵字參數(shù)msg。
當(dāng)assertWarns()被當(dāng)成上下文管理器使用時(shí),它會(huì)將捕獲的警告對(duì)象存儲(chǔ)在它的warning屬性中,并在源文件中觸發(fā)filename和lineno屬性中的警告。如果打算對(duì)捕獲的警告進(jìn)行額外的檢查,這點(diǎn)就可能派上用場(chǎng):
with self.assertWarns(SomeWarning) as cm:
do_something()
self.assertIn('myfile.py', cm.filename)
self.assertEqual(320, cm.lineno)
無論調(diào)用什么警告過濾器,此方法都有效。
新增于3.2。
修改于3.3:添加了當(dāng)用作上下文管理器時(shí)的msg關(guān)鍵字參數(shù)。
assertWarnsRegex(warning, regex, callable, *args, **kwds)
assertWarnsRegex(warning, regex, *, msg=None)
與assertWarns()相似,但是測(cè)試regex與觸發(fā)警告的消息匹配。regex可以是一個(gè)正則表達(dá)式對(duì)象,也可以是一個(gè)包含適合re.search()使用的正則表達(dá)式的字符串。舉個(gè)例子:
self.assertWarnsRegex(DeprecationWarning,
r'legacy_function\(\) is deprecated',
legacy_function, 'XYZ')
也可以寫成:
with self.assertWarnsRegex(RuntimeWarning, 'unsafe frobnicating'):
frobnicate('/etc/passwd')
新增于3.2。
修改于3.3:添加了當(dāng)用作上下文管理器時(shí)的msg關(guān)鍵字參數(shù)。
assertLogs(logger=None, level=None)
一個(gè)用于測(cè)試至少具有給定level的、記錄在logger或其子節(jié)點(diǎn)上的消息的上下文管理器。
如果給出logger,則logger應(yīng)該是logging.Logger對(duì)象或是一個(gè)吉利區(qū)的名稱str。默認(rèn)為根記錄器,它將捕獲所有消息。
如果給出level,則level應(yīng)該是數(shù)字日志記錄級(jí)別或其等效字符串(例如"ERROR"或logging.ERROR)。默認(rèn)為logging.INFO。
如果with模塊中至少有一條消息與logger和level條件匹配,則測(cè)試通過,否則失敗。
上下文管理器返回的對(duì)象是一個(gè)記錄助手,它記錄匹配的日志消息。它有兩個(gè)屬性:
records
一個(gè)匹配日志消息的logging.LogRecord對(duì)象列表。
output
一個(gè)匹配消息格式化輸出的str對(duì)象列表。
舉個(gè)例子:
with self.assertLogs('foo', level='INFO') as cm:
logging.getLogger('foo').info('first message')
logging.getLogger('foo.bar').error('second message')
self.assertEqual(cm.output, ['INFO:foo:first message',
'ERROR:foo.bar:second message'])
新增于3.4。
還有其他方法用于執(zhí)行更具體的檢查,例如:
| Method | Checks that | New in |
|---|---|---|
| assertAlmostEqual(a, b) | round(a-b, 7) == 0 | |
| assertNotAlmostEqual(a, b) | round(a-b, 7) != 0 | |
| assertGreater(a, b) | a > b | 3.1 |
| assertGreaterEqual(a, b) | a >= b | 3.1 |
| assertLess(a, b) | a < b | 3.1 |
| assertLessEqual(a, b) | a <= b | 3.1 |
| assertRegex(s, r) | r.search(s) | 3.2 |
| assertNotRegex(s, r) | not r.search(s) | 3.2 |
| assertCountEqual(a, b) |
a和b具有相同數(shù)字的相同元素,無論它們的順序如何 |
3.2 |
assertAlmostEqual(first, second, places=7, msg=None, delta=None)
assertNotAlmostEqual(first, second, places=7, msg=None, delta=None)
通過計(jì)算差值,舍入到給定的小數(shù)位數(shù)(默認(rèn)為7),然后將差值與0進(jìn)行比較,測(cè)試 first和second參數(shù)是否近似相等(或不相等)。請(qǐng)注意,這些方法將值四舍五入到給定的小數(shù)位數(shù)(和round()函數(shù)一樣),而不是有效數(shù)字。
如果提供delta參數(shù)而不提供places參數(shù),則first和second的差值必須小于或等于(或大于)delta。
同時(shí)提供delta參數(shù)和places參數(shù)將會(huì)拋出一個(gè)TypeError異常。
修改于3.2:assertAlmostEqual()自動(dòng)認(rèn)為幾乎相等的對(duì)象的比較結(jié)果是相等的。assertNotAlmostEqual()自動(dòng)失敗如果兩個(gè)對(duì)象比較結(jié)果相等。添加了delta關(guān)鍵字參數(shù)。
assertGreater(first, second, msg=None)
assertGreaterEqual(first, second, msg=None)
assertLess(first, second, msg=None)
assertLessEqual(first, second, msg=None)
根據(jù)方法名稱,分別測(cè)試first是不是>、>=、<、<=second。如果不是,測(cè)試將失?。?/p>
>>> self.assertGreaterEqual(3, 4)
AssertionError: "3" unexpectedly not greater than or equal to "4"
新增于3.1。
assertRegex(text, regex, msg=None)
assertNotRegex(text, regex, msg=None)
測(cè)試一個(gè)regex搜索匹配(或不匹配)text。如果失敗,錯(cuò)誤消息將包含模式和text(或是模式和text中不匹配的部分)。regex可以是正則表達(dá)式,也可以是包含適合re.search()使用的正則表達(dá)式的字符串。
新增于3.1:使用assertRegexpMatches作為名字。
修改于3.2:重命名為assertRegex()。
新增于3.2:assertNotRegex()。
新增于3.5:名字assertNotRegexpMatches是assertNotRegex()的棄用別名。
assertCountEqual(first, second, msg=None)
測(cè)試first序列是否包含與second中相同的元素,不管元素的順序如何。如果沒有,將會(huì)生成列出序列之間差異的錯(cuò)誤消息。
比較first和second時(shí),不會(huì)忽略重復(fù)的元素。assertCountEqual()將驗(yàn)證每個(gè)元素在兩個(gè)序列中是否具有相同的計(jì)數(shù)。相當(dāng)于:assertEqual(Counter(list(first)), Counter(list(second))),但assertCountEqual()也適用于不可哈希的對(duì)象列表。
新增于3.2。
assertEqual()方法將調(diào)度對(duì)于不同類型特定的方法,相同類型的對(duì)象的相等性。這些方法已經(jīng)針對(duì)大多數(shù)內(nèi)置類型實(shí)現(xiàn),但也可以使用addTypeEqualityFunc()注冊(cè)新方法:
addTypeEqualityFunc(typeobj, function)
注冊(cè)assertEqual()調(diào)用的特定于類型的方法,以檢查完全相同的typeobj(非子類)的兩個(gè)對(duì)象是否相等。函數(shù)必須采用兩個(gè)位置參數(shù)和第三個(gè)msg=None關(guān)鍵字參數(shù),就像assertEqual()一樣。當(dāng)檢測(cè)到前兩個(gè)參數(shù)不等時(shí)拋出self.failureException(msg),該異??赡芴峁┯杏玫男畔⒉⒃阱e(cuò)誤消息中詳細(xì)解釋不等式。
新增于3.1。
assertEqual()方法自動(dòng)使用的特定于類型的方法列表總結(jié)在下表中。請(qǐng)注意,通常不必直接調(diào)用這些方法。
| Method | Used to compare | New in |
|---|---|---|
| assertMultiLineEqual(a, b) | strings | 3.1 |
| assertSequenceEqual(a, b) | sequences | 3.1 |
| assertListEqual(a, b) | lists | 3.1 |
| assertTupleEqual(a, b) | tuples | 3.1 |
| assertSetEqual(a, b) | sets or frozensets | 3.1 |
| assertDictEqual(a, b) | dicts | 3.1 |
assertMultiLineEqual(first, second, msg=None)
測(cè)試多行字符串first等于字符串second。當(dāng)不等時(shí),在錯(cuò)誤信息中高亮顯示兩個(gè)字符串的差異。在使用assertEqual()比較字符串時(shí),默認(rèn)使用此方法。
新增于3.1。
assertSequenceEqual(first, second, msg=None, seq_type=None)
測(cè)試兩個(gè)序列是否相等。如果提供了seq_type,則first和second都必須是seq_type的實(shí)例,否則會(huì)拋出失敗。如果序列不同,則在錯(cuò)誤信息中顯示兩者之間的差異。
這個(gè)方法不直接被assertEqual()調(diào)用,但是在實(shí)現(xiàn)assertListEqual()和assertTupleEqual()時(shí)被調(diào)用。
新增于3.1。
assertListEqual(first, second, msg=None)
assertTupleEqual(first, second, msg=None)
測(cè)試兩個(gè)列表或元組是否相等。如果不相等,則構(gòu)造一條錯(cuò)誤消息,僅顯示兩者之間的差異。如果其中一個(gè)參數(shù)的類型錯(cuò)誤,也會(huì)引發(fā)錯(cuò)誤。在使用assertEqual()對(duì)列表或元組進(jìn)行比較時(shí),默認(rèn)使用這兩個(gè)方法。
新增于3.1。
assertSetEqual(first, second, msg=None)
測(cè)試兩個(gè)set是否相等。如果不相等,則構(gòu)造一個(gè)錯(cuò)誤消息,列出這兩個(gè)set之間的差異。在使用assertEuqal()對(duì)set和frozenset進(jìn)行比較時(shí),默認(rèn)使用此方法。
如果first或second中的任何一個(gè)沒有set.difference()方法,那么就會(huì)失敗。
新增于3.1。
assertDictEqual(first, second, msg=None)
測(cè)試兩個(gè)字典是否相等。如果不是,則構(gòu)造一條錯(cuò)誤消息,顯示字典中的差異。在使用assertEqual()比較字典時(shí),默認(rèn)使用此方法。
新增于3.1。
最后,TestCase類提供了下列方法和屬性:
fail(msg=None)
無條件地標(biāo)志測(cè)試失敗,錯(cuò)誤信息為msg或None。
failureException
這個(gè)類屬性提供測(cè)試方法拋出的異常。如果測(cè)試框架需要使用專門的異常,比如攜帶額外信息的異常,那么就需要將異常子類化,以便與框架表現(xiàn)一致。該屬性的初始值為AssertionError。
longMessage
這個(gè)類屬性決定將自定義失敗消息作為msg參數(shù)傳遞給assertXYY并且assertXYY失敗時(shí)發(fā)生的情況。默認(rèn)值為True。默認(rèn)情況下,自定義消息將附加到標(biāo)準(zhǔn)故障消息的末尾。設(shè)置為False時(shí),自定義消息將替換標(biāo)準(zhǔn)消息。
這個(gè)類設(shè)置可以在單獨(dú)的測(cè)試方法中重寫,只要在調(diào)用assert方法之前將實(shí)例屬性self.longMessage設(shè)定為True或False。
這個(gè)類屬性在每個(gè)測(cè)試被調(diào)用時(shí)重置。
新增于3.1。
maxDiff
這屬性控制assert方法在失敗時(shí)輸出的差異的最大長(zhǎng)度。默認(rèn)是80*8個(gè)字符。受這個(gè)屬性影響的斷言方法是assertSequenceEqual()(包含所有使用它的序列比較方法)、assertDictEqual()和assertMultiLineEqual()。
設(shè)置maxDiff為None意味著對(duì)差異信息沒有最大長(zhǎng)度限制。
新增于3.2。
測(cè)試框架可以使用下列方法來收集有關(guān)測(cè)試的信息:
countTestCases()
返回這個(gè)測(cè)試對(duì)象中展示的測(cè)試數(shù)量。針對(duì)TestCase實(shí)例,測(cè)試數(shù)量始終為1.
defaultTestResult()
返回應(yīng)該用于這個(gè)測(cè)試實(shí)例類的測(cè)試結(jié)果類實(shí)例(如果沒有為run()方法提供其他結(jié)果實(shí)例)。
針對(duì)TestCase實(shí)例,返回的將會(huì)總是一個(gè)TestResult實(shí)例。TestCase的子類必須重寫該方法。
id()
返回標(biāo)識(shí)特定測(cè)試用例的字符串。通常是測(cè)試方法的全名,包括模塊名和類名。
shortDescription()
返回測(cè)試的描述,如果沒有提供描述的話就返回None。這個(gè)方法默認(rèn)實(shí)現(xiàn)返回測(cè)試方法的文檔字符串第一行(如果有的話)或者None。
修改于3.1:在3.1中,即使存在文檔字符串,也會(huì)將測(cè)試名稱添加到簡(jiǎn)短描述中。這導(dǎo)致了unittest擴(kuò)展的兼容性問題,并且在Python 3.2中,添加測(cè)試名稱已經(jīng)被移到了TextTestResult中。
addCleanup(function, *args, **kwargs)
添加一個(gè)在tearDown()之后調(diào)用的函數(shù)來清理測(cè)試期間使用的資源。函數(shù)將按添加順序的相反順序調(diào)用(后進(jìn)先出)。在添加函數(shù)時(shí),會(huì)使用傳入addCleanup()的任何參數(shù)和關(guān)鍵字參數(shù)調(diào)用這些函數(shù)。
如果setUp()失敗了,意味著tearDown()不會(huì)被調(diào)用,但是任何已經(jīng)添加的清理函數(shù)仍然會(huì)被調(diào)用。
新增于3.1。
doCleanups()
如果setUp()拋出異常,則在tearDown()或setUp()之后無條件調(diào)用此方法。
這個(gè)方法負(fù)責(zé)調(diào)用addCleanup()添加的所有清理函數(shù)。如果你需要在tearDown()之前調(diào)用清理函數(shù),那么你可以自行調(diào)用doCleanups()。
doCleanups()每次從清理函數(shù)的棧中彈出方法,因此可以隨時(shí)調(diào)用它。
新增于3.1。
unittest.FunctionTestCase()類:
用法:class unittest.FunctionTestCase(testFunc, setUp=None, tearDown=None, description=None)
該類實(shí)現(xiàn)了TestCase接口的一部分,該部分允許測(cè)試運(yùn)行器驅(qū)動(dòng)測(cè)試,但不提供允許測(cè)試代碼檢查和報(bào)告錯(cuò)誤的方法。這用于使用傳統(tǒng)測(cè)試代碼創(chuàng)建測(cè)試用例,允許將其集成到基于unittest的測(cè)試框架中。
8.1.1 不推薦使用的別名
因?yàn)闅v史原因,一些TestCase的方法有一個(gè)或多個(gè)已經(jīng)棄用的別名。下面這張表列出了正確的名稱已經(jīng)它們已經(jīng)棄用的別名:
| Method Name | Deprecated alias | Deprecated alias |
|---|---|---|
| assertEqual() | failUnlessEqual | assertEquals |
| assertNotEqual() | failIfEqual | assertNotEquals |
| assertTrue() | failUnless | assert |
| assertFalse() | failIf | |
| assertRaises() | failUnlessRaises | |
| assertAlmostEqual() | failUnlessAlmostEqual | assertAlmostEquals |
| assertNotAlmostEqual() | failIfAlmostEqual | assertNotAlmostEquals |
| assertRegex() | assertRegexpMatches | |
| assertNotRegex() | assertNotRegexpMatches | |
| assertRaisesRegex() | assertRaisesRegexp |
從3.1開始棄用的:第二列以fail開頭的別名。
從3.2開始棄用的:第三列以assert開頭的別名。
從3.2開始棄用的:assertRegexpMatches和assertRaisesRegexp已經(jīng)被重命名成assertRegex()和assertRaisesRegex()。
從3.5開始棄用的:assertNotRegexpMatches名稱已經(jīng)被包含于assertNotRegex()中。
8.2 分組測(cè)試
unittest.TestSuite()類:
用法:class unittest.TestSuite(tests=())
此類表示各個(gè)測(cè)試用例和測(cè)試套件的集合。該類提供了測(cè)試運(yùn)行器所需的接口,以允許它像任何其他測(cè)試用例一樣運(yùn)行。運(yùn)行一個(gè)TestSuite實(shí)例與運(yùn)行迭代套件相同,可以單獨(dú)運(yùn)行每個(gè)測(cè)試。
如果要給定tests,那么它必須是一個(gè)最初將用于構(gòu)建套件的可迭代的單獨(dú)測(cè)試用例或其他測(cè)試套件。提供了以便稍后將測(cè)試用例和套件添加到集合中的方法。
TestSuite對(duì)象的行為與TestCase對(duì)象非常相似,除了TestSuite對(duì)象沒有實(shí)際實(shí)現(xiàn)一個(gè)測(cè)試。TestSuite對(duì)象用于將測(cè)試聚合到應(yīng)該一起運(yùn)行的測(cè)試組中??梢允褂靡恍┢渌椒ㄏ?code>TestSuite實(shí)例添加測(cè)試:
addTest(test)
添加一個(gè)TestCase或TestSuite到測(cè)試套件中。
addTests(tests)
添加可迭代的TestCase和TestSuite實(shí)例中的所有測(cè)試到測(cè)試套件中。
這相當(dāng)于迭代測(cè)試,為每個(gè)元素調(diào)用addTest()。
TestSuite與TestCase共享以下方法:
run(result)
運(yùn)行與此套件關(guān)聯(lián)的測(cè)試,收集結(jié)果作為result傳遞給測(cè)試結(jié)果對(duì)象。
請(qǐng)注意與TestCase.run()方法不同,TestSuite.run()需要傳入結(jié)果對(duì)象。
debug()
運(yùn)行與此套件關(guān)聯(lián)的測(cè)試而不收集結(jié)果。這允許測(cè)試拋出的異常傳播到調(diào)用者,并可用于支持調(diào)試器下運(yùn)行測(cè)試。
countTestCases()
返回這個(gè)測(cè)試對(duì)象中展示的測(cè)試數(shù)量,包括所有單獨(dú)的測(cè)試和子套件。
_ _ iter _ _()
使用TestSuites分組的測(cè)試總是通過迭代訪問。子類可以通過重寫__iter__()來惰性地提供測(cè)試。請(qǐng)注意,這個(gè)方法可能在單個(gè)套件上調(diào)用多次(例如當(dāng)統(tǒng)計(jì)測(cè)試或比較相等性時(shí)),因此在TestSuite.run()之前重復(fù)迭代返回的測(cè)試對(duì)于每次調(diào)用迭代必須相同。在TestSuite.run()之后,調(diào)用者不應(yīng)該依賴此方法返回的測(cè)試,除非調(diào)用者使用重寫TestSuite._removeTestAtIndex()的子類來保留測(cè)試引用。
修改于3.2:在早期版本中,TestSuite直接訪問測(cè)試而不是通過迭代訪問,因此重寫__iter__()不足以提供測(cè)試。
修改于3.4:在早期版本中,TestSuite在TestSuite.run()之后保存了對(duì)每個(gè)TestCase的引用。子類可以通過重寫TestSuite._removeTestAtIndex()來恢復(fù)該行為。
在TestSuite對(duì)象的典型用法中,run()方法由測(cè)試運(yùn)行器調(diào)用,而不是最終用戶測(cè)試工具調(diào)用。
8.3 加載和運(yùn)行測(cè)試
unittest.TestLoader類:
用法:class unittest.TestLoader
TestLoader類用于從類和模塊中創(chuàng)建測(cè)試套件。通常,不需要?jiǎng)?chuàng)建此類的實(shí)例;unittest模塊提供了一個(gè)可以共享的實(shí)例unittest.defaultTestLoader。但是,使用子類或?qū)嵗梢宰远x一些可配置的屬性。
TestLoader對(duì)象有下列屬性:
errors
加載測(cè)試時(shí)遇到的非致命錯(cuò)誤列表。在任何時(shí)候都不會(huì)被加載程序重置。致命錯(cuò)誤由相關(guān)的方法發(fā)出信號(hào),該方法向調(diào)用者拋出異常。非致命錯(cuò)誤由綜合測(cè)試指示并將在測(cè)試運(yùn)行時(shí)拋出初始錯(cuò)誤。
新增于3.5。
TestLoader對(duì)象有下列方法:
LoadTestsFromTestCase(testCaseClass)
返回TestCase派生的testCaseClass中包含的所有測(cè)試用例的套件。
為每個(gè)以getTestCaseNames()命名的方法創(chuàng)建測(cè)試用例實(shí)例。默認(rèn)情況下,這些方法名字以test開頭。如果getTestCaseNames()沒有返回任何方法,但是實(shí)現(xiàn)了runTest()方法,則會(huì)為該方法創(chuàng)建一個(gè)單獨(dú)的測(cè)試用例。
loadTestsFromModule(module, pattern=None)
從所有測(cè)試用例中返回一個(gè)包含給定模塊的套件。這個(gè)方法從module中搜索從TestCase派生的類,并為該類定義的每個(gè)測(cè)試方法創(chuàng)建該類的實(shí)例。
注意:雖然使用TestCase派生類的層次結(jié)構(gòu)可以方便地共享腳手架和幫助函數(shù),但是在不打算直接實(shí)例化的基類上定義測(cè)試方法并不能很好地使用此方法。但是當(dāng)腳手架不同并且定義在子類中時(shí),這個(gè)方法很有用。
如果一個(gè)模塊提供了一個(gè)load_tests功能函數(shù),那么將會(huì)在加載測(cè)試時(shí)調(diào)用該函數(shù)。這允許模塊自定義測(cè)試加載。這是load_tests協(xié)議。pattern參數(shù)作為load_tests的第三個(gè)參數(shù)傳遞。
loadTestsFromName(name, module=None)
根據(jù)給出的字符串說明符,返回包含所有測(cè)試用例的套件。
說明符name是一個(gè)點(diǎn)名稱,這個(gè)點(diǎn)名稱可以解析模塊、測(cè)試用例類、測(cè)試用例類中的測(cè)試方法、TestSuite實(shí)例、一個(gè)返回TestCase或TestSuite實(shí)例的可調(diào)用對(duì)象。這些檢查按此處列出的順序進(jìn)行;也就是說,一個(gè)可能的測(cè)試用例類的方法將作為“測(cè)試用例類中的測(cè)試方法”而不是“可調(diào)用對(duì)象”被選中。
舉個(gè)例子,有一個(gè)使用了三種測(cè)試方法(test_one(),test_two(),test_three())的TestCase派生類SampleTestCase,如果你有一個(gè)模塊SampleTests包含了這個(gè)類,那么說明符'SampleTests.SampleTestCase.test_two'會(huì)導(dǎo)致這個(gè)方法返回一個(gè)運(yùn)行所有三種測(cè)試方法的套件。說明符可以引用尚未導(dǎo)入的模塊和包;它們將作為函數(shù)副作用side-effect導(dǎo)入。
該方法可選地解析相對(duì)于給定module的name。
修改于3.5:如果在遍歷name時(shí)發(fā)生ImportError或AttributeError錯(cuò)誤,則將返回在運(yùn)行時(shí)引發(fā)該錯(cuò)誤的綜合測(cè)試。這些錯(cuò)誤包含在self.errors累積的錯(cuò)誤中。
loadTestsFromNames(names, module=None)
與`loadTestsFromName()