【问题标题】:How to suppress py.test internal deprecation warnings如何抑制 py.test 内部弃用警告
【发布时间】:2017-04-04 06:04:47
【问题描述】:

有没有办法抑制 pytest 的内部弃用警告?

上下文:我正在评估将测试套件从nose 移植到pytest 的难度。该套件相当大,并且大量使用基于nose-style yield 的测试生成器。

我想首先确保 现有 测试通过 pytest,然后可能将测试生成器更改为 parameterized

仅仅用 pytest 3.0.4 运行$ pytest path-to-test-folder 完全被页面和页面支配

WC1 ~repos/numpy/numpy/lib/tests/test_twodim_base.py yield tests are deprecated, and scheduled to be removed in pytest 4.0

有没有办法关闭这些警告?

【问题讨论】:

    标签: python pytest


    【解决方案1】:

    来自pytest --help

    --disable-pytest-warnings
                          disable warnings summary, overrides -r w flag
    

    【讨论】:

    • 正如帮助文本所说,这只会省略文本摘要。结果仍然是黄色的,表示有警告。
    • 最好放到pytest.ini文件中,如下图。
    【解决方案2】:

    我认为您不想隐藏所有警告,而只想隐藏那些不相关的警告。在这种情况下,来自导入的 python 模块的弃用警告。

    阅读有关 Warnings Capture 的 pytest 文档:

    -W 命令行选项和 filterwarnings ini 选项都基于 Python 自己的 -W optionwarnings.simplefilter,因此请参阅 Python 文档中的这些部分了解其他示例和高级用法。

    因此您可以使用 python 的 -W 选项过滤警告!

    似乎pytest 完全删除了过滤器,因为它在运行时显示了所有DeprecationWarning,并且Python 的关于Default Warning Filters 的文档清楚地说明了:

    在常规发布版本中,默认警告过滤器具有 以下条目(按优先顺序):

    default::DeprecationWarning:__main__
    ignore::DeprecationWarning
    ignore::PendingDeprecationWarning
    ignore::ImportWarning
    ignore::ResourceWarning
    

    因此,在您的情况下,如果您想过滤您想要忽略的警告类型,例如 DeprecationWarning,只需运行带有 -W 选项的 pytest 命令:

    $ pytest path-to-test-folder -W ignore::DeprecationWarning
    

    编辑:来自colini的评论,可以按模块过滤。忽略所有 sqlalchemy 的弃用警告的示例:

    ignore::DeprecationWarning:sqlalchemy.*:
    

    然后您可以在pytest 的输出中列出已安装的模块,这些模块会产生过多的噪音

    与文件一起使用而不是在命令行中使用:

    您可能更喜欢在 pytest.ini 文件中列出这些过滤器:

    [pytest]
    filterwarnings =
        ignore::DeprecationWarning
    

    【讨论】:

    • 使用正则表达式过滤模块。忽略来自所有 sqlalchemy 模块的弃用警告的示例:ignore::DeprecationWarning:sqlalchemy.*:
    • @colini 作为 -W 标志的参数对我来说失败了,但它在我的 pytest.ini 文件中对我有用。
    • 在 pytest 6.1 中,尾随正则表达式对我不起作用,但您可以在中间插入一个正则表达式以匹配警告消息的开头。 ignore:.*U.*mode is deprecated:DeprecationWarning 忽略所有 DeprecationWarning 类型的警告,其中消息的开头与正则表达式“.*U.*mode is deprecated”匹配。 more info
    • @WhiteHotLoveTiger 与 ignore::DeprecationWarning:tensorflow[.*] 相同 - 仅适用于配置文件,提交错误报告:github.com/pytest-dev/pytest/issues/8751
    【解决方案3】:

    pytest -p no:warnings,或将以下内容添加到您的 pytest.ini 或 tox.ini:

    [pytest]
    addopts = -p no:warnings
    

    结果将是绿色的,没有任何警告指示。请参阅https://docs.pytest.org/en/latest/warnings.html#disabling-warnings-summary 上的文档。

    对于需要干净输出的测试套件,这可能是一个有效的用例。

    请注意,始终隐藏所有警告可能会导致您错过重要警告。 If you want to hide only specific warnings, look at Cloc's answer.

    【讨论】:

    • addopts = -p no:warnings 是一个非常糟糕的主意,而且 CloC 解决方案更加明智,但是当 ignore::InsecureRequestWarning 未被识别时我不得不使用你的,所以你也得到了 +1
    • 永久禁用 all 警告(即使用 pytest.ini)几乎不是一个好主意。正如 CloC 所描述的那样,仅禁用弃用警告(以及按模块)是正确的方法。
    【解决方案4】:

    在pytest.ini文件中可以添加:

    [pytest]
    addopts = -p no:warnings
    

    OR 在命令行下传递。如果您的测试套件使用外部系统处理警告,这可能会很有用。

    -p no:警告

    如果您只想隐藏某些特定的已弃用警告,请在 pytest.ini 文件中添加以下语句

    [pytest]
    filterwarnings =
        ignore:.*U.*mode is deprecated:DeprecationWarning
    

    这将忽略消息开头与正则表达式“.*U.*mode is deprecated”匹配的所有 DeprecationWarning 类型的警告。

    或者虽然不推荐,但可以使用

    --禁用警告

    命令行选项,用于完全从测试运行输出中抑制警告摘要。

    【讨论】:

      【解决方案5】:

      我不想隐藏所有警告,所以我把它放在pytest.ini

      [pytest]
      filterwarnings =
          ignore::DeprecationWarning
      

      【讨论】:

        【解决方案6】:

        如果您使用pyproject.toml 文件作为配置,这里有一个link 说明如何抑制警告。

        [tool.pytest.ini_options]
        testpaths = ["./tests/unit"]
        filterwarnings = ["ignore:::.*third_party_package.module:123", "ignore:::.*another_module*"]
        

        123 在这种情况下是要抑制的行号

        【讨论】:

          【解决方案7】:

          如果您使用setup.cfg 文件,请将其放入:

          [tool:pytest]
          addopts = -p no:warnings
          

          你需要tool:pytest 而不仅仅是pytest,但它会告诉你:

          失败:不再支持 setup.cfg 文件中的 [pytest] 部分,改为改为 [tool:pytest]。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-16
            • 1970-01-01
            • 1970-01-01
            • 2011-02-06
            • 1970-01-01
            • 1970-01-01
            • 2010-12-05
            • 2019-01-13
            相关资源
            最近更新 更多