Pytest官方教程-25-Pytest导入机制及sys.path/PYTHONPATH

目录:

  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自动补全设置

以下是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/testssys.pathtest_foo.py作为模块 导入test_fooconftest.py通过添加root/foosys.path将其导入为文件,对文件执行相同操作conftest

因此,此布局不能包含具有相同名称的测试模块,因为它们都将导入全局导入命名空间。

在Python测试发现的约定中也详细讨论了这一点。

调用pytestpython -m pytest

运行pytest 而不是产生几乎相同的行为,除了前一个调用将添加当前目录。另请参阅通过python -m pytest调用pytest。python -m pytest [...]``pytest [...]``sys.path

你可能感兴趣的:(Pytest官方教程-25-Pytest导入机制及sys.path/PYTHONPATH)