test– Python的回归测试

注意

testpackage仅供Python内部使用。它的文档是为了Python的核心开发人员的利益。不鼓励在Python的标准库之外使用这个包,因为这里提到的代码可以更改或删除,而不会在Python的发行版之间发送.


test包包含Python的所有回归测试以及模块test.supporttest.regrtest.test.support用来增强你的测试test.regrtest驱动测试套件.

中的每个模块test名称以test_开头的包是特定模块或功能的测试套件。所有新的测试都应该用unittestdoctest模块。一些较旧的测试使用“传统”测试样式进行编写,将打印输出与sys.stdout;这种测试方式被认为是弃用的.

也可以看看

模块unittest
编写PyUnit回归测试.
模块doctest
文档字符串中嵌入的测试.

单元测试test

它是首选测试使用unittest模块遵循一些指导方针。一种是通过用test_启动它来命名测试模块,并使用被测模块的名称结束。测试模块中的测试方法应以test_最后描述该方法的测试方法。这是必需的,以便测试驱动程序astest方法识别这些方法。此外,不应包含该方法的文档字符串。吸音(如# Tests function returns only True or False)应该用于提供测试方法的文档。这样做是因为如果文档字符串存在则会打印出来,因此正在运行的测试没有说明.

通常使用基本的样板:

import unittestfrom test import supportclass MyTestCase1(unittest.TestCase):    # Only use setUp() and tearDown() if necessary    def setUp(self):        ... code to execute in preparation for tests ...    def tearDown(self):        ... code to execute to clean up after tests ...    def test_feature_one(self):        # Test feature one.        ... testing code ...    def test_feature_two(self):        # Test feature two.        ... testing code ...    ... more test methods ...class MyTestCase2(unittest.TestCase):    ... same structure as MyTestCase1 ...... more test classes ...if __name__ == "__main__":    unittest.main()

此代码模式允许测试套件由test.regrtest,作为支持unittestCLI,或通过python -m unittestCLI.

回归测试的目标是尝试破解代码。这导致遵循一些指导原则:

  • 测试套件应该运用所有类,函数和常量。这不仅包括要呈现给外部世界的外部API,还包括“私有”代码.

  • 白盒测试(检查测试时正在测试的代码)是首选。Blackbox测试(仅测试已发布的用户界面)不够完整,无法确保测试所有边界和边缘情况.

  • 确保测试所有可能的值,包括无效值。这样可以确保不仅可以接受所有有效值,还可以正确处理不正确的值.

  • 尽可能多地排除代码路径。测试分支发生的位置和thustailor输入,以确保通过代码的许多不同路径.

  • 为测试代码发现的任何错误添加一个显式测试。如果在未来更改代码,这将确保错误不会再次出现.

  • 确保在测试后清理(例如关闭并移除所有临时文件).

  • 如果测试依赖于操作系统的特定条件,则在尝试测试之前验证已存在的条件.

  • 尽可能少地导入模块并尽快完成。这最大限度地减少了测试的外部依赖性,并最大限度地减少了导入模块的副作用可能导致的异常行为.

  • 尝试最大化代码重用。有时候,测试会因使用什么类型的输入而变化。通过使用指定输入的类继承abasic测试类来最小化代码重复:

    class TestFuncAcceptsSequencesMixin:    func = mySuperWhammyFunction    def test_func(self):        self.func(self.arg)class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):    arg = [1, 2, 3]class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):    arg = "abc"class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):    arg = (1, 2, 3)

    使用此模式时,请记住从unittest.TestCase继承的所有类都作为测试运行。Mixin上面例子中的类没有任何数据,因此无法自行运行,因此它不会从unittest.TestCase.

开始参见

测试驱动开发
Kent Beck写的一本关于在代码之前编写测试的书.

使用命令行界面运行测试

test包可以作为脚本运行,以驱动Python的regressiontest套件,这要归功于-m选项: python -m test 。发动机罩,它使用test.regrtest;在以前的Python版本中使用的调用 python -mtest.regrtest 仍然有效。单独运行脚本会自动开始在test包中运行所有回归测试。这样做是通过查找包中的所有模块,以test_开头,导入它们,并执行函数test_main()(如果存在)或加载测试viaunittest.TestLoader.loadTestsFromModule if test_main 不存在。要执行的测试的名称也可以传递给脚本。指定单一回归测试( python -m test test_spam )将最小化输出并且只打印测试是否通过或失败.

