Pytest权威教程22-优质集成实践
优质集成实践
使用pip安装包
对于开发,我们建议你将[venv来安装应用程序和任何依赖项,以及pytest
包本身。这可确保你的代码和依赖项与系统Python安装隔离。
接下来,setup.py
使用以下最低内容将文件放在包的根目录中:
from setuptools import setup,find_packages
setup(name="PACKAGENAME",packages=find_packages())
PACKAGENAME
包裹的名称在哪里。然后,你可以通过从同一目录运行,以“可编辑”模式安装程序包:
pip install -e .
它允许你更改源代码(测试和应用程序)并随意重新运行测试。这与运行类似,或者使用符号链接将你的包安装到开发代码中。pythonsetup.pydevelop``condadevelop
Python测试发现的约定
Pytest
实现以下标准测试发现:
- 如果未指定参数,则从`testpaths(如果已配置)或当前目录开始收集。或者,命令行参数可以用于目录,文件名或节点ID的任意组合。
- 递归到目录,除非它们匹配
norecursedirs
。 - 在这些目录,搜索
test_*.py
或*_test.py
文件,由他们进口[的测试包名。 - 从这些文件中收集测试项目:
test
在类之外的前缀测试函数或方法test
前缀测试Test
类中的前缀测试函数或方法(没有__init__
方法)
有关如何自定义测试发现的示例[更改标准(Python)测试发现。
在Python模块中,pytest
还使用标准的[unittest.TestCase子类化技术发现测试。
选择测试布局结构/导入规则
pytest
支持两种常见的测试布局:
在应用程序代码外测试
如果你有许多函数测试,或者出于其他原因希望将测试与实际应用程序代码分开(通常是个好主意),那么将测试放入实际应用程序代码之外的额外目录可能会很有用:
setup.py
mypkg/
__init__.py
app.py
view.py
tests/
test_app.py
test_view.py
...
这有以下好处:
- 执行后,你的测试可以针对已安装的版本运行。
pipinstall.
- 执行后,你可以使用可编辑安装对本地副本运行测试。
pipinstall--editable.
- 如果你没有
setup.py
文件并且依赖于默认情况下Python将当前目录放入sys.path
以导入你的包,则可以执行直接对本地副本执行测试,而不使用。python-mpytest``pip
注意:
有关调用和调用之间差异的更多信息,请参阅[pytest导入机制和sys.path / PYTHONPATH。pytest``python-mpytest
请注意,使用此方案时,你的测试文件必须具有唯一的名称,因为pytest
将它们作为顶级模块导入,因为没有包来从中获取完整的包名称。换句话说,在上面的示例中的试验文件将被导入为test_app
和test_view
通过加入顶层模块tests/
到sys.path
。
如果需要具有相同名称的测试模块,可以将__init__.py
文件添加到tests
文件夹和子文件夹,并将其更改为包:
setup.py
mypkg/
...
tests/
__init__.py
foo/
__init__.py
test_view.py
bar/
__init__.py
test_view.py
现在Pytest将加载模块,tests.foo.test_view
并tests.bar.test_view
允许你使用相同名称的模块。但是现在这引入了一个微妙的问题:为了从tests
目录中加载测试模块,pytest将存储库的根目录sys.path
添加到,这增加了现在mypkg
也可导入的副作用。如果你使用像tox这样的工具在虚拟环境中测试程序包,则会出现问题,因为你要测试程序包的已安装版本,而不是存储库中的本地代码。
在这种情况下,强烈建议使用src
应用程序根包位于根目录的子目录中的布局:
setup.py
src/
mypkg/
__init__.py
app.py
view.py
tests/
__init__.py
foo/
__init__.py
test_view.py
bar/
__init__.py
test_view.py
这种布局可以防止许多常见的陷阱,并且有很多好处,这在[IonelCristianMărieş的有更好的解释。
测试作为应用程序代码的一部分
如果测试和应用程序模块之间存在直接关系并希望将它们与应用程序一起分发,则将测试目录内联到应用程序包中非常有用:
setup.py
mypkg/
__init__.py
app.py
view.py
test/
__init__.py
test_app.py
test_view.py
...
在此方案中,使用以下--pyargs
选项可以轻松运行测试:
pytest --pyargs mypkg
pytest
将发现mypkg
安装位置并从那里收集测试。
请注意,此布局也与src
上一节中提到的布局一起使用。
注意:
你可以为你的应用程序使用Python3命名空间包(PEP420),但pytest仍将根据文件的存在执行[测试包名称发现__init__.py
。如果你使用上面两个推荐的文件系统布局中的一个,但是__init__.py
从你的目录中删除它们,那么它应该适用于Python3.3及更高版本。但是,从“内联测试”开始,你将需要使用绝对导入来获取应用程序代码。
注意:
如果pytest
在递归到文件系统时找到“a / b / test_module.py”测试文件,它将确定导入名称,如下所示:
- 确定
basedir
:这是第一个“向上”(朝向根)目录,不包含__init__.py
。如果如两者a
并b
包含一个__init__.py
文件,然后父目录a
将成为basedir
。 - 执行以使测试模块可以在完全限定的导入名称下导入。
sys.path.insert(0,basedir)
importa.b.test_module
其中路径是通过将路径分隔符/
转换为“。”字符来确定的。这意味着你必须遵循将目录和文件名直接映射到导入名称的约定。
这种有点进化的导入技术的原因在于,在较大的项目中,多个测试模块可能相互导入,因此导出规范的导入名称有助于避免出现意外情况,例如测试模块导入两次。
tox
一旦完成了你的工作并希望确保你的实际软件包通过所有测试,你可能需要查看tox,virtualenv测试自动化工具及其[pytest支持。tox帮助你使用预定义的依赖项设置virtualenv环境,然后使用选项执行预配置的测试命令。它将针对已安装的软件包运行测试,而不是针对源代码检查,从而有助于检测包装故障。
与setuptools集成
你可以使用[pytest-runner插件将测试运行集成到基于setuptools的项目中。
将此添加到setup.py
文件:
from setuptools import setup
setup(
# ...,
setup_requires=["pytest-runner",...],
tests_require=["pytest",...],
# ...,
)
并在setup.cfg
文件中创建一个别名:
[aliases]
test=pytest
如果你现在输入:
python setup.py test
这将使用执行你的测试pytest-runner
。因为这是一个独立版本,pytest
无需事先安装,无论如何都需要调用test命令。你还可以使用其他参数传递给pytest,例如测试目录或其他选项--addopts
。
你还可以setup.cfg
通过将文件放入以下[tool:pytest]
部分来指定文件中的其他pytest-ini选项:
[tool:pytest]
addopts = --verbose
python_files = testing/*/*.py
手动整合
如果由于某种原因你不想/不能使用pytest-runner
,你可以编写自己的setuptools测试命令来调用pytest。
import sys
from setuptools.command.test import test as TestCommand
class PyTest(TestCommand):
user_options = [("pytest-args=","a","Arguments to pass to pytest")]
def initialize_options(self):
TestCommand.initialize_options(self)
self.pytest_args = ""
def run_tests(self):
import shlex
# import here,cause outside the eggs aren't loaded
import pytest
errno = pytest.main(shlex.split(self.pytest_args))
sys.exit(errno)
setup(
# ...,
tests_require=["pytest"],
cmdclass={"pytest": PyTest},
)
现在,如果你运行:
python setup.py test
这将pytest
在需要时下载,然后按照你的预期运行测试。你可以使用--pytest-args
或-a
命令行选项传递单个参数字符串。例如:
python setup.py test -a "--durations=5"
相当于运行 pytest--durations=5
片状”测试是表现出间歇性或偶发性失败的测试,似乎具有非确定性行为。有时它会通过,有时会失败,而且不清楚为什么。本页讨论了可以提供帮助的pytest函数以及识别,修复或减轻它们的其他一般策略。
Pytest权威教程22-优质集成实践的更多相关文章
- Pytest权威教程(官方教程翻译)
Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...
- Pytest权威教程11-模块及测试文件中集成doctest测试
目录 模块及测试文件中集成doctest测试 编码 使用doctest选项 输出格式 pytest-specific 特性 返回: Pytest权威教程 模块及测试文件中集成doctest测试 编码 ...
- Pytest权威教程01-安装及入门
目录 安装及入门 安装 Pytest 创建你的第一个测试用例 执行多条测试用例 断言抛出了指定异常 使用类组织多条测试用例 函数测试中请求使用独立的临时目录 进一步阅读 返回: Pytest权威教程 ...
- Pytest权威教程21-API参考-03-夹具(Fixtures)
目录 夹具(Fixtures) @ pytest.fixture config.cache的 capsys capsysbinary capfd capfdbinary doctest_namespa ...
- Pytest权威教程02-Pytest 使用及调用方法
目录 Pytest 使用及调用方法 使用python -m pytest调用pytest 可能出现的执行退出code 获取版本路径.命令行选项及环境变量相关帮助 第1(N)次失败后停止测试 指定及选择 ...
- Pytest权威教程06-使用Marks标记测试用例
目录 使用Marks标记测试用例 在未知标记上引发异常: -strict 标记改造和迭代 返回: Pytest权威教程 使用Marks标记测试用例 通过使用pytest.mark你可以轻松地在测试用例 ...
- Pytest权威教程14-缓存:使用跨执行状态
目录 缓存:使用跨执行状态 使用方法 首先只重新运行故障或故障 上次运行中没有测试失败时的行为 新的config.cache对象 检查缓存内容 清除缓存内容 逐步修复失败用例 unittest.Tes ...
- Pytest权威教程16-经典xUnit风格的setup/teardown
目录 经典xUnit风格的setup/teardown 模块级别setup/teardown 类级别setup/teardown 方法和函数级别setup/teardown 返回: Pytest权威教 ...
- Pytest权威教程17-安装和使用插件
目录 安装和使用插件 在测试模块或conftest文件中要求/加载插件 找出哪些插件是可用的 按名称取消/取消注册插件 返回: Pytest权威教程 安装和使用插件 本节讨论如何安装和使用第三方插件. ...
随机推荐
- 一个 Vim 重度用户总结的 vim 超全指南
我本人是 Vim 的重度使用者,就因为喜欢上这种双手不离键盘就可以操控一切的feel,Vim 可以让我对文本的操作更加精准.高效. 对于未使用过 Vim 的朋友来说,可能还无法体会到这种感觉.由于使用 ...
- 【转载】C#使用Math.Floor方法来向下取整
在C#的数值运算中,有时候需要对计算结果舍去小数位保留整数位向下取整即可,此时就可使用内置方法Math.Floor来实现向下取整操作,Math.Floor方法将舍去小数部分,保留整数.Math.Flo ...
- brython的问题
brython 挺不错,但有bug. 再brython中使用mpmath做精确计算. 发现: int((103654973826275244659954807217085022028357821605 ...
- 在openwrt上使用autossh(已放弃)
用了一天后发现,这东西真不靠谱,还不如自已写的SHELL检测重连来的精准和方便,放弃中 参考文章: https://my.oschina.net/umu618/blog/849345 https:// ...
- springboot错误: 找不到或无法加载主类
一:当在eclipse启动spring boot项目时出现问题: springboot错误: 找不到或无法加载主类 解决办法: 1,通过cmd命令行,进入项目目录进行,mvn clean instal ...
- 基于ATtiny85微控制器制作一款四通道温度计
本文主要介绍了一款基于ATtiny85微控制器的四通道温度计,该温度计可以同时监测四个温度传感器的温度,并且实时在小型128x32 OLED液晶屏上进行显示. 该温度计可以用于任何需要监控多个温度点的 ...
- Linux 逻辑卷扩容
Linux 逻辑卷扩容 关键词:pv(物理卷).vg(卷组) .lv(逻辑卷) 今天在用linux过程中,根分区容量不够了,突然想起来好久没更新博客,就来说说逻辑卷扩容的问题吧. 1.扩容前的检查 记 ...
- 超全整理!Linux shell及常用36类命令汇总
本文采编自http://blog.csdn.net,作者为ZHXGXN,版权归作者所有! 使用Linux shell是一些程序员每天的基本工作,但我们经常会忘记一些有用的shell命令和技巧.当然,命 ...
- 《少年先疯队》第八次团队作业:Alpha冲刺1-5
博文简要信息表: 项目 内容 软件工程 https://www.cnblogs.com/nwnu-daizh/ 本次实验链接地址 https://www.cnblogs.com/nwnu-daizh/ ...
- 《CoderXiaoban》第八次团队作业:Alpha冲刺5
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 Coderxiaoban团队 作业学习目标 (1)掌握软件测试基 ...