【问题标题】:VSCode pytest test discovery failsVSCode pytest 测试发现失败
【发布时间】:2019-09-14 05:10:10
【问题描述】:

Pytest 测试发现失败。用户界面状态:

Test discovery error, please check the configuration settings for the tests

输出窗口状态:

Test Discovery failed: 
Error: Traceback (most recent call last):
  File "C:\Users\mikep\.vscode\extensions\ms-python.python-2019.4.11987\pythonFiles\testing_tools\run_adapter.py", line 16, in <module>
    main(tool, cmd, subargs, toolargs)
  File "C:\Users\mikep\.vscode\extensions\ms-python.python-2019.4.11987\pythonFiles\testing_tools\adapter\__main__.py", line 90, in main
    parents, result = run(toolargs, **subargs)
  File "C:\Users\mikep\.vscode\extensions\ms-python.python-2019.4.11987\pythonFiles\testing_tools\adapter\pytest.py", line 43, in discover
    raise Exception('pytest discovery failed (exit code {})'.format(ec))
Exception: pytest discovery failed (exit code 3)

这是我的设置:

{
    "python.pythonPath": ".venv\\Scripts\\python.exe",
    "python.testing.pyTestArgs": [
        "tests"
    ],
    "python.testing.unittestEnabled": false,
    "python.testing.nosetestsEnabled": false,
    "python.testing.pyTestEnabled": true
}

我可以从命令行成功运行 pytest FWIW。

【问题讨论】:

  • 你是如何从命令行运行 pytest 的?您是否在您的虚拟环境中使用与您的 settings.json 中指定的参数相同的 pytest?
  • 从命令行我只是在 VS Code 使用的同一个虚拟环境中执行pytest tests
  • 是的,我还在 VSCode 中从终端运行 pytest,然后发现它,以便之后我可以从 GUI 运行它。

标签: python visual-studio-code pytest vscode-settings


【解决方案1】:

看着https://docs.pytest.org/en/latest/usage.html#possible-exit-codes,似乎 pytest 本身因某些内部错误而倒下。

