TestLoader類

2022-08-04 16:53 更新

class unittest.TestLoader

所述TestLoader類被用來創(chuàng)建從類和模塊的測(cè)試套件。通常,不需要?jiǎng)?chuàng)建該類的實(shí)例; 該unittest模塊提供了一個(gè)可以共享的實(shí)例unittest.defaultTestLoader。但是,使用子類或?qū)嵗梢宰远x一些可配置的屬性。

TestLoader 對(duì)象有以下方法:

  • loadTestsFromTestCase(testCaseClass)

返回一個(gè)套件中包含的所有測(cè)試用例TestCase派生testCaseClass。

  • loadTestsFromModule(module)

返回給定模塊中包含的所有測(cè)試用例套件。此方法在模塊中搜索派生的類,TestCase并為為該類定義的每個(gè)測(cè)試方法創(chuàng)建類的實(shí)例。

注意
雖然使用TestCase衍生類的層次結(jié)構(gòu)可以方便地共享fixtures和helper函數(shù),但是在基類上定義測(cè)試方法并不打算直接實(shí)例化,但這種方法并不能很好地發(fā)揮作用。但是,如果燈具不同并在子類中定義,則這樣做會(huì)很有用。

如果一個(gè)模塊提供了一個(gè)load_tests函數(shù),它將被調(diào)用來加載測(cè)試。這允許模塊自定義測(cè)試加載。這是load_tests協(xié)議。

在版本2.7中更改:支持load_tests添加。

  • loadTestsFromName(name, module=None)

返回給定字符串說明符的所有測(cè)試用例。

指定器名稱是“帶點(diǎn)名稱”,其可以解決要么模塊,測(cè)試用例類,測(cè)試用例類內(nèi)的測(cè)試法,TestSuite實(shí)例或它返回一個(gè)可調(diào)用對(duì)象TestCase或TestSuite實(shí)例。這些檢查按照此處列出的順序應(yīng)用; 也就是說,可能的測(cè)試用例類中的方法將被選為“測(cè)試用例類中的測(cè)試方法”,而不是“可調(diào)用對(duì)象”。

例如,如果您有一個(gè)模塊 SampleTests,其中包含一個(gè)帶有三個(gè)測(cè)試方法(test_one()、test_two() 和 test_three())的 TestCase 派生類 SampleTestCase,則說明符“SampleTests.SampleTestCase”將導(dǎo)致該方法返回一個(gè)套件這將運(yùn)行所有三種測(cè)試方法。使用說明符 'SampleTests.SampleTestCase.test_two' 會(huì)導(dǎo)致它返回一個(gè)僅運(yùn)行 test_two() 測(cè)試方法的測(cè)試套件。說明符可以引用尚未導(dǎo)入的模塊和包;它們將作為副作用被導(dǎo)入。

該方法可以選擇性地解析相對(duì)于給定模塊的名稱。

  • loadTestsFromNames(names, module=None)

類似于loadTestsFromName(),但是采用一系列名稱而不是單一名稱。返回值是一個(gè)測(cè)試套件,它支持為每個(gè)名稱定義的所有測(cè)試。

  • getTestCaseNames(testCaseClass)

返回在testCaseClass中找到的方法名稱的排序順序; 這應(yīng)該是一個(gè)子類TestCase。

  • discover(start_dir, pattern='test*.py', top_level_dir=None)

通過從指定的開始目錄遞歸到子目錄中查找所有測(cè)試模塊,并返回包含它們的TestSuite對(duì)象。只有與模式匹配的測(cè)試文件才會(huì)被加載。(使用shell風(fēng)格模式匹配。)只有可導(dǎo)入的模塊名稱(即有效的Python標(biāo)識(shí)符)才會(huì)被加載。

所有測(cè)試模塊必須可以從項(xiàng)目的頂層導(dǎo)入。如果起始目錄不是頂層目錄,則頂層目錄必須單獨(dú)指定。

如果導(dǎo)入模塊失敗,例如由于語法錯(cuò)誤,那么這將被記錄為單個(gè)錯(cuò)誤,并且發(fā)現(xiàn)將繼續(xù)。

如果測(cè)試包名稱(帶有的目錄__init__.py)與該模式匹配,則會(huì)檢查該包是否有l(wèi)oad_tests函數(shù)。如果存在,那么它將被加載器,測(cè)試,模式調(diào)用。

如果load_tests存在,那么發(fā)現(xiàn)并沒有遞歸放入包中,load_tests負(fù)責(zé)加載所有測(cè)試包。

