运行 coverage 时的 ModuleNotFoundError run -m pytest 。在 GitHub Actions 中

ModuleNotFoundError when running coverage run -m pytest . in GitHub Actions

提问人:Petra Barus 提问时间:11/16/2023 更新时间:11/16/2023 访问量:64

问:

我有一个非常简单的项目,如下所示

//
├─ src/
│  ├─ sample/
│  │  ├─ __init__.py
│  │  ├─ simple.py
├─ tests/
│  ├─ __init__.py
│  ├─ test_simple.py

当我尝试在本地笔记本电脑上运行下面的 coverage 命令时,它运行正常并生成coverage.xml

coverage run -m pytest . && coverage xml

但是当我使用下面的配置在 GitHub 操作中运行时,它会返回错误

    - uses: actions/setup-python@v4
      with:
        python-version: '3.11' 

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pytest coverage

    - name: Run test
      run: |
        coverage run -m pytest .
        coverage xml

错误如下

Run coverage run -m pytest .
============================= test session starts ==============================
platform linux -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0
rootdir: /home/runner/work/openapi-splitter/openapi-splitter
collected 0 items / 1 error

==================================== ERRORS ====================================
____________________ ERROR collecting tests/test_simple.py _____________________
ImportError while importing test module '/home/runner/work/openapi-splitter/openapi-splitter/tests/test_simple.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/opt/hostedtoolcache/Python/3.11.6/x64/lib/python3.11/importlib/__init__.py:126: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests/test_simple.py:7: in <module>
    from sample.simple import add_one
E   ModuleNotFoundError: No module named 'sample'
=========================== short test summary info ============================
ERROR tests/test_simple.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
=============================== 1 error in 0.11s ===============================

为什么会发生这种情况以及如何解决此问题?

python pytest github-actions 代码覆盖率

评论

0赞 Maciek 11/16/2023
在测试中检查您,因为您似乎从与 GitHub 操作不同的范围在本地运行测试。因此,您的导入无法导入您的测试,因为您可能在而不是(因此,当您添加 .sys.pathsample.simple//srcsrc.sample.simple__init__.pysrc directory

答:

1赞 JustLearning 11/16/2023 #1

在您的文件中,正确的导入应该是test_simple

from src.sample.simple import add_one

包含在执行操作的目录中。src

编辑:

如果你想成为项目的顶层,请做著名的包喜欢做的事情:将事物命名为预期的包名称,和/或删除:samplenumpysrc

//
├─ sample/
│  ├─ __init__.py
│  ├─ simple.py
├─ tests/
│  ├─ __init__.py
│  ├─ test_simple.py

where now 是包的名称。然后,您的操作脚本将起作用。sample

评论

0赞 Ned Batchelder 11/16/2023
src不是要这样导入的。这是一个包含源代码的目录,但使用它的全部意义在于避免意外导入。
1赞 JustLearning 11/16/2023
这是程序员的决定。到目前为止,最常见的选择是将该文件夹命名为包的名称,例如 .作为一名C++程序员,我敢打赌,使用只是从更低级/编译的语言带来的一种习惯。对于OP的问题,另一种解决方案可能是简单地提高一个级别,完全删除.这将使代码与当前管道一起使用。numpysrcsamplesrc
0赞 Ned Batchelder 11/16/2023 #2

听起来您尚未在 GitHub 操作中安装代码,而且我在您的示例中没有看到您在哪里安装代码。您已经在本地安装了它,现在您需要在操作中添加一个步骤以在此处安装它。