TestCase類

2022-08-04 15:35 更新

class unittest.TestCase(methodName='runTest')

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

每個實例都?TestCase?將運行一個測試方法:名為?methodName?的方法。如果你還記得,我們有一個更早的例子:

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

在這里,我們創(chuàng)建兩個實例?WidgetTestCase?,每個實例運行一次測試。

?methodName?默認為?runTest()?。

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

第一組中的方法(運行測試)是:

  • ?setUp()?

調(diào)用方法來準備測試夾具。這在調(diào)用測試方法之前立即調(diào)用; 除AssertionError或SkipTest,通過該方法產(chǎn)生的任何異常都將被認為是錯誤的,而不是一個檢測失敗。默認實現(xiàn)什么都不做。

  • ?tearDown()?

在調(diào)用測試方法后立即調(diào)用方法并記錄結(jié)果。即使測試方法引發(fā)異常,也會調(diào)用此方法,因此在子類中的實現(xiàn)可能需要特別小心檢查內(nèi)部狀態(tài)。任何異常,比其他AssertionError或SkipTest,通過該方法提出將被視為附加的錯誤,而不是一個測試失?。◤亩黾訄蟾娴腻e誤的總數(shù))。setUp()不管測試方法的結(jié)果如何,只有成功時才會調(diào)用此方法。默認實現(xiàn)什么都不做。

  • ?setUpClass()?

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

@classmethod
def setUpClass(cls):
    ...

有關更多詳細信息,請參閱Class和Module Fixtures。

2.7版本的新功能。

  • ?tearDownClass()?

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

@classmethod
def tearDownClass(cls):
    ...

有關更多詳細信息,請參閱Class和Module Fixtures。

2.7版本的新功能。

  • ?run(result=None)?

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

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

  • ?skipTest(reason)?

在測試方法中調(diào)用它或setUp()跳過當前測試。有關更多信息,請參閱跳過測試和預期故障。

2.7版本的新功能。

  • ?debug()?

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

本TestCase類提供了一些斷言方法來檢查并報告故障。下表列出了最常用的方法(有關更多斷言方法,請參閱下表):

方法

檢查

新加入的

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)

判斷兩個類型是否相同

2.7

assertNotIsInstance(a,b)

判斷兩個類型是否不相同

2.7

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

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

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

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

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

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

測試第一和第二不相等。如果這些值確實相等,則測試將失敗。

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

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

請注意,這相當于bool(expr) is True而不是expr is True(assertIs(expr, True)用于后者)。當更具體的方法可用時(例如,assertEqual(a, b)而不是assertTrue(a == b)),這種方法也應該避免,因為它們在失敗的情況下提供更好的錯誤消息。

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

測試第一個和第二個評估(或不評估)到同一個對象。

2.7版本的新功能。

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

測試expr是否(或不)None。

2.7版本的新功能。

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

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

2.7版本的新功能。

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

測試obj是(或不是)cls的一個實例(可以是一個類或一個類的元組,可以支持isinstance())。要檢查確切的類型,請使用?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,并且消息匹配正則表達式r

2.7

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

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

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

with self.assertRaises(SomeException):
    do_something()

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

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

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

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

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

像assertRaises()但也測試正則表達式在引發(fā)異常的字符串表示匹配。regexp可能是一個正則表達式對象或者是一個包含適合使用的正則表達式的字符串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中存在的所有鍵/值對

2.7

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

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

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

提供三角洲和地方提出了一個TypeError。

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

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

根據(jù)方法名稱測試第一個分別是>,> =,<或<= 第二個。如果不是,測試將失?。?/p>

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

2.7版本的新功能。

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

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

2.7版本的新功能。

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

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

2.7版本的新功能。

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

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

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

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

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

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

測試實際字典中的鍵/值對是否是預期字符集的超集。如果不是,則會生成列出缺失鍵和不匹配值的錯誤消息。

2.7版本的新功能。
自3.2版以來已棄用。

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

  • ?addTypeEqualityFunc(typeobj, function)?

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

2.7版本的新功能。

assertEqual()下表中匯總了自動使用的特定于類型的方法列表。請注意,通常不需要直接調(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)

設置或frozensets

2.7

assertDictEqual(a,b)

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

2.7

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

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

2.7版本的新功能。

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

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

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

2.7版本的新功能。

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

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

2.7版本的新功能。

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

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

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

2.7版本的新功能。

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

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

2.7版本的新功能。

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

  • ?fail(msg=None)?

用msg或None錯誤信息無條件地表示測試失敗。

  • ?failureException?

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

  • ?longMessage?

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

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

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

2.7版本的新功能。

  • ?maxDiff?

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

設置maxDiff為None意味著沒有最大長度的差異。

2.7版本的新功能。

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

  • ?countTestCases()?

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

  • ?defaultTestResult()?

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

對于TestCase情況下,這將永遠是一個實例TestResult; 子類TestCase應該根據(jù)需要覆蓋它。

  • ?id()?

返回一個標識特定測試用例的字符串。這通常是測試方法的全名,包括模塊和類名。

  • ?shortDescription()?

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

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

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

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

2.7版本的新功能。

  • ?doCleanups()?

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

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

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

2.7版本的新功能。

class unittest.FunctionTestCase(testFunc, setUp=None, tearDown=None, description=None)

該類實現(xiàn)了TestCase允許測試運行器驅(qū)動測試的接口部分,但不提供測試代碼可用于檢查和報告錯誤的方法。這用于使用舊版測試代碼創(chuàng)建測試用例,從而將其集成到unittest基于測試框架的測試中。

已棄用的別名

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

方法名稱

已棄用的別名(es)

assertEqual()

failUnlessEqual,assertEquals

assertNotEqual()

failIfEqual

assertTrue()

failUnless,assert_

assertFalse()

failIf

assertRaises()

failUnlessRaises

assertAlmostEqual()

failUnlessAlmostEqual

assertNotAlmostEqual()

failIfAlmostEqual

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號