代码之家  ›  专栏  ›  技术社区  ›  ccpizza

Pytest:如何解决tests文件夹中缺少的init.py?

  •  4
  • ccpizza  · 技术社区  · 7 年前

    我将所有的pytest文件存储在 tests 项目根目录下的子目录。没有 __init__.py 在那个目录或上面 pytest tests/test_a.py 按预期工作。我也可以跑步 pytest test_a.py 直接从内部 测验 文件夹。

    |--<project_root>
    +---[tests]
        test_a.py
        base.py
        config.py
        conftest.py
    

    中的测试类 test_a.py 继承自 base.py .现在,问题是因为失踪 _初始版本 IDE工具不工作,无法解决导入问题。正在添加 _初始版本 测验 解决IDE中的所有导入错误,但测试将不再运行 Pytest测试 因为py.test无法导入 conftest.py .

    在我的 配置测试.py 我有以下进口产品:

    from config import HOST_URL_DEFAULT, USER, PASSWORD
    

    结果是:

    ModuleNotFoundError: No module named 'config'
    ERROR: could not load /project_root/tests/conftest.py
    

    有没有办法解决这个问题,这样两个IDE工具都可以工作? pytest 继续工作?如果可能的话,我想避免使用点导入。

    更新: 阅读后 this answer 我想我终于开始更多地了解Python导入是如何工作的。

    1 回复  |  直到 7 年前
        1
  •  2
  •   MisterMiyagi    7 年前

    添加 __init__.py 使用相对或绝对导入 conftest.py 以下内容:

    # relative
    from .config import HOST_URL_DEFAULT, USER, PASSWORD
    # absolute
    from tests.config import HOST_URL_DEFAULT, USER, PASSWORD
    

    在一个包中(由 _初始版本 )您需要明确的导入路径。使用不合格进口( from config import ... )取决于 PYTHONPATH sys.modules 包括您的包根-这通常是不健全的,应该避免,因为它绕过包基础设施。

    你这里有什么( config.py 其他模块使用) 一个包裹。一视同仁。


    pytest 不鼓励使用带有 _初始版本 你看!这有一些真正的用例——比如你的。

    什么 比重试验 does discourage 正在具有源包 在同一个源根目录下测试包。但是,这意味着你应该 移动源包 不是你的测试包!

    mysource/  # root directory for both mypackage and mytests
    +- mypackage/  # should be src/mypackage instead!
       +- __init__.py
       +- abcd.py
    +- mytests
       +- __init__.py
       +- tests_abcd.py  # ``from mypackage import abcd`` imports from source
    

    问题是跑步 mytests 意思是说 mypackage 也可以从源代码导入。也就是说,你的测试正在 源程序包 ,而不是您安装的软件包。如果安装过程中有任何错误,测试将无法捕获。 See the blog linked in the pytest docs for details .