目录
- Pytest导入机制和sys.path/PYTHONPATH
- 包中的测试模块及conftest.py文件
- 独立测试模块及conftest.py文件
- 调用通过python -m pytest调用pytest
Pytest导入机制和sys.path/PYTHONPATH
包中的测试模块及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测试发现的约定中也详细讨论了这一点。
调用通过python -m pytest调用pytest
使用python-m pytest [ ... ]而不是pytest [ ... ]运行pytest,前一个调用将添加当前目录,除此之外,两种调用方式相同。另请参阅:通过python -m pytest调用pytest。
原文地址:https://www.cnblogs.com/superhin/p/11741533.html