运行test直接允许可以使用哪些资源来设置。你这样做是使用-u命令行选项。指定all作为-u选项的值启用所有可能的资源: python -m test -uall 如果只需要一个资源(更常见的情况),可以在all之后列出不需要的以acomma分隔的资源列表。命令 python -m test -uall,-audio,-largefile 将运行test除了audiolargefile资源以外的所有资源。有关所有资源和更多命令行选项的列表,请运行 python -m test -h .

执行回归测试的其他一些方法取决于正在执行的测试平台。在Unix上,你可以运行 make test 在构建Python的顶级目录中。在Windows上,从目录执行rt.batPCbuild将运行回归测试.

test.support – Python测试套件的实用工具

test.support模块为Python回归测试套件提供支持.

注意

test.support不是公共模块。这里记录了帮助Python开发人员编写测试。此模块的API可能会发生变化,而不会在发布之间出现向后兼容性问题.

该模块定义了以下例外:

exception test.support.TestFailed

测试失败时引发异常。不赞成使用unittest基于测试和unittest.TestCase断言方法

exception test.support.ResourceDenied

的子类unittest.SkipTest。当资源(例如网络连接)不可用时引发。由requires()功能

引发test.support模块定义了以下常量:

test.support.verbose

True何时启用详细输出。当需要关于正在运行的测试的更详细信息时,应该检查。verbose是由test.regrtest.

test.support.is_jython

True设置的,如果正在运行的翻译是Jython.

test.support.is_android

True如果系统是Android.

test.support.unix_shell

Path for shell,如果不是在Windows上;否则None.

test.support.FS_NONASCII

os.fsencode().

test.support.TESTFN

设置为可安全用作临时文件名称的名称。创建的任何临时文件应该关闭并取消链接(删除).

test.support.TESTFN_UNICODE

设置为临时文件的非ASCII名称.

test.support.TESTFN_ENCODING

设置为sys.getfilesystemencoding().

test.support.TESTFN_UNENCODABLE

设置为文件系统(str类型),不能通过严格模式下的文件系统编码进行编码。可能是None如果不能生成这样的文件名

test.support.TESTFN_UNDECODABLE

设置为文件名(字节类型),该文件名不能通过严格模式下的文件系统编码进行解码。如果生成这样的文件名是不可能的None

test.support.TESTFN_NONASCII

设置为包含FS_NONASCII字符的文件名

test.support.IPV6_ENABLED

设置为True如果在此主机上启用了IPV6,False否则

test.support.SAVEDCWD

//调成 os.getcwd().

test.support.PGO

设置何时可以跳过测试,当它们对PGO无用时

test.support.PIPE_MAX_SIZE

一个可能大于底层OS管道缓冲区大小的常量,使写入阻塞.

test.support.SOCK_MAX_SIZE

一个可能大于底层操作系统套接字缓冲区大小的常量,使写入阻塞.

test.support.TEST_SUPPORT_DIR

设置到包含test.support.

test.support.TEST_HOME_DIR

设置为测试包的顶级目录.

test.support.TEST_DATA_DIR

设置到测试包中的data目录.

test.support.MAX_Py_ssize_t

设置为sys.maxsize进行大内存测试。

test.support.max_memuse

通过设置 set_memlimit()作为大内存测试的内存限制。由限制MAX_Py_ssize_t.

test.support.real_max_memuse

通过设置 set_memlimit()作为大内存测试的内存限制。不受MAX_Py_ssize_t.

test.support.MISSING_C_DOCSTRINGS

返回True如果在CPython上运行,而不是在Windows上运行,并且配置没有设置WITH_DOC_STRINGS.

test.support.HAVE_DOCSTRINGS

检查是否存在docstrings.

test.support模块定义了以下功能:

test.support.forgetmodule_name

删除名为module_name来自sys.modules并删除模块的任意编译文件.

test.support.unloadname

删除name来自sys.modules.

打电话os.unlink()filename。在Windows平台上,这将包含一个等待循环来检查文件的存在.

test.support.rmdir(filename)

Call os.rmdir() on filename。在Windows平台上,这包含一个等待循环来检查文件的存在.

