TestLoader类
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
更多建议: