TestCase類

2022-08-04 15:35 更新

class unittest.TestCase(methodName='runTest')

?TestCase?類的實(shí)例代表?unittest?體系中最小的可測(cè)試單元。此類旨在用作基類,具體測(cè)試由具體的子類實(shí)現(xiàn)。該類實(shí)現(xiàn)了測(cè)試運(yùn)行器所需的接口,以允許它驅(qū)動(dòng)測(cè)試,以及測(cè)試代碼可用于檢查和報(bào)告各種故障的方法。

每個(gè)實(shí)例都?TestCase?將運(yùn)行一個(gè)測(cè)試方法:名為?methodName?的方法。如果你還記得,我們有一個(gè)更早的例子:

def suite():
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase('test_default_size'))
    suite.addTest(WidgetTestCase('test_resize'))
    return suite

在這里,我們創(chuàng)建兩個(gè)實(shí)例?WidgetTestCase?,每個(gè)實(shí)例運(yùn)行一次測(cè)試。

?methodName?默認(rèn)為?runTest()?。

?TestCase ?實(shí)例提供了三組方法:一組用于運(yùn)行測(cè)試,另一組用于由測(cè)試實(shí)現(xiàn)檢查條件和報(bào)告失敗,還有一些查詢方法允許收集有關(guān)測(cè)試本身的信息。

第一組中的方法(運(yùn)行測(cè)試)是:

  • ?setUp()?

調(diào)用方法來(lái)準(zhǔn)備測(cè)試夾具。這在調(diào)用測(cè)試方法之前立即調(diào)用; 除AssertionError或SkipTest,通過(guò)該方法產(chǎn)生的任何異常都將被認(rèn)為是錯(cuò)誤的,而不是一個(gè)檢測(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)。任何異常,比其他AssertionError或SkipTest,通過(guò)該方法提出將被視為附加的錯(cuò)誤,而不是一個(gè)測(cè)試失敗(從而增加報(bào)告的錯(cuò)誤的總數(shù))。setUp()不管測(cè)試方法的結(jié)果如何,只有成功時(shí)才會(huì)調(diào)用此方法。默認(rèn)實(shí)現(xiàn)什么都不做。

  • ?setUpClass()?

在單個(gè)類中的測(cè)試之前調(diào)用的類方法運(yùn)行。setUpClass被稱為類作為唯一的參數(shù),并且必須被修飾為classmethod():

@classmethod
def setUpClass(cls):
    ...

有關(guān)更多詳細(xì)信息,請(qǐng)參閱Class和Module Fixtures。

2.7版本的新功能。

  • ?tearDownClass()?

在單個(gè)類中的測(cè)試之后調(diào)用的類方法已經(jīng)運(yùn)行。tearDownClass被稱為類作為唯一的參數(shù),并且必須被修飾為classmethod():

@classmethod
def tearDownClass(cls):
    ...

有關(guān)更多詳細(xì)信息,請(qǐng)參閱Class和Module Fixtures。

2.7版本的新功能。

  • ?run(result=None)?

運(yùn)行測(cè)試,將結(jié)果收集到作為結(jié)果傳遞的測(cè)試結(jié)果對(duì)象中。如果省略結(jié)果或None創(chuàng)建臨時(shí)結(jié)果對(duì)象(通過(guò)調(diào)用defaultTestResult()方法)并使用。結(jié)果對(duì)象不會(huì)返回給run()調(diào)用者。

簡(jiǎn)單地調(diào)用TestCase實(shí)例可能會(huì)產(chǎn)生同樣的效果。

  • ?skipTest(reason)?

在測(cè)試方法中調(diào)用它或setUp()跳過(guò)當(dāng)前測(cè)試。有關(guān)更多信息,請(qǐng)參閱跳過(guò)測(cè)試和預(yù)期故障。

2.7版本的新功能。

  • ?debug()?

運(yùn)行測(cè)試而不收集結(jié)果。這允許將測(cè)試引發(fā)的異常傳播給調(diào)用者,并且可以用來(lái)支持在調(diào)試器下運(yùn)行測(cè)試。

本TestCase類提供了一些斷言方法來(lái)檢查并報(bào)告故障。下表列出了最常用的方法(有關(guān)更多斷言方法,請(qǐng)參閱下表):

方法

檢查

新加入的

assertEqual(a,b)

a == b

?

assertNotEqual(a,b)

a!= b

?

assertTrue(x)

bool(x)為True

?

assertFalse(x)

bool(x)是False

?

assertIs(a,b)

a是b

2.7

assertIsNot(a,b)