test.support.rmtree(path)

Call shutil.rmtree() on path或致电os.lstat()os.rmdir()删除路径及其内容。在Windows平台上,它包含一个等待循环来检查文件的存在.

test.support.make_legacy_pyc (source )

将PEP 3147/488 pyc文件移动到其旧的pyc位置,并将文件系统路径返​​回到旧的pyc文件。sourcevalue是源文件的系统文件。它不需要存在,但PEP3147 / 488 pyc文件必须存在.

test.support.is_resource_enabled(resource)

返回True如果resource已启用且可用。可用资源列表仅在test.regrtest正在执行测试.

test.support.python_is_optimized

返回True如果Python不是用-O0要么 -Og.

test.support.with_pymalloc

返回_testcapi.WITH_PYMALLOC.

test.support.requiresresource, msg=None

举起ResourceDenied如果resource不可用。msgResourceDenied如果它被提出。总是回来True如果被一个 的函数调用__name__"__main__"。在test.regrtest.

test.support.system_must_validate_certf)执行测试时使用

在TLS认证验证失败时提升unittest.SkipTest.

test.support.sortdict(dict

用钥匙排序dict的回复

test.support.findfile// (filename, subdir=None)

返回名为filename的文件的路径。如果没有找到匹配filename返回。这不等于失败,因为它可能是文件的路径.

设置subdir表示用于查找文件管理器的相对路径,而不是直接查看路径目录.

test.support.create_empty_file (filename)

filename创建一个空文件。如果已经存在,请将其截断.

test.support.fd_count (

计算打开文件描述符的数量.

test.support.match_testtest

比赛 test到中设置的图案set_match_tests().

test.support.set_match_testspatterns

使用正则表达式定义匹配测试patterns.

test.support.run_unittest*classes

执行 unittest.TestCase子类传递给函数。该函数扫描类中以前缀test_开头的方法并单独执行测试.

将字符串作为参数传递也是合法的;这些应该是sys.modules中的键。每个相关模块将由unittest.TestLoader.loadTestsFromModule()扫描。这通常见于以下test_main()功能:

def test_main():    support.run_unittest(__name__)

这将运行在命名模块中定义的所有测试.

test.support.run_doctest (module, verbosity=None, optionflags=0

运行doctest.testmod()在给定的module。返回(failure_count, test_count).

如果verbosityNone, doctest.testmod()用verbosityset运行到verbose。否则,运行时将详细程度设置为None. optionflags作为optionflags传递给doctest.testmod().

test.support.setswitchintervalinterval

设置sys.setswitchinterval()给定的interval。定义Android系统的最小间隔以防止系统挂起.

test.support.check_impl_detail (**guards)

使用此检查来保护CPython的特定于实现的测试或仅在实现时执行由参数保护:

check_impl_detail()               # Only on CPython (default).check_impl_detail(jython=True)    # Only on Jython.check_impl_detail(cpython=False)  # Everywhere except CPython.
test.support.check_warnings*filters, quiet=True

warnings.catch_warnings()的便利包装器,可以重复测试是否正确引发了警告。调用warnings.catch_warnings(record=True)warnings.simplefilter()设置为always并使用选项自动验证记录的结果大致相等.

check_warnings接受2元组的形成("message regexp",WarningCategory)作为位置参数。如果提供了一个或多个filters,或者可选的关键字参数quietFalse,它会检查以确保警告符合预期:每个指定的过滤器必须至少匹配由附带的代码或测试引发的警告中的至少一个失败,并且如果引发的任何警告与任何指定的过滤器都不匹配,则测试失败。要禁用第一个检查,请将quiet设置为True.

如果未指定任何参数,则默认为:

check_warnings(("", Warning), quiet=True)

在这种情况下,将捕获所有警告并且不会引发任何错误.

进入上下文管理员后,回复了WarningRecorder实例。来自catch_warnings()的基本警告列表可通过记录器对象的warnings属性获得。为方便起见,也可以通过记录器对象直接访问表示最近警告的对象的属性(参见下面的示例)。如果没有引发警告,那么代表警告的对象所期望的任何属性都将返回None.

记录器对象也有一个reset()方法,它清除了警告列表.

上下文管理器的设计是这样使用的:

with check_warnings(("assertion is always true", SyntaxWarning),                    ("", UserWarning)):    exec("assert(False, "Hey!")")    warnings.warn(UserWarning("Hide me!"))

在这种情况下,如果没有提出任何警告,或者其他警告被警告,则check_warnings()会引发错误.

测试需要更深入地查看警告时,而不是仅仅检查它们是否发生,可以使用这样的代码:

with check_warnings(quiet=True) as w:    warnings.warn("foo")    assert str(w.args[0]) == "foo"    warnings.warn("bar")    assert str(w.args[0]) == "bar"    assert str(w.warnings[0].args[0]) == "foo"    assert str(w.warnings[1].args[0]) == "bar"    w.reset()    assert len(w.warnings) == 0

这里将捕获所有警告,测试代码直接测试捕获的警告.

在版本3.2中更改:新的可选参数filtersquiet.

test.support.check_no_resource_warningtestcase

上下文管理器检查是否没有引发ResourceWarning。你必须在上下文管理器的末端之前删除可能发出ResourceWarning的对象.

test.support.set_memlimit (limit)

设置max_memuse的值和real_max_memuse用于大记忆测试.

test.support.record_original_stdoutstdout

存储stdout。它意味着在regrtest开始的时候举行stdout

test.support.get_original_stdout

返回record_original_stdout()要么sys.stdout如果没有设置的话

test.support.strip_python_strerrstderr)

从解释器的潜在调试输出中找出Python进程的stderr。这通常会在subprocess.Popen.communicate().

test.support.args_from_interpreter_flags

返回一个命令行参数列表,重现sys.flagssys.warnoptions.

test.support.optim_args_from_interpreter_flags)中的当前设置

返回一个命令行参数列表,重现当前的优化sys.flags.

test.support.captured_stdin
test.support.captured_stdout
test.support.captured_stderr

io.StringIO宾语。

使用输出流的示例:

with captured_stdout() as stdout, captured_stderr() as stderr:    print("hello")    print("error", file=sys.stderr)assert stdout.getvalue() == "hello\n"assert stderr.getvalue() == "error\n"

使用输入流的示例:

with captured_stdin() as stdin:    stdin.write("hello\n")    stdin.seek(0)    # call test code that consumes from sys.stdin    captured = input()self.assertEqual(captured, "hello")
test.support.temp_dirpath=None, quiet=False

pathandyields目录.

如果pathNone,使用tempfile.mkdtemp()。如果quietFalse,上下文管理器在错误上引发异常。否则,如果指定了path并且无法创建,则只发出警告.

test.support.change_cwd (path, quiet=False )

一个上下文管理器暂时将当前工作目录更改为path并生成目录.

如果quietFalse,上下文管理器引发异常错误。否则,它只发出警告并保持当前工作目录相同.

test.support.temp_cwd (name=”tempcwd”, quiet=False )

临时管理器临时创建一个新目录并更改当前工作目录(CWD).

上下文管理器在当前目录中创建一个临时目录,名称为name暂时更改当前工作目录之前。如果nameNone,则使用tempfile.mkdtemp().

创建临时目录。如果quietFalse并且无法创建或更改CWD,会引发错误。否则,只会发出警告并使用原来的CWD .

test.support.temp_umask (umask )

临时设置进程的上下文管理器umask.

test.support.transient_internet(resource_name, *, timeout=30.0, errnos=())

当互联网连接出现各种问题时,上下文管理器会引发ResourceDeniedexceptions.

test.support.disable_faulthandler

sys.stderrsys.__stderr__.

test.support.gc_collect取代

强制收集尽可能多的对象。这是必需的,因为垃圾收集器无法保证及时释放。这意味着__del__方法的调用时间可能比预期的要晚,而且弱反应可能比预期的还要长.

test.support.disable_gc)

垃圾收集器一旦进入,就可以退出.

test.support.swap_attrobj, attr, new_val)

用新的物体交换一个属性的文本管理器.

使用:

with swap_attr(obj, "attr", 5):    ...

这将在obj.attr块的持续时间内将with设置为5,恢复块末尾的旧值。如果attr不在obj上,它将被创建,然后在块的末尾删除.

旧值(或None如果它不存在)将被分配到“as”子句的目标,如果有一个.

test.support.swap_item (obj, attr, new_val)

翻译项目与一个新的对象.

使用

with swap_item(obj, "item", 5):    ...

这将在obj["item"]块的持续时间内将with设置为5,在结束时恢复旧值块。如果item的上下文管理器不在obj,它会在块的末尾创建然后删除.

旧值(或None如果它不存在)将被分配到“as”子句的目标,如果有一个.

test.support.wait_threads_exit (timeout=60.0)

文本管理器等到所有在with statementexit.

test.support.start_threads(threads, unlock=None)

上下文管理器启动threads。它尝试加入线程uponexit.

test.support.calcobjsize(fmt)

返回struct.calcsize()nP{fmt}0n或者,如果gettotalrefcount存在,2PnP{fmt}0P.

test.support.calcvobjsizefmt

返回struct.calcsize() nPn{fmt}0n或者,如果gettotalrefcount存在,2PnPn{fmt}0P.