該模式故意不作為加載程序?qū)傩源鎯?chǔ),以便程序包可以繼續(xù)自行發(fā)現(xiàn)。存儲(chǔ)top_level_dir,因此load_tests不需要將此參數(shù)傳入loader.discover()。

start_dir可以是虛線模塊名稱以及目錄。

2.7版本的新功能。

TestLoader的以下屬性可以通過子類或?qū)嵗系馁x值來配置:

  • testMethodPrefix

提供方法名稱前綴的字符串,將被解釋為測(cè)試方法。默認(rèn)值是'test'。

這影響getTestCaseNames()和所有的loadTestsFrom*()方法。

  • sortTestMethodsUsing

函數(shù)用于在對(duì)它們進(jìn)行排序時(shí)比較方法名稱getTestCaseNames()以及所有l(wèi)oadTestsFrom*()方法。默認(rèn)值是內(nèi)置cmp()函數(shù); 該屬性也可以設(shè)置None為禁用排序。

  • suiteClass

從測(cè)試列表構(gòu)造測(cè)試套件的可調(diào)用對(duì)象。在結(jié)果對(duì)象上不需要任何方法。默認(rèn)值是TestSuite類。

這影響了所有的loadTestsFrom*()方法。

class unittest.TestResult

該類用于編譯有關(guān)哪些測(cè)試已成功并失敗的信息。

一個(gè)TestResult對(duì)象存儲(chǔ)一組測(cè)試的結(jié)果。在TestCase和TestSuite班保證結(jié)果正確記錄; 測(cè)試作者不需要擔(dān)心記錄測(cè)試的結(jié)果。

構(gòu)建在最上面的測(cè)試框架unittest可能需要訪問TestResult為報(bào)告目的運(yùn)行一組測(cè)試所生成的對(duì)象; 為此目的TestResult,TestRunner.run()方法返回一個(gè)實(shí)例。

TestResult 實(shí)例具有以下在檢查運(yùn)行一組測(cè)試的結(jié)果時(shí)將會(huì)感興趣的屬性:

  • errors

包含TestCase實(shí)例和字符串的2元組的列表,其中包含格式化的回溯。每個(gè)元組代表一個(gè)引發(fā)意外異常的測(cè)試。

在版本2.2中進(jìn)行了更改:包含格式化的追溯而不是sys.exc_info()結(jié)果。

  • failures

包含TestCase實(shí)例和字符串的2元組的列表,其中包含格式化的回溯。每個(gè)元組代表一個(gè)測(cè)試,其中使用這些TestCase.assert*()方法顯式地發(fā)送了失敗信號(hào)。

在版本2.2中進(jìn)行了更改:包含格式化的追溯而不是sys.exc_info()結(jié)果。

  • skipped

包含TestCase實(shí)例和字符串的2元組的列表,其中包含跳過測(cè)試的原因。

2.7版本的新功能。

  • expectedFailures

包含TestCase實(shí)例和字符串的2元組的列表,其中包含格式化的回溯。每個(gè)元組代表測(cè)試用例的預(yù)期失敗。

  • unexpectedSuccesses

包含TestCase標(biāo)記為預(yù)期失敗但成功的實(shí)例的列表。

  • shouldStop

設(shè)置為True執(zhí)行測(cè)試時(shí)應(yīng)該停止stop()。

  • testsRun

迄今為止運(yùn)行的測(cè)試總數(shù)。

  • buffer

如果設(shè)置為true,sys.stdout并且sys.stderr將在之間進(jìn)行緩沖startTest()和stopTest()被調(diào)用。收集到的輸出只會(huì)回顯到真實(shí)狀態(tài)sys.stdout,sys.stderr如果測(cè)試失敗或錯(cuò)誤。任何輸出也附加到失敗/錯(cuò)誤消息。

2.7版本的新功能。

  • failfast

如果設(shè)置為true,stop()則會(huì)在第一次失敗或錯(cuò)誤時(shí)調(diào)用,從而停止測(cè)試運(yùn)??行。

2.7版本的新功能。

  • wasSuccessful()

返回True如果所有測(cè)試跑這么遠(yuǎn)都過去了,否則返回False。

  • stop()

可以調(diào)用此方法來指示正在運(yùn)行的測(cè)試集應(yīng)通過設(shè)置shouldStop屬性來中止True。TestRunner對(duì)象應(yīng)該尊重這個(gè)標(biāo)志并返回而不需要運(yùn)行任何附加測(cè)試。

例如,TextTestRunner當(dāng)用戶通過鍵盤發(fā)出中斷時(shí),該類將使用此功能來停止測(cè)試框架。提供TestRunner實(shí)現(xiàn)的交互式工具可以以類似的方式使用它。

TestResult該類的以下方法用于維護(hù)內(nèi)部數(shù)據(jù)結(jié)構(gòu),并可以在子類中進(jìn)行擴(kuò)展以支持其他報(bào)告要求。這在構(gòu)建支持交互式報(bào)告而運(yùn)行測(cè)試的工具時(shí)特別有用。

  • startTest(test)

當(dāng)測(cè)試用例測(cè)試即將運(yùn)行時(shí)調(diào)用。

  • stopTest(test)

無論結(jié)果如何,在測(cè)試用例測(cè)試執(zhí)行后調(diào)用。

  • startTestRun()

在執(zhí)行任何測(cè)試之前調(diào)用一次。

2.7版本的新功能。

  • stopTestRun()

所有測(cè)試執(zhí)行完畢后調(diào)用一次。

2.7版本的新功能。

  • addError(test, err)

當(dāng)測(cè)試用例測(cè)試引發(fā)意外的異常時(shí)調(diào)用。err是由以下形式返回的形式的元組sys.exc_info():(type, value, traceback)。

默認(rèn)實(shí)現(xiàn)將元組附加(test, formatted_err)到實(shí)例的errors屬性,其中formatted_err是從err派生的格式化回溯。

  • addFailure(test, err)

當(dāng)測(cè)試用例測(cè)試指示失敗時(shí)調(diào)用。err是由以下形式返回的形式的元組sys.exc_info():(type, value, traceback)。

默認(rèn)實(shí)現(xiàn)將元組附加(test, formatted_err)到實(shí)例的failures屬性,其中formatted_err是從err派生的格式化回溯。

  • addSuccess(test)

當(dāng)測(cè)試用例測(cè)試成功時(shí)調(diào)用。

默認(rèn)實(shí)現(xiàn)什么都不做。

  • addSkip(test, reason)

當(dāng)測(cè)試用例測(cè)試被跳過時(shí)調(diào)用。原因是測(cè)試給跳過的原因。

默認(rèn)實(shí)現(xiàn)將元組附加(test, reason)到實(shí)例的skipped屬性。

  • addExpectedFailure(test, err)

當(dāng)測(cè)試用例測(cè)試失敗時(shí)調(diào)用,但用expectedFailure()裝飾器標(biāo)記。

默認(rèn)實(shí)現(xiàn)將元組附加(test, formatted_err)到實(shí)例的expectedFailures屬性,其中formatted_err是從err派生的格式化回溯。

  • addUnexpectedSuccess(test)

當(dāng)測(cè)試用例測(cè)試用expectedFailure()裝飾器標(biāo)記但成功時(shí)調(diào)用。

默認(rèn)實(shí)現(xiàn)將測(cè)試附加到實(shí)例的unexpectedSuccesses屬性。

class unittest.TextTestResult(stream, descriptions, verbosity)

一個(gè)具體的實(shí)現(xiàn)TestResult使用的TextTestRunner。

2.7版本中的新功能:此類是以前命名的_TextTestResult。舊名稱仍作為別名存在,但不推薦使用。

unittest.defaultTestLoader

TestLoader該類的實(shí)例打算共享。如果不需要自定義,TestLoader則可以使用此實(shí)例,而不是重復(fù)創(chuàng)建新實(shí)例。


class unittest.TextTestRunner(stream=sys.stderr, descriptions=True, verbosity=1, failfast=False, buffer=False, resultclass=None)

一個(gè)基本的測(cè)試運(yùn)行器實(shí)現(xiàn),打印標(biāo)準(zhǔn)錯(cuò)誤的結(jié)果。它有幾個(gè)可配置的參數(shù),但實(shí)質(zhì)上非常簡(jiǎn)單。運(yùn)行測(cè)試套件的圖形應(yīng)用程序應(yīng)提供替代實(shí)現(xiàn)。

_makeResult()

此方法返回的實(shí)例TestResult所使用run()。它不打算直接調(diào)用,但可以在子類中重寫以提供自定義TestResult。

_makeResult()將TextTestRunner構(gòu)造函數(shù)中傳遞的類或可調(diào)用實(shí)例化為resultclass參數(shù)。TextTestResult如果沒有resultclass提供,它默認(rèn)為。結(jié)果類用以下參數(shù)實(shí)例化:

stream, descriptions, verbosity

unittest.main([module[, defaultTest[, argv[, testRunner[, testLoader[, exit[, verbosity[, failfast[, catchbreak[, buffer]]]]]]]]]])

