微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将逐步`DeprecationWarnings` 转变为 Python 中的致命错误

如何解决将逐步`DeprecationWarnings` 转变为 Python 中的致命错误

我们的测试套件有许多来自我们自己的代码DeprecationWarnings。我的团队一直在弃用一些东西,而没有修复(或检查警告)受影响的测试。我认为解决此问题的最佳方法是在测试上下文中运行时将这些警告转换为异常或失败的测试。这样,团队就不会在不重新调整受影响的测试的情况下引入 DeprecationWarning

更重要的是,如果这种转换可以是渐进的(我们有很多测试需要开始一一修复),那就太好了。我可以不时减少某种许可名单

这是当前的场景:

import warnings

class Addition:
    def __init__(self,int1,int2):
        self.int1 = int1
        self.int2 = int2

    def get_result(self):
        warnings.warn("The method get_result() is being deprecated. Use result() instead.",DeprecationWarning,2)
        return self.result()

    def result(self):
        return self.int1 + self.int2
from unittest import TestCase
from addition import Addition

class CustomTestCase(TestCase):
    # ...
    pass

class TestResultOperations(CustomTestCase):
    def test_addition(self):
        addition = Addition(2,3)
        self.assertEqual(addition.get_result(),5)

如果有帮助,我们正在使用 tox 运行这些测试。

解决方法

没有完整的答案,但有一些提示:

我不知道如何逐渐做到这一点。

我一般不会把所有的警告都变成异常,因为第 3 方库中的警告也会导致测试失败。

不过,您可以在 tox 的命令部分中使用破折号作为测试命令的前缀。然后,具有非零返回码的命令也可以运行并显示错误,而不会使完整的 tox 运行失败。

我很确定您可以使用 https://docs.python.org/3/using/cmdline.html#envvar-PYTHONWARNINGS 将警告转化为错误,但我必须查一下。我目前是移动设备。

更新

正如您提到的,您使用 pytest 作为测试运行器...

[testenv:businessasusual]
commands = pytest <your-tests>  # works as usual

[testenv:deprecations]
commands = - pytest -W error::DeprecationWarning <your-tests>  # works

...哪里

  • 领先的破折号(inl. space!!)使 tox 运行作为一个整体不会失败,但仍然显示失败!
  • "-W error::DeprecationWarning" 将警告转化为错误

然后您可以始终运行两者,或者通过 -e 只运行其中之一。

这最终意味着,显示了现在的测试错误,但不会中断 tox 运行。

,

这是我最终的做法:

class CustomTestCase(TestCase):
    @classmethod
    def setUpClass(cls):
      allow_DeprecationWarning_modules = [ 
            "...",# This is the allowlist,from where I will 
            "...",# progressively start removing modules that
            "...",# use deprecated calls
      ]  
      warnings.filterwarnings("error",category=DeprecationWarning)
      for mod in allow_DeprecationWarning_modules:
          warnings.filterwarnings("default",category=DeprecationWarning,module=mod)

方法 setUpClass 在开始测试之前运行一次。在那里,我将操作 "error" 设置为 DeprecationWarning 警告类别,并附加“异常”以表现为 "default"。请注意,这与测试运行程序无关。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。