8.類和函數(shù)

本節(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)用它;除了AssertionErrorSkipTest之外,此方法拋出的任何異常都將被視為錯(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ā)的任何異常(除了AssertionErrorSkipTest)都將被視為額外錯(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è)試的上下文管理器。msgparams是可選的,任何子測(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è)試將失敗。
另外,如果firstsecond是完全相同的類型,并且是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塊使用最小levellogger記錄日志 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ā)filenamelineno屬性中的警告。如果打算對(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模塊中至少有一條消息與loggerlevel條件匹配,則測(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) ab具有相同數(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è)試 firstsecond參數(shù)是否近似相等(或不相等)。請(qǐng)注意,這些方法將值四舍五入到給定的小數(shù)位數(shù)(和round()函數(shù)一樣),而不是有效數(shù)字。
如果提供delta參數(shù)而不提供places參數(shù),則firstsecond的差值必須小于或等于(或大于)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:名字assertNotRegexpMatchesassertNotRegex()的棄用別名。

assertCountEqual(first, second, msg=None)
測(cè)試first序列是否包含與second中相同的元素,不管元素的順序如何。如果沒有,將會(huì)生成列出序列之間差異的錯(cuò)誤消息。
比較firstsecond時(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,則firstsecond都必須是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)使用此方法。
如果firstsecond中的任何一個(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ò)誤信息為msgNone。

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è)置maxDiffNone意味著對(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開始棄用的:assertRegexpMatchesassertRaisesRegexp已經(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è)TestCaseTestSuite到測(cè)試套件中。
addTests(tests)
添加可迭代的TestCaseTestSuite實(shí)例中的所有測(cè)試到測(cè)試套件中。
這相當(dāng)于迭代測(cè)試,為每個(gè)元素調(diào)用addTest()。

TestSuiteTestCase共享以下方法:
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:在早期版本中,TestSuiteTestSuite.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ì)于給定modulename。
修改于3.5:如果在遍歷name時(shí)發(fā)生ImportErrorAttributeError錯(cuò)誤,則將返回在運(yùn)行時(shí)引發(fā)該錯(cuò)誤的綜合測(cè)試。這些錯(cuò)誤包含在self.errors累積的錯(cuò)誤中。

loadTestsFromNames(names, module=None)
與`loadTestsFromName()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容