a不是b

2.7

assertIsNone(x)

x是None

2.7

assertIsNotNone(x)

x不是None

2.7

assertIn(a,b)

a在b內(nèi)

2.7

assertNotIn(a,b)

a不在b內(nèi)

2.7

assertIsInstance(a,b)

判斷兩個(gè)類型是否相同

2.7

assertNotIsInstance(a,b)

判斷兩個(gè)類型是否不相同

2.7

所有的 assert 方法都接受一個(gè) ?msg?參數(shù),如果指定,則用作失敗時(shí)的錯(cuò)誤消息(另請(qǐng)參見 longMessage)。請(qǐng)注意,只有當(dāng)它們用作上下文管理器時(shí),才能將 ?msg? 關(guān)鍵字參數(shù)傳遞給 ?assertRaises()?、?assertRaisesRegex()?、?assertWarns()?、?assertWarnsRegex()?。

  • ?assertEqual(first, second, msg=None)?

測(cè)試第一個(gè)參數(shù)和第二個(gè)參數(shù)是否相等。如果兩個(gè)參數(shù)值不相等,則測(cè)試將失敗。

另外,如果第一個(gè)和第二個(gè)類型完全相同,并且列表,元組,dict,set,frozenset或unicode中的一個(gè)是完全相同的類型,或者addTypeEqualityFunc()將調(diào)用子類與類型特定的相等函數(shù)一起注冊(cè)的任何類型,以便生成更有用的默認(rèn)錯(cuò)誤信息(另請(qǐng)參閱特定于類型的方法列表)。

在版本2.7中更改:添加了特定于類型的相等函數(shù)的自動(dòng)調(diào)用。

  • ?assertNotEqual(first, second, msg=None)?

測(cè)試第一和第二不相等。如果這些值確實(shí)相等,則測(cè)試將失敗。

  • ??assertTrue(expr, msg=None) ?
  •  ?assertFalse(expr, msg=None)??

測(cè)試expr是否為真(或false)。

請(qǐng)注意,這相當(dāng)于bool(expr) is True而不是expr is True(assertIs(expr, True)用于后者)。當(dāng)更具體的方法可用時(shí)(例如,assertEqual(a, b)而不是assertTrue(a == b)),這種方法也應(yīng)該避免,因?yàn)樗鼈冊(cè)谑〉那闆r下提供更好的錯(cuò)誤消息。

  • ??assertIs(first, second, msg=None)?
  • ?assertIsNot(first, second, msg=None)??

測(cè)試第一個(gè)和第二個(gè)評(píng)估(或不評(píng)估)到同一個(gè)對(duì)象。

2.7版本的新功能。

  • ??assertIsNone(expr, msg=None)?
  • ?assertIsNotNone(expr, msg=None)??

測(cè)試expr是否(或不)None。

2.7版本的新功能。

  • ??assertIn(first, second, msg=None)?
  • ?assertNotIn(first, second, msg=None)??

首先測(cè)試(或不)在第二。

2.7版本的新功能。

  • ?assertIsInstance(obj, cls, msg=None)?
  • ?assertNotIsInstance(obj, cls, msg=None)?

測(cè)試obj是(或不是)cls的一個(gè)實(shí)例(可以是一個(gè)類或一個(gè)類的元組,可以支持isinstance())。要檢查確切的類型,請(qǐng)使用?assertIs(type(obj), cls)?。

2.7版本的新功能。

還可以使用以下方法檢查是否引發(fā)異常和警告:

方法

檢查

新加入的

assertRaises(exc,fun,* args,** kwds)

有趣(* args,** kwds)引發(fā)了exc

?

assertRaisesRegexp(exc,r,fun,* args,** kwds)

fun(* args,** kwds)引發(fā)exc,并且消息匹配正則表達(dá)式r

2.7

  • ?assertRaises(exception, callable, *args, **kwds)?
  • ?assertRaises(exception)?

測(cè)試在調(diào)用callable時(shí)使用傳遞給它的任何位置或關(guān)鍵字參數(shù)時(shí)會(huì)引發(fā)異常assertRaises()。如果發(fā)生異常,則測(cè)試通過(guò);如果發(fā)生另一個(gè)異常,則為錯(cuò)誤;如果未發(fā)生異常,則發(fā)生錯(cuò)誤。要捕獲任何一組異常,包含異常類的元組可以作為例外傳遞。

如果只給出異常參數(shù),則返回一個(gè)上下文管理器,以便測(cè)試下的代碼可以內(nèi)聯(lián)寫入,而不是作為函數(shù)寫入:

with self.assertRaises(SomeException):
    do_something()

上下文管理器將把捕獲到的異常對(duì)象存儲(chǔ)在它的exception屬性中。如果打算對(duì)引發(fā)的異常執(zhí)行附加檢查,這可能很有用:

with self.assertRaises(SomeException) as cm:
    do_something()

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)

在版本2.7中進(jìn)行了更改:添加了assertRaises()用作上下文管理器的功能。

  • ?assertRaisesRegexp(exception, regexp, callable, *args, **kwds)?
  • ?assertRaisesRegexp(exception, regexp)?

像assertRaises()但也測(cè)試正則表達(dá)式在引發(fā)異常的字符串表示匹配。regexp可能是一個(gè)正則表達(dá)式對(duì)象或者是一個(gè)包含適合使用的正則表達(dá)式的字符串re.search()。例子:

self.assertRaisesRegexp(ValueError, "invalid literal for.*XYZ'$",
                        int, 'XYZ')

要么:

with self.assertRaisesRegexp(ValueError, 'literal'):
   int('XYZ')

2.7版本的新功能。

還有其他方法用于執(zhí)行更具體的檢查,例如:

方法

檢查

新加入的

assertAlmostEqual(a,b)

round(ab,7)== 0

?

assertNotAlmostEqual(a,b)

round(ab,7)!= 0

?

assertGreater(a,b)

a> b

2.7

assertGreaterEqual(a,b)

a> = b

2.7

assertLess(a,b)

a <b

2.7

assertLessEqual(a,b)

a <= b

2.7

assertRegexpMatches(s,r)

r.search(S)

2.7

assertNotRegexpMatches(s,r)

不是r.search(s)

2.7

assertItemsEqual(a,b)

排序(a)==排序(b)并使用不可取的objs

2.7

assertDictContainsSubset(a,b)

b中存在的所有鍵/值對(duì)

2.7

  • ?assertAlmostEqual(first, second, places=7, msg=None, delta=None)?
  • ?assertNotAlmostEqual(first, second, places=7, msg=None, delta=None)?

測(cè)試第一和第二近似(或不近似)通過(guò)計(jì)算差,四舍五入到小數(shù)點(diǎn)的給定數(shù)目相等的地方(默認(rèn)7),并與零進(jìn)行比較。請(qǐng)注意,這些方法將數(shù)值四舍五入到給定的小數(shù)位數(shù)(即round()函數(shù))而不是有效數(shù)字。

如果提供增量而不是位置,則第一個(gè)和第二個(gè)之間的差值必須小于或等于(或大于)delta。

提供三角洲和地方提出了一個(gè)TypeError。

在版本2.7中更改:assertAlmostEqual()自動(dòng)考慮比較相等的幾乎相等的對(duì)象。assertNotAlmostEqual()如果對(duì)象相等則自動(dòng)失敗。添加了delta關(guān)鍵字參數(shù)。

  • ?assertGreater(first, second, msg=None)?
  • ?assertGreater(first, second, msg=None)?
  • ?assertGreater(first, second, msg=None)?
  • ?assertGreater(first, second, msg=None)?

根據(jù)方法名稱測(cè)試第一個(gè)分別是>,> =,<或<= 第二個(gè)。如果不是,測(cè)試將失敗:

>>> self.assertGreaterEqual(3, 4)
AssertionError: "3" unexpectedly not greater than or equal to "4"

2.7版本的新功能。

  • ?assertRegexpMatches(text, regexp, msg=None)?

測(cè)試正則表達(dá)式搜索與文本匹配。如果失敗,錯(cuò)誤消息將包括模式和文本(或模式和意外匹配的文本部分)。regexp可能是一個(gè)正則表達(dá)式對(duì)象或者是一個(gè)包含適合使用的正則表達(dá)式的字符串re.search()。

2.7版本的新功能。

  • ?assertNotRegexpMatches(text, regexp, msg=None)?

驗(yàn)證正則表達(dá)式搜索與文本不匹配。包含模式和匹配文本部分的錯(cuò)誤消息失敗。regexp可能是一個(gè)正則表達(dá)式對(duì)象或者是一個(gè)包含適合使用的正則表達(dá)式的字符串re.search()。

2.7版本的新功能。

  • ?assertItemsEqual(actual, expected, msg=None)?

測(cè)試期望的序列包含與實(shí)際相同的元素,而不管它們的順序如何。如果沒有,則會(huì)生成列出序列之間差異的錯(cuò)誤消息。

