欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Pytest官方教程-22-API参考-Fixtures

程序员文章站 2024-02-27 15:49:51
...

目录:

  1. 安装及入门
  2. 使用和调用方法
  3. 原有TestSuite使用方法
  4. 断言的编写和报告
  5. Pytest fixtures:清晰 模块化 易扩展
  6. 使用Marks标记测试用例
  7. Monkeypatching/对模块和环境进行Mock
  8. 使用tmp目录和文件
  9. 捕获stdout及stderr输出
  10. 捕获警告信息
  11. 模块及测试文件中集成doctest测试
  12. skip及xfail: 处理不能成功的测试用例
  13. Fixture方法及测试用例的参数化
  14. 缓存: 使用跨执行状态
  15. unittest.TestCase支持
  16. 运行Nose用例
  17. 经典xUnit风格的setup/teardown
  18. 安装和使用插件
  19. 插件编写
  20. 编写钩子(hook)方法
  21. 运行日志
  22. API参考
    1. 方法(Functions)
    2. 标记(Marks)
    3. 钩子(Hooks)
    4. 装置(Fixtures)
    5. 对象(Objects)
    6. 特殊变量(Special Variables)
    7. 环境变量(Environment Variables)
    8. 配置选项(Configuration Options)
  23. 优质集成实践
  24. 片状测试
  25. Pytest导入机制及sys.path/PYTHONPATH
  26. 配置选项
  27. 示例及自定义技巧
  28. 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可以使用returnyield 语句为测试函数提供它们的值。无论测试结果如何,yieldyield语句作为拆卸代码执行后使用代码块时,必须只生成一次。
<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/ loadsAPI 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

教程捕获stdout / stderr输出

启用对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>
| 返回: | 捕获内容作为带有outerr字符串属性的namedtuple |

暂时禁用“with”块内的捕获。

capsysbinary

教程捕获stdout / stderr输出

启用字节捕获写入sys.stdoutsys.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

教程捕获stdout / stderr输出

允许写的文字捕捉到文件描述符12
捕获的输出通过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

教程捕获stdout / stderr输出

启用字节捕获文件描述符12
捕获的输出通过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

教程模块和测试文件的Doctest集成

返回一个dict将被注入doctests命名空间的Fixture。
通常这个Fixtures与另一个autouseFixtures一起使用:

@pytest.fixture(autouse=True)
def add_np(doctest_namespace):
    doctest_namespace["np"] = numpy

有关更多详细信息:'doctest_namespace'Fixtures

Request

教程根据命令行选项将不同的值传递给测试函数
requestFixtures是一个特殊的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>
| 参数: | whenstr) - 从哪个测试阶段获取记录。有效值为:“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>
| 参数: |

  • levelint) - 记录器到级别。
  • loggerstr) - 更新级别的记录器。如果未给出,则更新根记录器级别。
    |
    版本3.4中更改:此方法更改的记录器级别将在测试结束时恢复为其初始值。

上下文管理器,用于设置捕获日志的级别。在'with'语句结束后,级别将恢复为其原始值。
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 参数: |

  • levelint) - 记录器到级别。
  • loggerstr) - 更新级别的记录器。如果未给出,则更新根记录器级别。
    |

猴补丁

教程Monkeypatching / mocking模块和环境

返回的monkeypatchfixture提供了这些辅助方法来修改对象,字典或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实例。

monkeypatchFixtures返回的对象保留了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,这意味着它将引发)。

删除属性nametarget,默认情况下提高AttributeError的它的属性,以前不存在的。
如果未name指定且target为字符串,则将其解释为虚线导入路径,最后一部分为属性名称。
如果raising设置为False,则缺少属性时不会引发异常。

将字典条目设置name为值。

name从dict 删除。如果不存在则引发KeyError。
如果raising设置为False,则如果缺少**,则不会引发异常。

将环境变量设置namevalue。如果prepend 是字符,请读取当前环境变量值并valueprepend字符旁边添加前缀。

name从环境中删除。如果不存在则引发KeyError。
如果raising设置为False,则在缺少环境变量时不会引发异常。

前置pathsys.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本身的工具。
这是基于tmpdirFixtures,但提供了许多方法,有助于测试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>
| 参数: |

  • extstr) - 文件应使用的扩展名,包括点,例如<cite>.py</cite>。
  • argslist* [ [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>
| 参数: |

返回文件的集合节点。
这就好比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>
| 参数: |

使用pexpect运行pytest。
这确保使用正确的pytest并设置临时目录位置。
pexpect孩子被退回。

使用pexpect运行命令。
pexpect孩子被退回。

运行命令的结果。
属性:
<colgroup><col class="field-name" style="hyphens: manual;"><col class="field-body"></colgroup>
| 惩戒: | 返回值 |
| 大纲: | 从stdout捕获的行列表 |
| Errlines: | 从stderr捕获的行列表 |
| 标准输出: | LineMatcherstdout,用于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_factoryFixtures
tmp_path_factory 实例有以下方法:

制作工厂管理的临时目录

返回基本临时目录。

TMPDIR

教程临时目录和文件

返回临时目录路径对象,该对象对于每个测试函数调用是唯一的,创建为基本临时目录的子目录。返回的对象是py.path.local 路径对象。

tmpdir_factory

教程'tmpdir_factory'Fixtures
tmpdir_factory 实例有以下方法:

创建基本临时目录的子目录并将其返回。如果numbered,通过添加大于任何现有的数字前缀来确保该目录是唯一的。

向后compat装饰器 _tmppath_factory.getbasetemp