简体   繁体   English

在父项目上运行 pytest 时,如何忽略 git 子模块(例如 submodule/conftest.py)根目录下的 conftest.py 文件?

[英]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?

Question问题

How can I tell pytest to ignore all test files including conftest.py within a repository's git submodule as these tests and files are irrelevant to the parent repository's test suite?我如何告诉 pytest 忽略存储库的 git 子模块中的所有测试文件,包括 conftest.py ,因为这些测试和文件与父存储库的测试套件无关?

Background背景

I have a number of git submodules in my project which house their own self contained testing configurations.我的项目中有许多 git 子模块,它们包含自己的独立测试配置。

When I try to use pytest in the "parent" repository, I am getting this error because pytest is collecting the conftest.py files within my submodules.当我尝试在“父”存储库中使用 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 ==============================================

My "parent" git repository structure looks like:我的“父”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/

One (cumbersome) option may be to only run pytest with uninitialized submodules.一个(繁琐的)选项可能是仅使用未初始化的子模块运行 pytest。 However, if I do not initialize the git submodules then I cannot run integration tests with those libraries.但是,如果我不初始化 git 子模块,那么我无法使用这些库运行集成测试。

You could setup your submodule with a sparse-checkout rule (with an exclusion rule ) in order to not load their own conftest.py您可以使用 sparse-checkout 规则(带有排除规则)设置您的子模块,以便不加载自己的conftest.py

If that file is not there in the submodule, it would be "ignored" automatically by pytest .如果该文件在子模块中不存在,它将被pytest自动“忽略”。

For example, run:例如,运行:

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

I solved this by creating a pytest.ini file at the root of my project specifying the test path explicitly:我通过在我的项目的根目录中创建一个pytest.ini文件来解决这个问题,明确指定测试路径:

# pytest.ini
[pytest]
testpaths =
    tests

This way the submodule path gets ignored.这样子模块路径就会被忽略。 Messing with which files get checked out of the submodule sounds like a pain tbh.弄乱从子模块中签出的文件听起来很痛苦。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM