目录:
- 安装及入门
- 使用和调用方法
- 原有TestSuite使用方法
- 断言的编写和报告
- Pytest fixtures:清晰 模块化 易扩展
- 使用Marks标记测试用例
- Monkeypatching/对模块和环境进行Mock
- 使用tmp目录和文件
- 捕获stdout及stderr输出
- 捕获警告信息
- 模块及测试文件中集成doctest测试
- skip及xfail: 处理不能成功的测试用例
- Fixture方法及测试用例的参数化
- 缓存: 使用跨执行状态
- unittest.TestCase支持
- 运行Nose用例
- 经典xUnit风格的setup/teardown
- 安装和使用插件
- 插件编写
- 编写钩子(hook)方法
- 运行日志
- API参考
- 方法(Functions)
- 标记(Marks)
- 钩子(Hooks)
- 装置(Fixtures)
- 对象(Objects)
- 特殊变量(Special Variables)
- 环境变量(Environment Variables)
- 配置选项(Configuration Options)
- 优质集成实践
- 片状测试
- Pytest导入机制及sys.path/PYTHONPATH
- 配置选项
- 示例及自定义技巧
- Bash自动补全设置
模块及测试文件中集成doctest测试
默认情况下,Pytest按照python doctest
模块标准test*.txt
模式进行匹配。你也可以通过使用以下命令更改匹配模式:
pytest --doctest-glob='*.rst'
在命令行上。从版本开始2.9
,--doctest-glob
可以在命令行中多次使用。
3.1版中的新增功能:您可以使用doctest_encoding
ini选项指定将用于这些doctest文件的编码:
# content of pytest.ini
[pytest]
doctest_encoding = latin1
默认编码为UTF-8。
您还可以在所有python模块(包括常规python测试模块)中从docstrings触发doctests的运行:
pytest --doctest-modules
您可以将这些更改永久保存在项目中,方法是将它们放入pytest.ini文件中,如下所示:
# content of pytest.ini
[pytest]
addopts = --doctest-modules
如果你有一个这样的文本文件:
# content of example.rst
hello this is a doctest
>>> x = 3
>>> x
3
和另一个这样的:
# content of mymodule.py
def something():
""" a doctest in a docstring
>>> something()
42
"""
return 42
那么你可以在pytest
没有命令行选项的情况下调用:
$ pytest
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
collected 1 item
mymodule.py . [100%]
========================= 1 passed in 0.12 seconds =========================
可以使用getfixture
帮助器使用Fixture方法:
# content of example.rst
>>> tmp = getfixture('tmpdir')
>>> ...
>>>
此外,在执行文本doctest文件时,支持使用类,模块或项目中的Fixture和Autouse Fixture(类上的xUnit设置)Fixture。
标准doctest
模块提供了一些设置标志来配置doctest测试的严格性。在pytest中,您可以使用配置文件启用这些标志。要使pytest忽略尾随空格并忽略冗长的异常堆栈跟踪,您只需编写:
[pytest]
doctest_optionflags= NORMALIZE_WHITESPACE IGNORE_EXCEPTION_DETAIL
pytest还引入了新的选项,允许doctests在Python 2和Python 3中运行不变:
-
ALLOW_UNICODE
:启用时,u
前缀将从预期doctest输出中的unicode字符串中删除。 -
ALLOW_BYTES
:启用时,b
前缀将从预期doctest输出中的字节字符串中删除。
与任何其他选项标志一样,可以pytest.ini
使用doctest_optionflags
ini选项启用这些标志:
[pytest]
doctest_optionflags = ALLOW_UNICODE ALLOW_BYTES
或者,可以通过doc测试本身中的内联注释启用它:
# content of example.rst
>>> get_unicode_greeting() # doctest: +ALLOW_UNICODE
'Hello'
默认情况下,pytest仅报告给定doctest的第一次失败。如果您想在即使遇到故障时继续测试,请执行以下操作:
pytest --doctest-modules --doctest-continue-on-failure
'doctest_namespace' Fixture方法
3.0版中的新功能。
该doctest_namespace
Fixture方法可用于注入到项目中,你的文档测试运行的命名空间。它旨在用于您自己的灯具中,以提供将它们与上下文一起使用的测试。
doctest_namespace
是一个标准dict
对象,您可以将要放置在doctest命名空间中的对象放入其中:
# content of conftest.py
import numpy
@pytest.fixture(autouse=True)
def add_np(doctest_namespace):
doctest_namespace['np'] = numpy
然后可以直接在你的doctests中使用它:
# content of numpy.py
def arange():
"""
>>> a = np.arange(10)
>>> len(a)
10
"""
pass
请注意,与正常情况一样conftest.py
,在conftest所在的目录树中发现了fixture。意味着如果将doctest与源代码放在一起,则相关的conftest.py需要位于同一目录下。在同级目录树中不会发现Fixtures!
输出格式
3.0版中的新功能。
您可以通过使用选项标准文档测试模块格式的一个更改失败您的文档测试diff的输出格式(见doctest.REPORT_UDIFF
,doctest.REPORT_CDIFF
, doctest.REPORT_NDIFF
,doctest.REPORT_ONLY_FIRST_FAILURE
):
pytest --doctest-modules --doctest-report none
pytest --doctest-modules --doctest-report udiff
pytest --doctest-modules --doctest-report cdiff
pytest --doctest-modules --doctest-report ndiff
pytest --doctest-modules --doctest-report only_first_failure```