【讨论】:

    【解决方案2】:

    这不是一个完整的答案,因为我不知道为什么会发生这种情况,并且可能与您的问题无关,具体取决于您的测试结构。

    我通过将__init__.py 文件放入我的测试文件夹中解决了这个问题

    例如:

    
    ├───.vscode
    │       settings.json
    │
    ├───app
    │       myapp.py
    │
    └───tests
            test_myapp.py
            __init__.py
    

    几天前还没有这个,但是最近更新了 python 扩展。我不确定这是预期行为还是现在发现方式的副作用

    https://github.com/Microsoft/vscode-python/blob/master/CHANGELOG.md
    Use Python code for discovery of tests when using pytest. (#4795)

    【讨论】:

    • 我的__init__.py 目录中有__init__.py
    • @devlife helgso 解决方案是否适用于您? link 我可以确认,当我降级时,我在退出代码 3 上遇到了同样的问题。
    • 如果您的tests 文件夹中有子模块,请在这些子文件夹中添加__init__ 文件
    • 我的解决方案是反其道而行之:删除__init__.py。不知道为什么会修复它,或者为什么它首先会被破坏。我确定不久前我不得不添加它。
    【解决方案3】:

    我通过使用“pip install --upgrade pytest”将 pytest 升级到最新版本:4.4.1 解决了这个问题。我显然运行的是旧版本 3.4.2

    【讨论】:

    • 更好的答案是: 1. 详细说明旧版本导致问题的原因。 2. 说说新版本是如何解决问题的。随机升级是一个明显的解决方案,大多数不需要去stackoverflow学习。
    【解决方案4】:

    似乎是最新版本的 VS Code Python 扩展中的一个错误。我遇到了同样的问题,然后我将 Python 扩展降级为 2019.3.6558,然后它又可以工作了。所以我们应该转到我们的 VS Code 扩展列表,选择 Python 扩展并从该扩展的设置中选择“安装另一个版本...”。

    我希望这也适用于你。

    【讨论】:

    • 非常感谢!从 2020.1.58038 降级到 2019.3.6558,我的测试现在被发现。在我遇到 ModuleNotFoundError 之前:没有名为“tests.conftest”的模块
    【解决方案5】:

    在创建一个包含导入错误的测试后,我花了很长时间试图破译这个无益的错误。在进行任何更深入的故障排除之前,验证您的测试套件是否可以实际执行。

    pytest --collect-only 是你的朋友。

    【讨论】:

    • 输出应该是什么?
    • @LittleBobbyTables 喜欢================================================ 76 tests collected in 0.16s =================================================
    • @autumn 但它只是在命令行上发现并显示我需要在 vs 代码测试选项卡中查看?
    • 如果失败了怎么办?
    【解决方案6】:

    我遇到了同样的问题,并追踪到我的pytest.ini 文件。从该文件中删除大部分 addopts 解决了该问题。

    【讨论】:

      【解决方案7】:

      在开始测试发现之前,检查python.testing.cwd 是否正确指向您的测试目录,并且您的python.testing.pytestEnabled 设置为true

      一旦正确设置了这些要求,运行测试发现及其输出(参见 OUTPUT 窗口)。您应该会看到如下内容:

      python $HOME/.vscode/extensions/ms-python.python-$VERSION/pythonFiles/testing_tools/run_adapter.py discover pytest -- --rootdir $ROOT_DIR_OF_YOUR_PROJECT -s --cache-clear
      Test Discovery failed: 
      Error: ============================= test session starts ==============================
      <SETTINGS RELATED TO YOUR MACHINE, PYTHON VERSION, PYTEST VERSION,...>
      collected N items / M errors
      ...
      

      在这里突出显示最后一行很重要:collected N items / M errors。以下几行将包含有关pytest 发现的测试的信息。因此,您的测试可发现,但存在与正确执行相关的错误。

      以下几行将包含大多数情况下与错误导入有关的错误

      检查您之前是否已下载所有依赖项。如果您正在使用特定版本的依赖项(在requirements.txt 文件上,您有类似your_package == X.Y.Z 的内容),请确保它是您需要的正确版本。

      【讨论】:

        【解决方案8】:

        我只是想我会在这里添加我的答案,因为这可能会影响使用 .env 文件进行项目环境设置的人,因为它是 12 因子应用程序的常见配置。

        我的示例假设您使用pipenv 进行虚拟环境管理,并且您在项目的根目录中有一个.env 文件。

        我的 vscode 工作区设置 json 文件如下所示。对我来说至关重要的一行是"python.envFile": "${workspaceFolder}/.env",

        {
            "python.pythonPath": ".venv/bin/python",
            "python.linting.enabled": true,
            "python.linting.pylintEnabled": true,
            "python.linting.pycodestyleEnabled": false,
            "python.linting.flake8Enabled": false,
            "python.linting.pylintPath": ".venv/bin/pylint",
            "python.linting.pylintArgs": [
                "--load-plugins=pylint_django",
            ],
            "python.formatting.provider": "black",
            "python.formatting.blackArgs": [
                "--line-length",
                "100"
            ],
            "python.testing.unittestEnabled": false,
            "python.testing.nosetestsEnabled": false,
            "python.testing.pytestEnabled": true,
            "python.testing.pytestPath": ".venv/bin/pytest",
            "python.envFile": "${workspaceFolder}/.env",
            "python.testing.pytestArgs": [
                "--no-cov"
            ],
        }
        

        我希望这可以节省我花在解决这个问题上的时间。

        【讨论】:

        • 谢谢,env 文件设置也适用于我的情况。我需要 CLI 选项或环境变量来为我的测试设置关键值。并且在 tox.ini 等中指定它们是不可能的,因为它们本质上是私有的。
        • 对我来说是"python.testing.pytestPath": "{$workspaceFolder}\\Lib\\pytest",
        【解决方案9】:

        在我的情况下,vscode 无法发现测试的问题是在setup.cfg 中启用了coverage 模块(或者这可能是pytest.ini),即

        addopts= --cov <path> -ra
        

        由于覆盖率低导致测试发现失败。解决方案是从配置文件中删除该行。

        另外,正如documentation 中所建议的:

        您还可以手动配置测试通过将以下设置中的一个且仅一个设置为 true:python.testing.unittestEnabledpython.testing.pytestEnabledpython.testing.nosetestsEnabled

        编辑:

        稍微相关 - 如果项目更复杂,在使用 pytest 运行测试时(在 ModuleNotFoundError 的情况下),可能还需要更改 rootdir 参数(在您的 settings.json 中):

            "python.testing.pytestArgs": [
                "--rootdir","${workspaceFolder}/<path-to-directory-with-tests>"
            ],
        

        【讨论】:

        • 我花了几个多星期的时间试图找出 pytest 发现失败。显式设置rootdir 最终解决了这个问题。非常感谢!!!!
        【解决方案10】:

        如果您在使用 pytest 时遇到问题,我正在为发现测试部分苦苦挣扎。

        在 vscode 中阅读了一些 open issue (other) 我发现了一个使用 the test-adapter 扩展的解决方法

        market_place_link

        扩展就像一个魅力。 (并解决我的发现问题)

        【讨论】:

          【解决方案11】:

          我在设置中搜索了“python”并找到了这个:

          切换到pytest 会自动检测我的测试:

          【讨论】:

            【解决方案12】:

            我遇到了这个问题并为此苦苦挣扎了好几个小时。我认为每个其他平台配置都有一个特殊的解决方案。我的平台是:

            • VSCode:1.55.0 (Ubuntu)
            • Pytest:6.2.3
            • MS Python 扩展 (ms-python.python 2021.3.680753044)
            • 适用于 Visual Studio Code 的 Python 测试资源管理器 (littlefoxteam.vscode-python-test-adapter - 0.6.7)

            最糟糕的是该工具本身没有标准输出(至少我知道或可以在互联网上轻松找到)。

            问题出在

            --no-cov
            

            VSCode 测试资源管理器工具无法识别的参数(我从 Internet 上的某个页面复制)并且错误由扩展 littlefoxteam.vscode-python-test-adapter 显示,并且它可以帮助您找到问题所在。

            【讨论】:

              【解决方案13】:

              这个错误太令人沮丧了.. 在我的情况下,通过修改settings.json 中的python.pythonPath 参数(在项目根目录下的.vscode 文件夹中找到)修复了错误,到我在终端中使用which python 获得的路径(例如/usr/local/var/pyenv/shims/python

              我用pyenv和python3.9,我的错误之前说:

              错误:进程返回错误:/Users/"user-name"/.pyenv/shims/python: 第 21 行:/usr/local/Cellar/pyenv/1.2.23/libexec/pyenv:没有这样的文件或 目录

              在 ChildProcess。 (/Users/"用户名"/.vscode/extensions/littlefoxteam.vscode-python-test-adapter-0.6.8/out/src/processRunner.js:35:36) 在 ChildProcess.emit 的 Object.onceWrapper (events.js:422:26) (events.js:315:20) 在可能关闭 (internal/child_process.js:1021:16) 在 Process.ChildProcess._handle.onexit (内部/child_process.js:286:5)

              【讨论】:

                【解决方案14】:

                就我而言,每次flake8 linter 报告错误时都会出现相同的问题。即使是一个错误也足以让 VS Code 测试发现失败。 所以修复是禁用 linter 或修复 linter 错误。 我使用here 描述的设置。

                【讨论】:

                  【解决方案15】:

                  就我而言,这是 vscode python 扩展问题。 我将测试平台从 pytest 切换回来,然后又发现了测试。 似乎当所有 python 项目都普遍启用测试并且它一开始就无法发现测试时,它永远失败了!

                  【讨论】:

                    【解决方案16】:

                    2021-12-22

                    请在下面找到我用来让 pytest 在非常沮丧之后在 VsCode 中工作的设置。我在这里和互联网上的其他地方找到了许多有用的建议,但没有一个完整到足以让我免于诅咒。我希望以下内容可以帮助某人。此设置允许我从测试资源管理器扩展以及集成终端直观地运行测试。我在我的工作区和 Conda 中使用 src 格式进行环境管理。与终端设置相关的设置使我不必手动启用我的 Conda 环境或设置 python 路径。可能已经使用 VSCODE 超过两天的人可以添加一些不错的东西来使它更好和/或更完整。

                    ##### Vscode 信息:

                    版本:1.63.2(通用) 提交:899d46d82c4c95423fb7e10e68eba52050e30ba3 日期:2021-12-15T09:37:28.172Z(1 周前) 电子:13.5.2 铬:91.0.4472.164 Node.js:14.16.0 V8:9.1.269.39-electron.0 操作系统:达尔文 x64 20.6.0

                    ##### 测试扩展:

                    Visual Studio Code 的 Python 测试资源管理器 已安装扩展,v. 0.7.0

                    ##### Pytest 版本

                    pytest 6.2.5

                    ##### 目录结构:

                         workspace
                           .env
                           ./src
                                __init__.py
                                code1.py
                                code2.py
                           ./tests
                                __init__.py
                                test_code1.py
                                test_code2.py
                    

                    ##### .env 文件(在根目录中,但请参阅 settings.json 中的“python.envFile”设置)

                    PYTHONPATH=src

                    #####。 settings.json

                        {
                            "workbench.colorTheme": "Visual Studio Dark",
                            "editor.fontFamily": " monospace, Menlo, Monaco, Courier New",
                            "python.testing.unittestEnabled": false,
                            "python.testing.cwd": ".",
                            "terminal.integrated.inheritEnv": true,
                            "python.envFile": "${workspaceFolder}/.env",
                            "python.defaultInterpreterPath": 
                            "~/anaconda3/envs/mycurrentenv/bin/python",
                            "pythonTestExplorer.testFramework": "pytest",
                            "python.testing.pytestEnabled": true,
                            "python.testing.pytestArgs": [
                               "tests"
                            ],
                            "python.terminal.activateEnvironment": true,
                            "python.terminal.activateEnvInCurrentTerminal": true,
                            "terminal.integrated.env.osx": {
                                "PYTHONPATH": "${workspaceFolder}/src:${env:PYTHONPATH}"
                              }
                        }
                    

                    【讨论】:

                      【解决方案17】:

                      这是因为 TEST EXPLORER 找不到源文件。在settings.json 中设置正确的python.testing.cwd 可以解决问题。

                      ${workspaceFolder} 是 vscode 的根目录变量

                      如果您在${workspaceFolder}/tests 下进行测试,"python.testing.cwd": "${workspaceFolder} 将解决问题。

                      如果tests 保存在${workspaceFolder}/tests 中,这就是完整的settings.json

                      {
                          "python.testing.cwd": "${workspaceFolder}",
                          "python.testing.pytestArgs": [
                              "tests"
                          ],
                          "python.testing.unittestEnabled": false,
                          "python.testing.pytestEnabled": true
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2020-12-02
                        • 1970-01-01
                        • 2020-04-08
                        • 2023-03-06
                        • 2018-12-03
                        • 2016-11-02
                        • 2016-06-02
                        • 2018-04-05
                        相关资源
                        最近更新 更多