TestLoader类

2022-08-04 16:53 更新

class unittest.TestLoader

所述TestLoader类被用来创建从类和模块的测试套件。通常,不需要创建该类的实例; 该unittest模块提供了一个可以共享的实例unittest.defaultTestLoader。但是,使用子类或实例可以自定义一些可配置的属性。

TestLoader 对象有以下方法:

  • loadTestsFromTestCase(testCaseClass)

返回一个套件中包含的所有测试用例TestCase派生testCaseClass。

  • loadTestsFromModule(module)

返回给定模块中包含的所有测试用例套件。此方法在模块中搜索派生的类,TestCase并为为该类定义的每个测试方法创建类的实例。

注意
虽然使用TestCase衍生类的层次结构可以方便地共享fixtures和helper函数,但是在基类上定义测试方法并不打算直接实例化,但这种方法并不能很好地发挥作用。但是,如果灯具不同并在子类中定义,则这样做会很有用。

如果一个模块提供了一个load_tests函数,它将被调用来加载测试。这允许模块自定义测试加载。这是load_tests协议。

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

  • loadTestsFromName(name, module=None)

返回给定字符串说明符的所有测试用例。

指定器名称是“带点名称”,其可以解决要么模块,测试用例类,测试用例类内的测试法,TestSuite实例或它返回一个可调用对象TestCase或TestSuite实例。这些检查按照此处列出的顺序应用; 也就是说,可能的测试用例类中的方法将被选为“测试用例类中的测试方法”,而不是“可调用对象”。

例如,如果您有一个模块 SampleTests,其中包含一个带有三个测试方法(test_one()、test_two() 和 test_three())的 TestCase 派生类 SampleTestCase,则说明符“SampleTests.SampleTestCase”将导致该方法返回一个套件这将运行所有三种测试方法。使用说明符 'SampleTests.SampleTestCase.test_two' 会导致它返回一个仅运行 test_two() 测试方法的测试套件。说明符可以引用尚未导入的模块和包;它们将作为副作用被导入。

该方法可以选择性地解析相对于给定模块的名称。

  • loadTestsFromNames(names, module=None)

类似于loadTestsFromName(),但是采用一系列名称而不是单一名称。返回值是一个测试套件,它支持为每个名称定义的所有测试。

  • getTestCaseNames(testCaseClass)

返回在testCaseClass中找到的方法名称的排序顺序; 这应该是一个子类TestCase。

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

通过从指定的开始目录递归到子目录中查找所有测试模块,并返回包含它们的TestSuite对象。只有与模式匹配的测试文件才会被加载。(使用shell风格模式匹配。)只有可导入的模块名称(即有效的Python标识符)才会被加载。

所有测试模块必须可以从项目的顶层导入。如果起始目录不是顶层目录,则顶层目录必须单独指定。

如果导入模块失败,例如由于语法错误,那么这将被记录为单个错误,并且发现将继续。

如果测试包名称(带有的目录__init__.py)与该模式匹配,则会检查该包是否有load_tests函数。如果存在,那么它将被加载器,测试,模式调用。

如果load_tests存在,那么发现并没有递归放入包中,load_tests负责加载所有测试包。

该模式故意不作为加载程序属性存储,以便程序包可以继续自行发现。存储top_level_dir,因此load_tests不需要将此参数传入loader.discover()。

start_dir可以是虚线模块名称以及目录。

2.7版本的新功能。

TestLoader的以下属性可以通过子类或实例上的赋值来配置:

  • testMethodPrefix

提供方法名称前缀的字符串,将被解释为测试方法。默认值是'test'。

这影响getTestCaseNames()和所有的loadTestsFrom*()方法。

  • sortTestMethodsUsing

函数用于在对它们进行排序时比较方法名称getTestCaseNames()以及所有loadTestsFrom*()方法。默认值是内置cmp()函数; 该属性也可以设置None为禁用排序。

  • suiteClass

从测试列表构造测试套件的可调用对象。在结果对象上不需要任何方法。默认值是TestSuite类。

这影响了所有的loadTestsFrom*()方法。

class unittest.TestResult

该类用于编译有关哪些测试已成功并失败的信息。

一个TestResult对象存储一组测试的结果。在TestCase和TestSuite班保证结果正确记录; 测试作者不需要担心记录测试的结果。

构建在最上面的测试框架unittest可能需要访问TestResult为报告目的运行一组测试所生成的对象; 为此目的TestResult,TestRunner.run()方法返回一个实例。

TestResult 实例具有以下在检查运行一组测试的结果时将会感兴趣的属性:

  • errors

包含TestCase实例和字符串的2元组的列表,其中包含格式化的回溯。每个元组代表一个引发意外异常的测试。

在版本2.2中进行了更改:包含格式化的追溯而不是sys.exc_info()结果。

  • failures

包含TestCase实例和字符串的2元组的列表,其中包含格式化的回溯。每个元组代表一个测试,其中使用这些TestCase.assert*()方法显式地发送了失败信号。

在版本2.2中进行了更改:包含格式化的追溯而不是sys.exc_info()结果。

  • skipped

包含TestCase实例和字符串的2元组的列表,其中包含跳过测试的原因。

2.7版本的新功能。

  • expectedFailures

包含TestCase实例和字符串的2元组的列表,其中包含格式化的回溯。每个元组代表测试用例的预期失败。

  • unexpectedSuccesses

包含TestCase标记为预期失败但成功的实例的列表。

  • shouldStop

设置为True执行测试时应该停止stop()。

  • testsRun

迄今为止运行的测试总数。

  • buffer

如果设置为true,sys.stdout并且sys.stderr将在之间进行缓冲startTest()和stopTest()被调用。收集到的输出只会回显到真实状态sys.stdout,sys.stderr如果测试失败或错误。任何输出也附加到失败/错误消息。

2.7版本的新功能。

  • failfast

如果设置为true,stop()则会在第一次失败或错误时调用,从而停止测试运​​行。

2.7版本的新功能。

  • wasSuccessful()

返回True如果所有测试跑这么远都过去了,否则返回False。

  • stop()

可以调用此方法来指示正在运行的测试集应通过设置shouldStop属性来中止True。TestRunner对象应该尊重这个标志并返回而不需要运行任何附加测试。

例如,TextTestRunner当用户通过键盘发出中断时,该类将使用此功能来停止测试框架。提供TestRunner实现的交互式工具可以以类似的方式使用它。

TestResult该类的以下方法用于维护内部数据结构,并可以在子类中进行扩展以支持其他报告要求。这在构建支持交互式报告而运行测试的工具时特别有用。

  • startTest(test)

当测试用例测试即将运行时调用。

  • stopTest(test)

无论结果如何,在测试用例测试执行后调用。

  • startTestRun()

在执行任何测试之前调用一次。

2.7版本的新功能。

  • stopTestRun()

所有测试执行完毕后调用一次。

2.7版本的新功能。

  • addError(test, err)

当测试用例测试引发意外的异常时调用。err是由以下形式返回的形式的元组sys.exc_info():(type, value, traceback)。

默认实现将元组附加(test, formatted_err)到实例的errors属性,其中formatted_err是从err派生的格式化回溯。

  • addFailure(test, err)

当测试用例测试指示失败时调用。err是由以下形式返回的形式的元组sys.exc_info():(type, value, traceback)。

默认实现将元组附加(test, formatted_err)到实例的failures属性,其中formatted_err是从err派生的格式化回溯。

  • addSuccess(test)

当测试用例测试成功时调用。

默认实现什么都不做。

  • addSkip(test, reason)

当测试用例测试被跳过时调用。原因是测试给跳过的原因。

默认实现将元组附加(test, reason)到实例的skipped属性。

  • addExpectedFailure(test, err)

当测试用例测试失败时调用,但用expectedFailure()装饰器标记。

默认实现将元组附加(test, formatted_err)到实例的expectedFailures属性,其中formatted_err是从err派生的格式化回溯。

  • addUnexpectedSuccess(test)

当测试用例测试用expectedFailure()装饰器标记但成功时调用。

默认实现将测试附加到实例的unexpectedSuccesses属性。

class unittest.TextTestResult(stream, descriptions, verbosity)

一个具体的实现TestResult使用的TextTestRunner。

2.7版本中的新功能:此类是以前命名的_TextTestResult。旧名称仍作为别名存在,但不推荐使用。

unittest.defaultTestLoader

TestLoader该类的实例打算共享。如果不需要自定义,TestLoader则可以使用此实例,而不是重复创建新实例。


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

一个基本的测试运行器实现,打印标准错误的结果。它有几个可配置的参数,但实质上非常简单。运行测试套件的图形应用程序应提供替代实现。

_makeResult()

此方法返回的实例TestResult所使用run()。它不打算直接调用,但可以在子类中重写以提供自定义TestResult。

_makeResult()将TextTestRunner构造函数中传递的类或可调用实例化为resultclass参数。TextTestResult如果没有resultclass提供,它默认为。结果类用以下参数实例化:

stream, descriptions, verbosity

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

一个命令行程序,从模块中加载一组测试并运行它们; 这主要是为了使测试模块方便地执行。此函数最简单的用法是在测试脚本的末尾包含以下行:

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

您可以通过传递详细信息参数来运行更详细的信息测试:

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

defaultTest参数是测试如果通过指定没有测试名运行名argv的。如果未指定或None没有通过argv提供测试名称,则会运行模块中找到的所有测试。

argv的参数可以是传递给程序的选项列表,第一个元素是程序名称。如果未指定或使用None的值sys.argv。

所述的TestRunner参数可以是一个测试运行类或它的一个已创建的实例。默认情况下,带有退出代码的main调用sys.exit()指示测试成功或失败。

testLoader参数必须是一个TestLoader实例,并默认为defaultTestLoader。

main通过传递参数支持交互式解释器的使用exit=False。这会在标准输出中显示结果而不调用sys.exit():

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

故障快速转移,catchbreak和缓冲参数具有与相同名称的命令行选项的相同的效果。

调用main实际上会返回TestProgram该类的一个实例。这将测试结果存储为result属性。

在2.7版更改:将退出,冗长,故障快速转移,catchbreak和缓冲区参数中添加。

load_tests协议

2.7版本的新功能。

模块或包可以定制在正常测试运行期间如何从它们加载测试,或者通过实现一个名为的函数来测试发现load_tests。

如果一个测试模块定义了load_tests,它将被TestLoader.loadTestsFromModule()以下参数调用:

load_tests(loader, standard_tests, None)

它应该返回一个TestSuite。

loader是加载的实例TestLoader。standard_tests是默认从模块加载的测试。测试模块通常只想添加或移除标准测试集中的测试。加载包作为测试发现的一部分时使用第三个参数。

load_tests从特定的一组TestCase类中加载测试的典型函数可能如下所示:

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

如果发现是从命令行或通过调用开始的,TestLoader.discover()那么匹配包名称的模式__init__.py将被检查load_tests。

注意
默认模式是'test*.py'。它匹配所有以任何测试目录开头'test'但不匹配任何测试目录的Python文件。
类似的模式'test*'将匹配测试包和模块。

如果包__init__.py定义,load_tests那么它将被调用,发现不会继续进入包。load_tests用以下参数调用:

load_tests(loader, standard_tests, pattern)

这应该返回TestSuite代表包中的所有测试。(standard_tests只包含从中收集的测试__init__.py。)

因为模式被传递到load_tests包中可以自由地继续(并可能修改)测试发现。load_tests测试软件包的“无功能” 功能看起来像:

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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号