Pytest官方教程-22-API参考-Fixtures
目录:
- 安装及入门
- 使用和调用方法
- 原有TestSuite使用方法
- 断言的编写和报告
- Pytest fixtures:清晰 模块化 易扩展
- 使用Marks标记测试用例
- Monkeypatching/对模块和环境进行Mock
- 使用tmp目录和文件
- 捕获stdout及stderr输出
- 捕获警告信息
- 模块及测试文件中集成doctest测试
- skip及xfail: 处理不能成功的测试用例
- Fixture方法及测试用例的参数化
- 缓存: 使用跨执行状态
- unittest.TestCase支持
- 运行Nose用例
- 经典xUnit风格的setup/teardown
- 安装和使用插件
- 插件编写
- 编写钩子(hook)方法
- 运行日志
- API参考
- 优质集成实践
- 片状测试
- Pytest导入机制及sys.path/PYTHONPATH
- 配置选项
- 示例及自定义技巧
- Bash自动补全设置
22-API参考-03-Fixtures
API参考-Fixtures
装置(Fixtures)
教程:pytest fixtures:显式,模块化,可扩展。
测试函数或其他Fixtures通过将它们声明为参数名称来RequestFixtures。
需要Fixtures的测试示例:
def test_output(capsys):
print("hello")
out, err = capsys.readouterr()
assert out == "hello\n"
需要另一个Fixtures的Fixtures示例:
@pytest.fixture
def db_session(tmpdir):
fn = tmpdir / "db.file"
return connect(str(fn))
有关更多详细信息,请参阅完整的灯具文档。
@ pytest.fixture
装饰器标记Fixtures工厂方法。
可以使用该装饰器(带或不带参数)来定义Fixtures方法。
稍后可以引用fixture函数的名称,以便在运行测试之前调用它:测试模块或类可以使用pytest.mark.usefixtures(fixturename)
标记。
测试函数可以直接使用Fixtures名称作为输入参数,在这种情况下,将注入从Fixtures函数返回的Fixtures实例。
Fixtures可以使用return
或yield
语句为测试函数提供它们的值。无论测试结果如何,yield
在yield
语句作为拆卸代码执行后使用代码块时,必须只生成一次。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
-
范围 -
指此Fixtures共享范围的一个"function"
(默认), ,,"class"
或。"module"``"package"``"session"
"package"
在这个时候被认为是实验性的。 - params - 一个可选的参数列表,它将导致多次调用fixture函数和使用它的所有测试。
- autouse - 如果为True,则为所有可以看到它的测试**fixture命令。如果为False(默认值),则需要显式引用来**Fixtures。
- ids - 每个对应于参数的字符串ID列表,以便它们是测试ID的一部分。如果没有提供id,它们将从params自动生成。
-
name - 灯具的名称。这默认为装饰函数的名称。如果Fixtures在定义它的同一模块中使用,Fixtures的方法名称将被RequestFixtures的方法arg遮蔽; 解决此问题的一种方法是命名装饰函数
fixture_<fixturename>
,然后使用@pytest.fixture(name='<fixturename>')
。
|
config.cache的
教程:缓存:使用跨testrun状态。
该config.cache
对象允许其他插件和Fixtures在测试运行中存储和检索值。要从灯具Request访问它pytestconfig
到你的灯具并得到它pytestconfig.cache
。
在引擎盖下,缓存插件使用stdlib模块的简单 dumps
/ loads
API json
。
返回给定键的缓存值。如果尚未缓存任何值或无法读取值,则返回指定的默认值。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
-
key - 必须是
/
分隔值。通常,名字是你的插件或你的应用程序的名称。 -
default - 必须在缓存未命中或缓存值无效的情况下提供。
|
保存给定**的值。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
-
key - 必须是
/
分隔值。通常,名字是你的插件或你的应用程序的名称。 -
value - 必须是基本python类型的任意组合,包括嵌套类型,例如字典列表。
|
返回具有给定名称的目录路径对象。如果该目录尚不存在,则将创建该目录。你可以使用它来管理文件,例如跨测试会话存储/检索数据库转储。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | name - 必须是不包含/
分隔符的字符串。确保该名称包含你的插件或应用程序标识符,以防止与其他缓存用户冲突。 |
capsys
启用对sys.stdout
和的写入文本捕获sys.stderr
。
捕获的输出通过capsys.readouterr()
方法调用提供,方法调用返回一个namedtuple。 并且将对象。(out, err)``out``err``text
返回的实例CaptureFixture
。
例:
def test_output(capsys):
print("hello")
captured = capsys.readouterr()
assert captured.out == "hello\n"
目的是通过恢复capsys()
,capsysbinary()
,capfd()
和capfdbinary()
灯具。
到目前为止,读取并返回捕获的输出,重置内部缓冲区。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 返回: | 捕获内容作为带有out
和err
字符串属性的namedtuple |
暂时禁用“with”块内的捕获。
capsysbinary
启用字节捕获写入sys.stdout
和sys.stderr
。
捕获的输出通过capsysbinary.readouterr()
方法调用提供,方法调用返回一个namedtuple。 并且将对象。(out, err)``out``err``bytes
返回的实例CaptureFixture
。
例:
def test_output(capsysbinary):
print("hello")
captured = capsysbinary.readouterr()
assert captured.out == b"hello\n"
capfd
允许写的文字捕捉到文件描述符1
和2
。
捕获的输出通过capfd.readouterr()
方法调用提供,方法调用返回一个namedtuple。 并且将对象。(out, err)``out``err``text
返回的实例CaptureFixture
。
例:
def test_system_echo(capfd):
os.system('echo "hello"')
captured = capsys.readouterr()
assert captured.out == "hello\n"
capfdbinary
启用字节捕获文件描述符1
和2
。
捕获的输出通过capfd.readouterr()
方法调用提供,方法调用返回一个namedtuple。 并且将对象。(out, err)``out``err``byte
返回的实例CaptureFixture
。
例:
def test_system_echo(capfdbinary):
os.system('echo "hello"')
captured = capfdbinary.readouterr()
assert captured.out == b"hello\n"
doctest_namespace
返回一个dict
将被注入doctests命名空间的Fixture。
通常这个Fixtures与另一个autouse
Fixtures一起使用:
@pytest.fixture(autouse=True)
def add_np(doctest_namespace):
doctest_namespace["np"] = numpy
有关更多详细信息:'doctest_namespace'Fixtures。
Request
教程:根据命令行选项将不同的值传递给测试函数。
该request
Fixtures是一个特殊的Fixtures提供Request测试方法的信息。
从测试或Fixtures方法RequestFixtures。
Request对象提供对Request测试上下文的访问,并且具有可选param
属性,以防Fixtures间接参数化。
正在执行此Request的Fixtures
范围字符串,“方法”,“类”,“模块”,“会话”之一
此Request中所有活动灯具的名称
底层集合节点(取决于当前Request范围)
与此Request关联的pytest配置对象。
如果Request具有按方法范围,则测试函数对象。
收集测试函数的class(可以是None)。
收集测试函数的实例(可以是None)。
收集测试函数的python模块对象。
收集此测试的测试模块的文件系统路径。
底层节点的关键字/标记字典。
pytest会话对象。
在Request测试上下文完成执行的最后一次测试之后添加要调用的终结器/拆卸函数。
将标记应用于单个测试函数调用。如果你不希望在所有函数调用中都有关键字/标记,则此方法很有用。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | marker - _pytest.mark.MarkDecorator
通过调用创建的对象pytest.mark.NAME(...)
。 |
使用给定的消息引发FixtureLookupError。
动态运行命名Fixtures方法。
建议尽可能通过函数参数声明灯具。但是,如果你只能在测试设置时决定是否使用其他Fixtures,则可以使用此方法在Fixtures或测试方法体内检索它。
不推荐使用,请使用getfixturevalue。
pytestconfig
返回_pytest.config.Config
对象的会话范围的fixture 。
例:
def test_foo(pytestconfig):
if pytestconfig.getoption("verbose") > 0:
...
record_property
教程:record_property。
为调用测试添加额外的属性。用户属性成为测试报告的一部分,可供配置的报告者使用,如JUnit XML。该fixture可以调用,其值自动进行xml编码。(name, value)
例:
def test_function(record_property):
record_property("example_key", 1)
caplog
教程:记录。
访问和控制日志捕获。
通过以下属性/方法可以获取捕获的日志:
string containing formatted log output
* caplog.records -> list of logging.LogRecord instances
* caplog.record_tuples -> list of (logger_name, level, message) tuples
* caplog.clear() -> clear captured records and formatted log output string
这将返回一个_pytest.logging.LogCaptureFixture
实例。
提供对日志捕获的访问和控制。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 返回类型: | LogCaptureHandler |
获取其中一个可能的测试阶段的日志记录。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | when(str) - 从哪个测试阶段获取记录。有效值为:“setup”,“call”和“teardown”。 |
| 返回类型: | 列表[ logging.LogRecord ] |
| 返回: | 在给定阶段捕获的记录列表 |
版本3.4中的新方法。
返回日志文本。
返回日志记录列表。
返回用于断言比较的日志记录的精简版本的列表。
元组的格式是:
(logger_name,log_level,message)
返回格式插值日志消息的列表。
与包含格式字符串和插值参数的“记录”不同,此列表中的日志消息都是内插的。与包含处理程序输出的“text”不同,此列表中的日志消息与级别,时间戳等一致,使得精确比较更可靠。
请注意,不包括回溯或堆栈信息(来自logging.exception()
或记录函数的<cite>exc_info</cite>或<cite>stack_info</cite>参数),因为这是由处理程序中的格式化程序添加的。
版本3.7中的新方法。
重置日志记录列表和捕获的日志文本。
设置捕获日志的级别。在测试结束时,该级别将恢复到之前的值。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
上下文管理器,用于设置捕获日志的级别。在'with'语句结束后,级别将恢复为其原始值。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
猴补丁
教程:Monkeypatching / mocking模块和环境。
返回的monkeypatch
fixture提供了这些辅助方法来修改对象,字典或os.environ:
monkeypatch.setattr(obj, name, value, raising=True)
monkeypatch.delattr(obj, name, raising=True)
monkeypatch.setitem(mapping, name, value)
monkeypatch.delitem(obj, name, raising=True)
monkeypatch.setenv(name, value, prepend=False)
monkeypatch.delenv(name, raising=True)
monkeypatch.syspath_prepend(path)
monkeypatch.chdir(path)
在Request测试方法或Fixtures完成后,所有修改都将被撤消。raising
如果设置/删除操作没有目标,则该参数确定是否将引发KeyError或AttributeError。
这将返回一个MonkeyPatch
实例。
monkeypatch
Fixtures返回的对象保留了setattr / item / env / syspath更改的记录。
上下文管理器返回一个新MonkeyPatch
对象,该对象撤消with
在退出时在块内完成的任何修补:
import functools
def test_partial(monkeypatch):
with monkeypatch.context() as m:
m.setattr(functools, "partial", 3)
在测试结束之前需要撤消一些补丁的情况下很有用,例如stdlib
模拟可能会在模拟时破坏pytest本身的函数(例如,参见#3290)。
在目标上设置属性值,记住旧值。如果该属性不存在,则默认引发AttributeError。
为方便起见,你可以指定一个字符串target
,将其解释为虚线导入路径,最后一部分是属性名称。示例: 将设置模块的方法。monkeypatch.setattr("os.getcwd", lambda:"/")``getcwd``os
该raising
值确定如果属性尚不存在,setattr是否应该失败(默认为True,这意味着它将引发)。
删除属性name
的target
,默认情况下提高AttributeError的它的属性,以前不存在的。
如果未name
指定且target
为字符串,则将其解释为虚线导入路径,最后一部分为属性名称。
如果raising
设置为False,则缺少属性时不会引发异常。
将字典条目设置name
为值。
name
从dict 删除。如果不存在则引发KeyError。
如果raising
设置为False,则如果缺少**,则不会引发异常。
将环境变量设置name
为value
。如果prepend
是字符,请读取当前环境变量值并value
在prepend
字符旁边添加前缀。
name
从环境中删除。如果不存在则引发KeyError。
如果raising
设置为False,则在缺少环境变量时不会引发异常。
前置path
到sys.path
导入位置列表。
将当前工作目录更改为指定的路径。Path可以是字符串或py.path.local对象。
撤消以前的更改。此调用使用撤消堆栈。除非你在撤消调用后执行更多monkeypatching,否则再次调用它无效。
通常不需要调用<cite>undo()</cite>,因为它在拆除期间会自动调用。
请注意,在单个测试函数调用中使用相同的<cite>monkeypatch</cite> fixture。如果测试函数本身和其中一个测试Fixtures同时使用<cite>monkeypatch</cite>,则调用<cite>undo()</cite>将撤消两个函数中所做的所有更改。
TESTDIR
此fixture提供了一个Testdir
对测试文件的黑盒测试有用的实例,使其成为测试插件的理想选择。
要使用它,请包含在最顶层的conftest.py
文件中:
pytest_plugins = 'pytester'
临时测试目录,带有测试/运行pytest本身的工具。
这是基于tmpdir
Fixtures,但提供了许多方法,有助于测试pytest本身。除非chdir()
使用,否则所有方法都将tmpdir
用作其当前工作目录。
属性:
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| TMPDIR: | py.path.local
临时目录的实例。 |
| 插件: | 与parseconfig()
和 一起使用的插件列表runpytest()
。最初这是一个空列表,但插件可以添加到列表中。要添加到列表中的项目类型取决于使用它们的方法,因此请参阅它们以获取详细信息。 |
清理全局状态工件。
一些方法修改全局解释器状态,这会尝试清除它。它不会删除临时目录,因此可以在测试运行完成后查看它。
HookRecorder
为PluginManager 创建一个新的。
cd进入临时目录。
这在实例化时自动完成。
在testdir中创建新文件。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
- ext(str) - 文件应使用的扩展名,包括点,例如<cite>.py</cite>。
- args(list* [ [str](https://docs.python.org/3/library/stdtypes.html#str "(在Python v3.7中)") ]*) - 所有args将被视为字符串并使用换行符连接。结果将作为内容写入文件。该文件的名称将基于Request此Fixtures的测试方法。
-
kwargs - 每个关键字都是文件的名称,而它的值将被写为文件的内容。
|
例子:
testdir.makefile(".txt", "line1", "line2")
testdir.makefile(".ini", pytest="[pytest]\naddopts=-rs\n")
使用'source'作为内容写一个contest.py文件。
使用'source'作为内容写一个tox.ini文件。
从tox.ini配置文件返回pytest部分。
.makefile()的扩展名为.py的快捷方式。
.makefile()的扩展名为.txt的快捷方式。
将目录添加到sys.path,默认为tmpdir
。
当该对象在每次测试结束时死亡时,会自动撤消。
创建一个新的(子)目录。
创建一个新的python包。
这会创建一个带有空__init__.py
文件的(子)目录,因此它被识别为python包。
在测试运行失败时发出停止信号。
发出中断的测试运行信号。
返回此集合节点的子项(项和收集器)列表。
返回文件的集合节点。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
-
config -
_pytest.config.Config
instance,查看parseconfig()
和parseconfigure()
创建配置 -
arg -
py.path.local
文件的一个实例
|
返回文件的集合节点。
这就好比getnode()
,但使用parseconfigure()
创建(配置)pytest配置实例。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: | path - py.path.local
文件的一个实例 |
从集合节点生成所有测试项。
这将递归到集合节点并返回其中包含的所有测试项的列表。
运行“test_func”项。
调用测试实例(包含测试方法的类)必须提供一个.getrunner()
方法,该方法应该返回一个可以为单个项运行测试协议的运行器,例如 _pytest.runner.runtestprotocol()
。
使用中运行测试模块pytest.main()
。
此运行将“source”写入临时文件并pytest.main()
在其上运行 ,返回HookRecorder
结果的实例。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
- source - 测试模块的源代码
-
cmdlineargs - 要使用的任何额外命令行参数
|
| 返回: |HookRecorder
结果的实例
|
pytest.main(['--collectonly'])
在进程中运行。
运行pytest.main()
函数在测试过程本身内运行所有pytest inline_run()
,但返回收集项和HookRecorder
实例的元组。
pytest.main()
在进程中运行,返回HookRecorder。
运行该pytest.main()
函数以在测试过程本身内运行所有pytest。这意味着它可以返回一个HookRecorder
实例,该 实例从该运行中提供比通过匹配stdout / stderr可以完成的更详细的结果 runpytest()
。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
-
args - 要传递给的命令行参数
pytest.main()
-
插件 - (仅限关键字)
pytest.main()
实例应使用的额外插件实例
|
| 返回: |
一个HookRecorder
实例
|
返回运行pytest in-process的结果,提供与self.runpytest()提供的类似的接口。
运行pytest内联或子进程,具体取决于命令行选项“-runpytest”并返回a RunResult
。
从给定的命令行args返回一个新的pytest Config实例。
这将调用_pytest.config中的pytest引导代码来创建一个新的_pytest.core.PluginManager
并调用pytest_cmdline_parse挂钩来创建一个新_pytest.config.Config
实例。
如果plugins
已经填充,则应该是要使用PluginManager注册的插件模块。
返回新的pytest配置的Config实例。
这会返回一个新_pytest.config.Config
实例 parseconfig()
,但也会调用pytest_configure挂钩。
返回测试项目以获得测试方法。
这会将源写入python文件并在生成的模块上运行pytest的集合,返回所Request的函数名称的测试项。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
- source - 模块源
-
funcname - 要为其返回测试项的测试函数的名称
|
返回从模块收集的所有测试项目。
这会将源写入python文件并在生成的模块上运行pytest的集合,返回其中包含的所有测试项。
返回模块集合节点source
。
这将写入source
文件makepyfile()
,然后在其上运行pytest集合,返回测试模块的集合节点。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
- source - 要收集的模块的源代码
-
configargs - 要传递给的任何额外参数
parseconfigure()
-
withinit - 是否也将
__init__.py
文件写入同一目录以确保它是一个包
|
从模块集合返回name的集合节点。
这将在模块集合节点中搜索与给定名称匹配的集合节点。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
-
modcol - 模块集合节点; 看到
getmodulecol()
-
name - 要返回的节点的名称
|
调用subprocess.Popen。
这会调用subprocess.Popen,确保当前工作目录在PYTHONPATH中。
你可能想要使用run()
。
运行带参数的命令。
使用subprocess.Popen运行进程保存stdout和stderr。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
- args - 传递给<cite>subprocess.Popen()</cite>的参数序列
-
timeout - 超时和提升之后的秒数
Testdir.TimeoutExpired
|
返回一个RunResult
。
使用sys.executable作为解释器运行python脚本。
返回一个RunResult
。
运行python -c“command”,返回一个RunResult
。
运行pytest作为具有给定参数的子进程。
添加到plugins
列表中的所有插件都将使用-p
命令行选项添加 。另外--basetemp
用于将任何临时文件和目录放在带有“runpytest-”前缀的编号目录中,以避免与临时文件和目录的正常编号pytest位置冲突。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |
- args - 传递给pytest子进程的参数序列
-
timeout - 超时和提升之后的秒数
Testdir.TimeoutExpired
|
返回一个RunResult
。
使用pexpect运行pytest。
这确保使用正确的pytest并设置临时目录位置。
pexpect孩子被退回。
使用pexpect运行命令。
pexpect孩子被退回。
运行命令的结果。
属性:
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 惩戒: | 返回值 |
| 大纲: | 从stdout捕获的行列表 |
| Errlines: | 从stderr捕获的行列表 |
| 标准输出: | LineMatcher
stdout,用于stdout.str()
重建stdout或常用stdout.fnmatch_lines()
方法 |
| 标准错误: | LineMatcher
stderr |
| 持续时间: | 持续时间(秒) |
从解析测试过程产生的终端输出返回outcometring-> num的字典。
断言在测试运行的文本输出中,指定的结果与相应的数字一起出现(0表示未发生)。
灵活的文本匹配。
这是一个测试大文本(例如命令输出)的便利类。
构造函数采用一系列行而没有它们的尾随换行符,即 text.splitlines()
。
返回整个原始文本。
使用任何顺序在输出中存在检查行。
使用检查线条fnmatch.fnmatch
。参数是必须以任何顺序出现在输出中的行列表。
输出中的检查行使用re.match
任何顺序。
参数是必须以任何顺序出现在输出中的行列表。
返回文本中给定行后面的所有行。
给定的行可以包含glob通配符。
使用搜索匹配的行搜索捕获的文本fnmatch.fnmatch
。
参数是必须匹配并且可以使用glob通配符的行列表。如果它们不匹配,则调用pytest.fail()。匹配和不匹配也打印在标准输出上。
使用搜索匹配的行搜索捕获的文本re.match
。
参数是必须匹配的行列表re.match
。如果它们不匹配,则调用pytest.fail()。
匹配和不匹配也打印在标准输出上。
再见
教程:使用警告方法发出警告
返回WarningsRecorder
记录测试函数发出的所有警告的实例。
有关警告类别的信息,请参阅http://docs.python.org/library/warnings.html。
用于记录引发警告的上下文管理器。
改编自<cite>warnings.catch_warnings</cite>。
记录的警告列表。
弹出第一个录制的警告,如果不存在则引发异常。
清除录制的警告列表。
每个记录的警告都是一个例子warnings.WarningMessage
。
注意RecordedWarning
在pytest 3.1中从普通类改为命名元组
注意DeprecationWarning
并且PendingDeprecationWarning
区别对待; 请参阅确保代码触发弃用警告。
tmp_path
教程:临时目录和文件
返回临时目录路径对象,该对象对于每个测试函数调用是唯一的,创建为基本临时目录的子目录。返回的对象是一个pathlib.Path
对象。
注意
在python <3.6中,这是一个pathlib2.Path
tmp_path_factory
教程:tmp_path_factoryFixturestmp_path_factory
实例有以下方法:
制作工厂管理的临时目录
返回基本临时目录。
TMPDIR
教程:临时目录和文件
返回临时目录路径对象,该对象对于每个测试函数调用是唯一的,创建为基本临时目录的子目录。返回的对象是py.path.local 路径对象。
tmpdir_factory
教程:'tmpdir_factory'Fixturestmpdir_factory
实例有以下方法:
创建基本临时目录的子目录并将其返回。如果numbered
,通过添加大于任何现有的数字前缀来确保该目录是唯一的。
向后compat装饰器 _tmppath_factory.getbasetemp
上一篇: 面试题39:数组中出现次数超过一半的数字