如何解决将逐步`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 举报,一经查实,本站将立刻删除。