比較實(shí)際值和預(yù)期值時(shí),不會(huì)忽略重復(fù)元素。它驗(yàn)證兩個(gè)序列中每個(gè)元素是否具有相同的計(jì)數(shù)。它等同于它,但它也可以處理不可對(duì)象序列。

  • ?assertEqual(sorted(expected), sorted(actual))?

在Python 3中,這個(gè)方法被命名assertCountEqual。
2.7版本的新功能。

  • ?assertDictContainsSubset(expected, actual, msg=None)?

測(cè)試實(shí)際字典中的鍵/值對(duì)是否是預(yù)期字符集的超集。如果不是,則會(huì)生成列出缺失鍵和不匹配值的錯(cuò)誤消息。

2.7版本的新功能。
自3.2版以來(lái)已棄用。

該assertEqual()方法將相同類型的對(duì)象的相等性檢查分派給不同類型特定的方法。這些方法已經(jīng)用于大多數(shù)內(nèi)置類型,但也可以使用addTypeEqualityFunc()以下方法注冊(cè)新方法:

  • ?addTypeEqualityFunc(typeobj, function)?

注冊(cè)一個(gè)名為by的類型特定方法assertEqual()來(lái)檢查兩個(gè)完全相同的typeobj(而不是子類)對(duì)象是否相等。函數(shù)必須像兩個(gè)位置參數(shù)一樣,第三個(gè)msg = None關(guān)鍵字參數(shù)assertEqual()。self.failureException(msg)當(dāng)檢測(cè)到前兩個(gè)參數(shù)之間的不平等時(shí),它必須提高- 可能提供有用的信息并解釋錯(cuò)誤消息中的細(xì)節(jié)不等式。

2.7版本的新功能。

assertEqual()下表中匯總了自動(dòng)使用的特定于類型的方法列表。請(qǐng)注意,通常不需要直接調(diào)用這些方法。

方法

用于比較

新加入的

assertMultiLineEqual(a,b)

字符串

2.7

assertSequenceEqual(a,b)

序列

2.7

assertListEqual(a,b)

名單

2.7

assertTupleEqual(a,b)

元組

2.7

assertSetEqual(a,b)

設(shè)置或frozensets

2.7

assertDictEqual(a,b)

http://stardict.sourceforge.net/Dictionaries.php下載

2.7

  • ?assertMultiLineEqual(first, second, msg=None)?

測(cè)試了多串首先是等于字符串第二。如果不等于兩個(gè)字符串的差異,則突出顯示差異將包含在錯(cuò)誤消息中。比較字符串時(shí)默認(rèn)使用此方法assertEqual()。

2.7版本的新功能。

  • ?assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)?

測(cè)試兩個(gè)序列是否相等。如果提供了seq_type,則seq1和seq2必須是seq_type的實(shí)例,否則將引發(fā)故障。如果序列不同,則會(huì)構(gòu)造一個(gè)錯(cuò)誤消息,顯示兩者之間的差異。

這個(gè)方法不是直接被調(diào)用assertEqual(),而是用來(lái)實(shí)現(xiàn)assertListEqual()和assertTupleEqual()。

2.7版本的新功能。

  • ?assertListEqual(list1, list2, msg=None)?
  • ?assertListEqual(list1, list2, msg=None)?

測(cè)試兩個(gè)列表或元組是否相等。如果不是,則會(huì)構(gòu)建一條僅顯示兩者之間差異的錯(cuò)誤消息。如果兩個(gè)參數(shù)中的任何一個(gè)參數(shù)都屬于錯(cuò)誤類型,也會(huì)引發(fā)錯(cuò)誤。在比較列表或元組時(shí),默認(rèn)使用這些方法assertEqual()。

2.7版本的新功能。

  • ?assertSetEqual(set1, set2, msg=None)?

測(cè)試兩組相等。如果不是,則會(huì)構(gòu)造一個(gè)錯(cuò)誤消息,列出各組之間的差異。比較設(shè)置或frozensets時(shí)默認(rèn)使用此方法assertEqual()。

如果set1或set2中沒有一個(gè)set.difference()方法,則失敗。

2.7版本的新功能。

  • ?assertDictEqual(expected, actual, msg=None)?

測(cè)試兩個(gè)字典是否相同。如果不是,則會(huì)構(gòu)造一個(gè)錯(cuò)誤消息,顯示字典中的差異。默認(rèn)情況下會(huì)使用此方法比較調(diào)用中的字典assertEqual()。

2.7版本的新功能。

最后TestCase提供以下方法和屬性:

  • ?fail(msg=None)?

用msg或None錯(cuò)誤信息無(wú)條件地表示測(cè)試失敗。

  • ?failureException?

這個(gè)類屬性給出了測(cè)試方法引發(fā)的異常。如果一個(gè)測(cè)試框架需要使用一個(gè)專門的異常,可能需要攜帶更多的信息,那么它必須將這個(gè)異常小類化,以便與框架“公平”。這個(gè)屬性的初始值是AssertionError。

  • ?longMessage?

如果設(shè)置為,True那么傳遞給斷言方法的任何顯式失敗消息都將追加到正常失敗消息的末尾。正常消息包含有關(guān)所涉及對(duì)象的有用信息,例如來(lái)自assertEqual的消息顯示了兩個(gè)不等對(duì)象的repr。通過(guò)設(shè)置此屬性,True可以讓您除了正常的錯(cuò)誤信息之外還有自定義的錯(cuò)誤信息。

此屬性默認(rèn)為False,意味著傳遞給斷言方法的自定義消息將會(huì)使常規(guī)消息無(wú)效。

通過(guò)在調(diào)用assert方法之前True或False之前分配實(shí)例屬性,可以在單個(gè)測(cè)試中重寫類設(shè)置。

2.7版本的新功能。

  • ?maxDiff?

該屬性通過(guò)assert方法控制差異輸出的最大長(zhǎng)度,該方法報(bào)告差異的差異。它默認(rèn)為80 * 8個(gè)字符。受此屬性影響的Assert方法assertSequenceEqual()(包括委托給它的所有序列比較方法)assertDictEqual()和assertMultiLineEqual()。

設(shè)置maxDiff為None意味著沒有最大長(zhǎng)度的差異。

2.7版本的新功能。

測(cè)試框架可以使用以下方法收集測(cè)試信息:

  • ?countTestCases()?

返回此測(cè)試對(duì)象表示的測(cè)試數(shù)量。對(duì)于TestCase情況下,這將永遠(yuǎn)是1。

  • ?defaultTestResult()?

返回應(yīng)該用于此測(cè)試用例類的測(cè)試結(jié)果類的實(shí)例(如果沒有其他結(jié)果實(shí)例提供給該run()方法)。

對(duì)于TestCase情況下,這將永遠(yuǎn)是一個(gè)實(shí)例TestResult; 子類TestCase應(yīng)該根據(jù)需要覆蓋它。

  • ?id()?

返回一個(gè)標(biāo)識(shí)特定測(cè)試用例的字符串。這通常是測(cè)試方法的全名,包括模塊和類名。

  • ?shortDescription()?

返回測(cè)試的描述,或者None沒有提供描述。此方法的默認(rèn)實(shí)現(xiàn)返回測(cè)試方法的文檔字符串的第一行(如果可用)或None。

  • ?addCleanup(function, *args, **kwargs)?

添加一個(gè)函數(shù)來(lái)tearDown()清理測(cè)試過(guò)程中使用的資源。函數(shù)將按照它們添加的順序(LIFO)以相反的順序調(diào)用。它們被調(diào)用時(shí)添加了任何參數(shù)和關(guān)鍵字參數(shù)addCleanup()。

如果setUp()失敗,意味著tearDown()沒有被調(diào)用,那么添加的任何清理函數(shù)仍將被調(diào)用。

2.7版本的新功能。

  • ?doCleanups()?

此方法在之后tearDown()或之后被無(wú)條件地調(diào)用,setUp()如果setUp()引發(fā)異常。

它負(fù)責(zé)調(diào)用所添加的所有清理函數(shù)addCleanup()。如果你需要清除函數(shù)被調(diào)用之前到tearDown(),那么你可以調(diào)用doCleanups()。

doCleanups() 一次只能拋出一堆清理函數(shù),因此可以隨時(shí)調(diào)用。

2.7版本的新功能。

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ò)誤的方法。這用于使用舊版測(cè)試代碼創(chuàng)建測(cè)試用例,從而將其集成到unittest基于測(cè)試框架的測(cè)試中。

已棄用的別名

由于歷史原因,其中一些TestCase方法有一個(gè)或多個(gè)現(xiàn)在已被棄用的別名。下表列出了正確的名稱及其棄用的別名:

方法名稱

已棄用的別名(es)

assertEqual()

failUnlessEqual,assertEquals

assertNotEqual()

failIfEqual

assertTrue()

failUnless,assert_

assertFalse()

failIf

assertRaises()

failUnlessRaises

assertAlmostEqual()

failUnlessAlmostEqual

assertNotAlmostEqual()

failIfAlmostEqual

自2.7版棄用:第二列中列出的別名


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)