【问题标题】:Restricting py.test to only run pylint and not unittests限制 pytest 只运行 pylint 而不是单元测试
【发布时间】:2019-02-07 20:07:02
【问题描述】:

我正在尝试运行 py.test 并仅执行 pylint,但不执行单元测试。

此页面上的文档表明您可以做到:

https://pypi.org/project/pytest-pylint/

您可以通过键入以下内容将您的测试运行限制为仅执行 pylint 检查而不执行任何其他测试:

  py.test --pylint -m pylint

但是当我准确地运行该命令时,我仍然会从 py.test 找到的单元测试中得到错误。 linting 过程似乎按预期运行,然后我在 unittest 文件中报告了一堆错误。这似乎与文档相反。

py.test --version 表明我正在使用0.14.0

$ py.test --version
This is pytest version 4.0.0, imported from /usr/local/lib/python3.6/dist-packages/pytest.py
setuptools registered plugins:
  pytest-pylint-0.14.0 at /usr/local/lib/python3.6/dist-packages/pytest_pylint.py

【问题讨论】:

  • 您是否在单元测试中遇到关于代码样式的 linter 错误或实际单元测试失败?
  • 好问题,主要是模块导入错误,单元测试文件中的 pythonpath 问题,虽然很容易解决,但根本不应该运行。我们只希望 Jenkins 管道的这一部分中出现 lint 错误。我们将定义管道的另一部分以正确运行单元测试。
  • 可能提出的一种解决方案是同时运行 lint 和运行单元测试,但 linting 和 unittests 的排除项也会有所不同,因此对 linting 和 unittests 运行一次 py.test 并不干净.另一种解决方案是将pylint 作为自己的进程运行,而不是在py.test 下运行,但是我们会丢失junit 结果格式,它可以更干净地集成到Jenkins 中。
  • "> 主要是模块导入错误,单元测试文件中的 pythonpath 问题,虽然很容易解决,但根本不应该运行。” - 我认为这里的解释是pytest 正在尝试加载单元测试模块,但实际上不会运行它们。 -m pylint 是一个标记过滤器,这意味着只需要运行标记为“pylint”的测试。所以pytest 必须查看所有测试并检查它们的标记。我猜想解决 import/pythonpath 问题会解决问题,py.test --pylint -m pylint 会按预期运行。
  • 您可以运行 pytest-o norecursedirs=* 以避免收集测试。 pytest --pylint -m pylint -o norecursedirs=*。顺便说一句,不要再使用py.test,它已被弃用,很快就会被删除。

标签: python unit-testing pytest pylint


【解决方案1】:

这可能不是您要寻找的答案,但请考虑使用 Prospector。

它是一些 Python linting 库的包装器,包括 pylint,它可以生成开箱即用的 xUnit 报告。

https://prospector.readthedocs.io/en/master/usage.html#output-format

【讨论】:

  • 这是apt-get 安装吗?该文档根本没有提到安装。 apt-get 似乎想要包含很多依赖项。我不确定我是否能够出售它似乎需要的承诺。
  • 它应该像任何其他常规 Python 包一样可以安装,例如使用pip install prospector
【解决方案2】:

代表cmets回答:

您是否在单元测试或实际中收到有关代码样式的 linter 错误 单元测试失败? – 格迪米纳斯 2 月 7 日 20:12

好问题,主要是模块导入错误,pythonpath 中的问题 unittest 文件,虽然很容易解决,但不应该在 全部。我们只希望 Jenkins 的这一部分出现 lint 错误 管道。我们将定义管道的另一部分来运行单元测试 适当地。 – 大卫·帕克斯 2 月 7 日 20:14

"> 主要是模块导入错误,unittest 文件中的 pythonpath 问题,虽然很容易解决,但根本不应该运行。” - 我认为这里的解释是 pytest正在尝试加载单元测试模块,但实际上不会运行它们。 -m pylint 是一个标记过滤器,这意味着只需要运行标记为“pylint”的测试。因此 pytest 必须查看所有测试并检查它们的标记。我猜想解决导入/pythonpath 问题将解决问题,并且 py.test --pylint -m pylint 会按预期运行。 – 格迪米纳斯 2 月 7 日 20:47

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多