test.support.checksizeoftest, o, size

对于测试用例test,断言sys.getsizeofo加上GCheader大小等于size.

返回True如果操作系统支持符号链接,Falseotherwise.

test.support.can_xattr

返回True如果操作系统支持xattr,Falseotherwise.

用于运行需要支持的测试的装饰器象征性的链接.

@test.support.skip_unless_xattr

在Mac OS X上运行测试时,运行需要支持xattr.

@test.support.skip_unless_bind_unix_socket

用于运行测试的装饰器,需要Unixsockets的功能bind()

@test.support.anticipate_failurecondition)

装饰器用unittest.expectedFailure()有条件地标记测试。任何使用这个装饰器都应该有一个相关的注释来识别相关的跟踪器问题.

@test.support.run_with_localecatstr, *locales)

一个装饰器,用于在不同的语言环境中运行一个函数,在它之后正确地重置它已完成。catstr是区域设置类别asa string(例如"LC_ALL")。传递的locales将按顺序尝试,并且将使用第一个有效的语言环境.

@test.support.run_with_tz (tz)

用于在特定地方运行函数的装饰器时区,完成后正确设置.

@test.support.requires_freebsd_version(*min_version)

在FreeBSD上运行测试时的最低版本。如果FreeBSD版本低于最小值,则在Linux上运行测试时,将unittest.SkipTest.

@test.support.requires_linux_version*min_version

装饰器提升为最低版本。如果Linux版本小于最小版本,请加注unittest.SkipTest.

@test.support.requires_mac_version*min_version

Decorator以获得最低版本的测试的装饰器。如果MAC OS X版本小于最小版本,则引发unittest.SkipTest.

@test.support.requires_IEEE_754

用于在非IEEE 754平台上跳过测试的装饰器.

@test.support.requires_zlib

如果zlib不存在,则跳过测试的装饰器.

@test.support.requires_gzip

如果gzip跳过测试的装饰器不存在.

@test.support.requires_bz2

如果bz2不存在则跳过测试的装饰者.

@test.support.requires_lzma

如果lzma不存在,则跳过测试的装饰者.

@test.support.requires_resourceresource

如果resource不可用,则跳过测试的装饰者.

@test.support.requires_docstrings

装饰器只运行测试如果HAVE_DOCSTRINGS.

@test.support.cpython_onlytest

装饰器测试只适用于CPython.

@test.support.impl_detail(msg=None, **guards)

装饰者在check_impl_detail()上调用guards。如果那回复False,然后使用msg作为跳过测试的原因.

@test.support.no_tracingfunc

装饰者在测试期间暂时关闭跟踪.

@test.support.refcount_testtest

用于测试的装饰器,涉及参考计数。如果它不是由CPython运行,装饰器不会运行测试。在测试期间不设置任何跟踪功能,以防止由跟踪功能引起的意外重新计数.

@test.support.reap_threadsfunc

装饰器确保即使测试失败也能清理线程.

@test.support.bigmemtestsize, memuse, dry_run=True

装饰师为bigmem测试.

size是测试所要求的大小(在任意的,测试解释的单元中。)memuse是测试的每个单位的字节数,或者是它的goodetimate。例如,需要两个字节缓冲区(4 GiBeach)的测试可以用@bigmemtest(size=_4G, memuse=2).

size参数通常作为anextra参数传递给装饰测试方法。如果dry_runTrue,传递给testmethod的值可能小于请求的值。如果dry_runFalse,如果没有指定-M,则表示测试不支持虚拟运行.

@test.support.bigaddrspacetest (f)

用于填充地址空间的测试的装饰器。f是函数towrap.

test.support.make_bad_fd ()

通过打开和关闭临时文件并返回其描述符来创建无效的文件描述符.

test.support.check_syntax_error (testcase, statement, errtext=””, *, lineno=None, offset=None)

statement中检查语法错误试图编辑statement.testcaseunittest测试的实例。errtextSyntaxError引起的错误的文字。如果lineno不是None,则与SyntaxError的行进行比较。如果offset不是None,则比较SyntaxError.

test.support.open_urlresourceurl, *args, **kw

打开url。如果打开失败,加注TestFailed.

test.support.import_modulename, deprecated=False, *, required_on()

此函数导入并返回指定的模块。与普通进口不同,此功能提升unittest.SkipTest如果模块无法导入.

在此导入期间,模块和包弃用消息被抑制deprecatedTrue。如果某个平台上需要一个模块,但对于其他平台是必需的,请设置required_on到一个可迭代的平台前缀,它将与sys.platform.

版本3.1.

test.support.import_fresh_modulename, fresh=(), blocked=(), deprecated=False

此函数在导入之前通过从sys.modules删除命名模块来导入并返回指定Python模块的全新副本。注意,与reload()不同,原始模块不受此操作的影响.

fresh是一个可迭代的附加模块名称,在执行导入之前也会从sys.modules缓存中删除.

blocked是一个可替换的模块名称,用None替换在导入期间在模块缓存中确保导入它们的尝试提升ImportError.

在开始导入之前保存命名模块和freshblocked参数中指定的任何模块然后在新导入完成时重新插入sys.modules

在此导入过程中,模块和包弃用消息被抑制deprecatedTrue.

此函数将引发ImportError如果指定的模块不能导入的话

例如使用:

# Get copies of the warnings module for testing without affecting the# version being used by the rest of the test suite. One copy uses the# C implementation, the other is forced to use the pure Python fallback# implementationpy_warnings = import_fresh_module("warnings", blocked=["_warnings"])c_warnings = import_fresh_module("warnings", fresh=["_warnings"])

版本3.1.

test.support.modules_setup()

返回sys.modules.

test.support.modules_cleanupoldmodules

的副本除去oldmodulesencodings为了保留内部缓存.

test.support.threading_setup

返回当前线程数和悬空线程的副本.

test.support.threading_cleanup (*original_values)

清理original_values中未指定的线程。如果测试在后台运行线程,则设计为发出警告.

test.support.join_threadthread, timeout=30.0

加入threadtimeout。举起AssertionError如果在timeoutseconds.

test.support.reap_children

test_main每当子流程开始时。这将有助于确保在寻找refleak时没有多余的孩子(僵尸)留在tohog资源并产生问题.

test.support.get_attribute (obj, name)

得到一个属性,如果unittest.SkipTest被抬起AttributeError

test.support.bind_port// (sock, host=HOST)

将套接字绑定到空闲端口并返回端口号。依赖onephemeral端口以确保我们使用未绑定的端口。这是非常重要的,因为许多测试可能同时运行,尤其是在abuildbot环境中。如果sock.familyAF_INETsock.typeSOCK_STREAM套接字上有SO_REUSEADDRSO_REUSEPORT设置。测试不应该为TCP / IP套接字设置这些套接字选项。设置这些选项的唯一情况是测试多个UDP套接字的多播.

此外,如果SO_EXCLUSIVEADDRUSE套接字选项可用(即在Windows上),它将在套接字上设置。这将防止其他任何人在测试期间绑定到我们的主机/端口.

test.support.bind_unix_socket(sock, addr)

绑一个unix插座,举起unittest.SkipTest如果PermissionError被抬起来

test.support.find_unused_portfamily=socket.AF_INET, socktype=socket.SOCK_STREAM)

回收一个应该适合绑定的未使用的端口。这是通过创建一个具有相同系列和类型的临时套接字sock参数(默认为AF_INET,SOCK_STREAM),并将其绑定到指定的主机地址(默认为0.0.0.0)来实现的将端口设置为0,从OS中引出一个未使用的短暂端口。然后关闭并删除临时套接字,并恢复临时端口.

这个方法或bind_port()应该用于服务器套接字需要绑定到特定端口以进行测试的任何测试。使用哪个测试取决于调用代码是创建Pythonsocket,还是需要在构造函数中提供未使用的端口传递到外部程序(即-accept参数toopenssl的s_server模式)。总是喜欢bind_port() over find_unused_port()在可能的情况。使用硬编码端口是因为它可以使多个测试实例无法同时进行,这对于buildbots来说是一个问题.

test.support.load_package_tests (pkg_dir, loader, standard_tests, pattern

用于测试包的unittest load_tests协议的通用实现。pkg_dir是包的根目录; loader, standard_testspatternload_tests。在简单的情况下,测试包的__init__.py可以是以下内容:

import osfrom test.support import load_package_testsdef load_tests(*args):    return load_package_tests(os.path.dirname(__file__), *args)
test.support.fs_is_case_insensitivedirectory

返回True如果文件系统为directory是案例敏感的.

test.support.detect_api_mismatch (ref_api, other_api, *, ignore=())

返回ref_apiother_api,除了在ignore.

中指定的此检查中要保留的已定义项目列表外,默认情况下,它会跳过以“_”开头的私有属性,但包括所有魔术方法,即以“__”开头和结尾的方法.

版本3.5中的新功能

test.support.patch// (test_instance, object_to_patch, attr_name, new_value)

object_to_patch.attr_name/new_value///另外addcleanup程序test_instanceobject_to_patch恢复attr_nameattr_name应该是object_to_patch.

test.support.run_in_subinterpcode)的有效属性

在子解释器中运行code。举起unittest.SkipTest如果tracemalloc启用了

test.support.check_free_after_iterating//(test, iter, cls, args=())

请说iter在迭代后被解除分配。

test.support.missing_compiler_executablecmd_names=[]

cmd_names时检查名称列在cmd_names的编译器可执行文件或所有编译器可执行文件是否存在是空的并返回第一个丢失的可执行文件或None当没有找到时丢错.

test.support.check__all__ (test_case, module, name_of_module=None, extra=(), blacklist=()

__all__变量module包含所有公共名称.

模块的公共名称(其API)是根据它们是否符合公共名称约定自动检测的,并在module.

中定义name_of_module参数可以指定(作为其字符串或元组)什么模块可以定义API以便被检测为publicAPI。一个例子是module从其他模块导入部分公共API,可能是C后端(如csv及其_csv).

extra参数可以是一组名称,否则将无法自动检测为“公共”,如没有正确的对象__module__属性。如果提供,它将被添加到自动检测到的.

blacklist参数可以是一组名称,即使它们的名称另有说明,也不能将其视为公共API的一部分.

使用示例:

import barimport fooimport unittestfrom test import supportclass MiscTestCase(unittest.TestCase):    def test__all__(self):        support.check__all__(self, foo)class OtherTestCase(unittest.TestCase):    def test__all__(self):        extra = {"BAR_CONST", "FOO_CONST"}        blacklist = {"baz"}  # Undocumented name.        # bar imports part of its API from _bar.        support.check__all__(self, bar, ("bar", "_bar"),                             extra=extra, blacklist=blacklist)

版本3.6.

test.supportmodule定义了以下类:

class test.support.TransientResourceexc, **kwargs

实例是一个上下文管理器,它会引发ResourceDenied如果引发了指定的异常类型。任何关键字参数都被视为属性/值对,以与with声明。只有当所有对匹配正确对抗异常时,才会ResourceDenied凸起

class test.support.EnvironmentVarGuard

用于临时设置或取消设置环境变量的类。实例可以用作上下文管理器,并具有完整的字典界面,用于查询/修改底层os.environ。从文本管理器退出后,对所有通过此实例完成的环境变量的更改将被回滚.

在版本3.1中更改:添加了字典界面.

EnvironmentVarGuard.setenvvar, value

暂时将环境变量envvar设置为value.

EnvironmentVarGuard.unsetenvvar

的值暂时取消设置环境变量envvar.

class test.support.SuppressCrashReport

上下文管理器用于尝试防止在预期会导致子进程崩溃的测试上出现崩溃对话框弹出窗口.

在Windows上,它使用SetErrorMode.

在UNIX上,resource.setrlimit()习惯用来设置resource.RLIMIT_CORE软限制为0以防止核心转储文件的创建.

在这两个平台上,旧值由__exit__().

class test.support.CleanImport*module_names

用于强制导入以返回新模块引用的上下文管理器。这对于测试模块级行为很有用,例如在导入时发出一个DeprecationWarning。用法示例:

with CleanImport("foo"):    importlib.import_module("foo")  # New reference.
class test.support.DirsOnSysPath*paths

一个上下文管理器暂时将目录添加到sys.path.

这是一个sys.path的副本,附加给定位置参数的任何目录,然后恢复sys.path当上下文结束时复制设置.

注意all sys.path文本管理器正文中的修改,包括替换对象,将在块结束时恢复.

class test.support.SaveSignals

用于保存和恢复由Python signalhandler注册的信号处理程序的类

class test.support.Matcher
matchesself, d, **kwargs

尝试将单个dict与提供的参数匹配.

match_valueself, k, dv, v

尝试匹配单个存储值(dv)和提供的值(v).

class test.support.WarningsRecorder

Class用于记录单元测试的警告。有关详细信息,请参阅上面check_warnings()的文档.

class test.support.BasicTestRunner
run (test )

test并返回结果.

class test.support.TestHandlerlogging.handlers.BufferingHandler

记录支持类

class test.support.FakePathpath

简单路径对象。它实现了__fspath__()只返回path论点。如果path是一个例外,它将在__fspath__().

test.support.script_helper中引发 – 用于Python执行测试的工具

test.support.script_helper模块提供对Python’脚本执行的支持tests.

test.support.script_helper.interpreter_requires_environment()

返回True如果sys.executable interpreter所需的环境变量以便能够运行

这是为了与@unittest.skipIf()一起使用来注释测试需要用assert_python*()函数启动isolatedmode(-I)或没有环境模式(-E)子解释器进程.

正常构建&测试不会遇到这种情况但是当尝试从解释器运行标准库测试套件时会发生这种情况,因为解释器没有Python的当前主页查找逻辑的显而易见的家.

设置PYTHONHOME是让大多数测试套件在这种情况下运行的一种方法。PYTHONPATHPYTHONUSERSITE是可能影响解释器是否可以启动的其他常见环境变量.

test.support.script_helper.run_python_until_end*args, **env_vars

基于env_vars设置环境,以便在子进程中运行解释器。值可以包括__isolated, __cleanenv,__cwdTERM.

test.support.script_helper.assert_python_ok*args, **env_vars

断言用args和可选的环境变量env_vars成功(rc == 0)并返回(return code,stdout, stderr)元组

如果设置了__cleanenv关键字,env_vars用作新鲜环境

Python以隔离模式启动(命令行选项-I),除非__isolated关键字设置为False.

test.support.script_helper.assert_python_failure*args, **env_vars

断言用args和可选的环境变量env_vars失败(rc != 0)并返回(return code,stdout, stderr)元组

查看assert_python_ok()以获取更多选项.

test.support.script_helper.spawn_python*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw

使用给定的参数运行Python子进程.

kw是传递给subprocess.Popen()的额外关键字args。返回一个subprocess.Popen object.

test.support.script_helper.kill_python(p)

运行给定的subprocess.Popen进程直到完成并返回到了

test.support.script_helper.make_script//(script_dir, script_basename, source, omit_suffix=False

创建包含source在路径script_dirscript_basename。如果omit_suffixFalse,请附上.py。返回全文路径

test.support.script_helper.make_zip_script// (zip_dir, zip_basename, script_name, name_in_zip=None)

zip_dirzip_basename创建拉链文件,加上zip其中包含script_name. name_in_zip中的文件是归档名称。返回一个包含(full path, full path of archive name).

test.support.script_helper.make_pkgpkg_dir, init_source=””)的元组

创建一个名为pkg_dir的目录一个__init__文件以init_source为内容.

test.support.script_helper.make_zip_pkg (zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False)

创建一个路径为zip_dirzip_basename含空__init__文件和文件script_basename包含source。如果compiledTrue,两个源文件都将被编译并添加到zip包中。返回完整zippath的元组和zip文件的存档名称.

评论被关闭。