• Pytest权威教程24-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/
    

    由于用例所在tests/目录中包含了__init__.py文件,当Pytest找到foo/bar/tests/test_foo.py时,然后它向上搜索,直到它找到仍包含__init__.py文件的最后一个文件夹,作为包的根路径(本例中foo/)。要加载模块,Pytest会将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/
    

    由于用例所在tests/目录下没有__init__.py文件,当Pytest找到foo/bar/tests/test_foo.py时,会把用例视为一个独立的模块,然后添加其所在目录路径,root/foo/bar/tests到sys.path中。以模块test_foo的形式导入用例脚本test_foo.py。同样,conftest.py也被视为独立的模块,通过添加其所在目录,root/foo到sys.path中,将其以模块形式导入。

    因此,此布局不能包含具有相同名称的测试模块,应为它们都将被导入到全局的命名空间中。
    在:Python测试发现的约定中也详细讨论了这一点。

    调用通过python -m pytest调用pytest

    使用python-m pytest [ ... ]而不是pytest [ ... ]运行pytest,前一个调用将添加当前目录,除此之外,两种调用方式相同。另请参阅:通过python -m pytest调用pytest。

  • 相关阅读:
    线程安全和非线程安全
    spring MVC和hibernate的结合
    Spring学习笔记1——基础知识 (转)
    bitset && Luogu 3674 小清新人渣的本愿
    luogu P3452 [POI2007]BIU-Offices
    每日刷题记录
    Codeforces Round #721 (Div. 2) B2. Palindrome Game (hard version)
    2019湘潭邀请赛A
    2021CCPC浙江省赛 B
    Codeforces Round #720 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/superhin/p/11741533.html
Copyright © 2020-2023  润新知