文章目录
- 前言
- 使用命令行实现过滤
- 未处理警告,执行结果
- 升级警告
- 忽略警告
- 忽略警告摘要
- 使用装饰器实现过滤
- 装饰方法
- 装饰类
- 装饰模块
- 使用配置文件实现过滤
前言
在
pytest
中执行测试时,可能会出现警告,这些警告通常是由于代码中存在某些可能导致问题或不符合最佳实践的情况。警告可能涉及各种方面,如未使用的变量、未实现的函数、过时的库用法等。
使用命令行实现过滤
模拟警告的代码示例
import warningsdef test_case_01():print("进入test_case_01函数")# 手动抛出一个警告warnings.warn(UserWarning("手动抛出一个警告"))assert 1 == 1
未处理警告,执行结果
执行命令:
pytest testcase/test_case_01.py -s -v
升级警告
执行命令:
pytest testcase/test_case_01.py -s -v -W error::UserWarning
忽略警告
执行命令:
pytest testcase/test_case_01.py -s -v -W ignore::UserWarning
忽略警告摘要
执行命令:
pytest testcase/test_case_01.py -s -v --disable-warnings
使用装饰器实现过滤
在
pytest
中,@pytest.mark.filterwarnings
装饰器允许我们向特定的测试项添加警告筛选器,以实现对警告的更细粒度控制。通常,
Python
的warnings
模块用于控制警告的输出,而pytest
通过其插件系统集成了对警告的管理。@pytest.mark.filterwarnings
装饰器提供了一种方便的方式来为特定的测试函数或方法定义警告筛选器。我们可以使用
@pytest.mark.filterwarnings
来指定:
- 要匹配的警告类别。
- 警告消息的匹配模式。
- 如何处理匹配的警告(例如,忽略它们或将其转换为错误)。
装饰方法
示例代码
import warningsimport pytestdef test_case_01():print("进入test_case_01函数")warnings.warn(UserWarning("手动抛出一个警告信息"))assert 1 == 1# 忽略指定类型的警告信息
# @pytest.mark.filterwarnings("ignore::UserWarning")
# 忽略匹配正则表达式的警告信息
@pytest.mark.filterwarnings("ignore:.*模拟.*")
def test_case_02():print("进入test_case_02函数")warnings.warn(UserWarning("模拟程序中出现的警告信息"))assert 1 == 1
执行结果
装饰类
示例代码:忽略含有
自定义
的警告
import warningsimport pytest@pytest.mark.filterwarnings("ignore:.*自定义.*")
class TestClassDemo2:print("进入类的内部")def test_case_01(self):print("进入test_case_01函数")warnings.warn(UserWarning("意外警告"))assert 1 == 1def test_case_02(self):print("进入test_case_02函数")warnings.warn(UserWarning("自定义警告"))assert 1 == 1def test_case_03(self):print("进入test_case_03函数")assert 1 == 1
执行结果
装饰模块
示例代码
import warningsimport pytest# 不指定需要忽略的警告类型,表示忽略全部警告
# pytestmark = pytest.mark.filterwarnings("ignore")
# 忽略匹配正则表达式的警告信息
pytestmark = pytest.mark.filterwarnings("ignore:.*自定义.*")def test_case():print("进入test_case函数")warnings.warn(UserWarning("自定义警告"))assert 1 == 1class TestClassDemo2:print("进入类的内部")def test_case_01(self):print("进入test_case_01函数")warnings.warn(UserWarning("意外警告"))assert 1 == 1def test_case_02(self):print("进入test_case_02函数")warnings.warn(UserWarning("自定义警告"))assert 1 == 1def test_case_03(self):print("进入test_case_03函数")assert 1 == 1
执行结果
使用配置文件实现过滤
pytest.ini
配置文件代码
[pytest]
filterwarnings =ignoreerror::UserWarning
示例代码
import warningsdef test_case():print("进入test_case函数")assert 1 == 1class TestClassDemo2:print("进入类的内部")def test_case_01(self):print("进入test_case_01函数")warnings.warn(ImportWarning("模拟导入过时模块警告"))assert 1 == 1def test_case_02(self):print("进入test_case_02函数")warnings.warn(RuntimeWarning("模拟运行时警告"))assert 1 == 1def test_case_03(self):print("进入test_case_03函数")warnings.warn(SyntaxWarning("模拟语法警告"))assert 1 == 1def test_case_04(self):print("进入test_case_04函数")warnings.warn(UserWarning("自定义警告"))assert 1 == 1
执行结果