一個(gè)命令行程序,從模塊中加載一組測(cè)試并運(yùn)行它們; 這主要是為了使測(cè)試模塊方便地執(zhí)行。此函數(shù)最簡(jiǎn)單的用法是在測(cè)試腳本的末尾包含以下行:

if __name__ == '__main__':
    unittest.main()

您可以通過傳遞詳細(xì)信息參數(shù)來運(yùn)行更詳細(xì)的信息測(cè)試:

if __name__ == '__main__':
    unittest.main(verbosity=2)

defaultTest參數(shù)是測(cè)試如果通過指定沒有測(cè)試名運(yùn)行名argv的。如果未指定或None沒有通過argv提供測(cè)試名稱,則會(huì)運(yùn)行模塊中找到的所有測(cè)試。

argv的參數(shù)可以是傳遞給程序的選項(xiàng)列表,第一個(gè)元素是程序名稱。如果未指定或使用None的值sys.argv。

所述的TestRunner參數(shù)可以是一個(gè)測(cè)試運(yùn)行類或它的一個(gè)已創(chuàng)建的實(shí)例。默認(rèn)情況下,帶有退出代碼的main調(diào)用sys.exit()指示測(cè)試成功或失敗。

testLoader參數(shù)必須是一個(gè)TestLoader實(shí)例,并默認(rèn)為defaultTestLoader。

main通過傳遞參數(shù)支持交互式解釋器的使用exit=False。這會(huì)在標(biāo)準(zhǔn)輸出中顯示結(jié)果而不調(diào)用sys.exit():

>>> from unittest import main
>>> main(module='test_module', exit=False)

故障快速轉(zhuǎn)移,catchbreak和緩沖參數(shù)具有與相同名稱的命令行選項(xiàng)的相同的效果。

調(diào)用main實(shí)際上會(huì)返回TestProgram該類的一個(gè)實(shí)例。這將測(cè)試結(jié)果存儲(chǔ)為result屬性。

在2.7版更改:將退出,冗長(zhǎng),故障快速轉(zhuǎn)移,catchbreak和緩沖區(qū)參數(shù)中添加。

load_tests協(xié)議

2.7版本的新功能。

模塊或包可以定制在正常測(cè)試運(yùn)行期間如何從它們加載測(cè)試,或者通過實(shí)現(xiàn)一個(gè)名為的函數(shù)來測(cè)試發(fā)現(xiàn)load_tests。

如果一個(gè)測(cè)試模塊定義了load_tests,它將被TestLoader.loadTestsFromModule()以下參數(shù)調(diào)用:

load_tests(loader, standard_tests, None)

它應(yīng)該返回一個(gè)TestSuite。

loader是加載的實(shí)例TestLoader。standard_tests是默認(rèn)從模塊加載的測(cè)試。測(cè)試模塊通常只想添加或移除標(biāo)準(zhǔn)測(cè)試集中的測(cè)試。加載包作為測(cè)試發(fā)現(xiàn)的一部分時(shí)使用第三個(gè)參數(shù)。

load_tests從特定的一組TestCase類中加載測(cè)試的典型函數(shù)可能如下所示:

test_cases = (TestCase1, TestCase2, TestCase3)

def load_tests(loader, tests, pattern):
    suite = TestSuite()
    for test_class in test_cases:
        tests = loader.loadTestsFromTestCase(test_class)
        suite.addTests(tests)
    return suite

如果發(fā)現(xiàn)是從命令行或通過調(diào)用開始的,TestLoader.discover()那么匹配包名稱的模式__init__.py將被檢查load_tests。

注意
默認(rèn)模式是'test*.py'。它匹配所有以任何測(cè)試目錄開頭'test'但不匹配任何測(cè)試目錄的Python文件。
類似的模式'test*'將匹配測(cè)試包和模塊。

如果包__init__.py定義,load_tests那么它將被調(diào)用,發(fā)現(xiàn)不會(huì)繼續(xù)進(jìn)入包。load_tests用以下參數(shù)調(diào)用:

load_tests(loader, standard_tests, pattern)

這應(yīng)該返回TestSuite代表包中的所有測(cè)試。(standard_tests只包含從中收集的測(cè)試__init__.py。)

因?yàn)槟J奖粋鬟f到load_tests包中可以自由地繼續(xù)(并可能修改)測(cè)試發(fā)現(xiàn)。load_tests測(cè)試軟件包的“無功能” 功能看起來像:

def load_tests(loader, standard_tests, pattern):
    # top level directory cached on loader instance
    this_dir = os.path.dirname(__file__)
    package_tests = loader.discover(start_dir=this_dir, pattern=pattern)
    standard_tests.addTests(package_tests)
    return standard_tests


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)