目录:
- 安装及入门
- 使用和调用方法
- 原有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自动补全设置
以下是pytest可能需要更改sys.path
以导入测试模块或conftest.py
文件的方案列表。
测试conftest.py
包内的模块/ 文件
考虑这个文件和目录布局:
root/
|- foo/
|- __init__.py
|- conftest.py
|- bar/
|- __init__.py
|- tests/
|- __init__.py
|- test_foo.py
执行时:
pytest root/
pytest会发现foo/bar/tests/test_foo.py
并意识到它是一个包的一部分,因为__init__.py
在同一个文件夹中有一个文件。然后它将向上搜索,直到它找到仍包含__init__.py
文件的最后一个文件夹,以便找到包根(在本例中foo/
)。要加载模块,它将插入root/
到前面 sys.path
(如果不存在),以便test_foo.py
作为模块 加载 foo.bar.tests.test_foo
。
相同的逻辑适用于该conftest.py
文件:它将作为foo.conftest
模块导入。
当测试存在于包中以避免出现问题并允许测试模块具有重复的名称时,保留完整的包名称非常重要。在Python测试发现的约定中也详细讨论了这一点 。
独立测试模块/ conftest.py
文件
考虑这个文件和目录布局:
root/
|- foo/
|- conftest.py
|- bar/
|- tests/
|- test_foo.py
执行时:
pytest root/
pytest会发现foo/bar/tests/test_foo.py
并意识到它不是包的一部分,因为__init__.py
同一个文件夹中没有文件。然后它将添加root/foo/bar/tests
到 sys.path
以test_foo.py
作为模块 导入test_foo
。conftest.py
通过添加root/foo
以sys.path
将其导入为文件,对文件执行相同操作conftest
。
因此,此布局不能包含具有相同名称的测试模块,因为它们都将导入全局导入命名空间。
在Python测试发现的约定中也详细讨论了这一点。
调用pytest
与python -m pytest
运行pytest 而不是产生几乎相同的行为,除了前一个调用将添加当前目录。另请参阅通过python -m pytest调用pytest。python -m pytest [...]``pytest [...]``sys.path