【问题标题】:How do I ignore a conftest.py file at the root of a git submodule (e.g. submodule/conftest.py) when running pytest on the parent project?在父项目上运行 pytest 时,如何忽略 git 子模块(例如 submodule/conftest.py)根目录下的 conftest.py 文件?
【发布时间】:2021-06-22 19:54:45
【问题描述】:

问题

我如何告诉 pytest 忽略存储库的 git 子模块中的所有测试文件,包括 conftest.py,因为这些测试和文件与父存储库的测试套件无关?

背景

我的项目中有许多 git 子模块,它们包含自己的独立测试配置。

当我尝试在“父”存储库中使用 pytest 时,我收到此错误,因为 pytest 正在我的子模块中收集 conftest.py 文件。

>pytest
=================================================== ERRORS =================================================== 
_______________________________________ ERROR collecting test session ________________________________________ 
Defining 'pytest_plugins' in a non-top-level conftest is no longer supported:
It affects the entire test suite instead of just below the conftest as expected.
  C:\Users\user\git\project\submodule\conftest.py
Please move it to a top level conftest file at the rootdir:
  C:\Users\user\git\project
For more information, visit:
  https://docs.pytest.org/en/latest/deprecations.html#pytest-plugins-in-non-top-level-conftest-files
========================================== short test summary info =========================================== ERROR
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ============================================== 1 error in 0.45s ==============================================

我的“父”git 存储库结构如下:

./.git
./project1/__main__.py
./project1/__init__.py
./project1/other_stuff/
./test/
./conftest.py
./setup.cfg
./submodule/.git
./submodule/project2/__main__.py
./submodule/project2/__init__.py
./submodule/project2/other_stuff/
./submodule/conftest.py
./submodule/setup.cfg
./submodule/test/

一个(麻烦的)选项可能是仅使用未初始化的子模块运行 pytest。但是,如果我不初始化 git 子模块,那么我将无法使用这些库运行集成测试。

【问题讨论】:

    标签: python git pytest git-submodules python-3.8


    【解决方案1】:

    您可以setup your submodule with a sparse-checkout rule(带有exclusion rule)以不加载自己的conftest.py

    如果该文件在子模块中不存在,它将被pytest 自动“忽略”。

    例如,运行:

    > cd ./submodule
    > git sparse-checkout init
    > git sparse-checkout set /* !conftest.py
    > git sparse-checkout list
    /*
    !conftest.py
    

    【讨论】:

    • 这听起来不错,但我对 git sparse-checkout 的想法很陌生。我已经开始挖掘其他链接并阅读 git-sparse-checkout 文档。你是说我应该把稀疏签出放在 submodule 存储库的一个分支中,比如submodule-release,然后让父存储库引用那个分支?
    • @FrancisSziebert 我不认为稀疏检出指令存储在存储库中(将包含在未来的克隆中)。在本地仓库配置中声明,如stackoverflow.com/a/53233492/6309
    • 再读一读,这是有道理的。我的编辑示例适用于我的本地开发。为了进行一点完整性检查,如果我在父级上运行 pytest 作为管道的一部分,我是否会在测试之前将这些 sparse-checkout 命令包含在我的 makefile 中?
    • @FrancisSziebert 感谢您的编辑。已批准。
    • @FrancisSziebert 是的,我们的想法是将这些命令集成到您的管道中。
    【解决方案2】:

    我通过在我的项目的根目录下创建一个pytest.ini 文件来解决这个问题,明确指定测试路径:

    # pytest.ini
    [pytest]
    testpaths =
        tests
    

    这样子模块路径就会被忽略。弄乱哪些文件从子模块中签出听起来很痛苦。

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2011-08-12
      相关资源
      最近更新 更多