如何在pytest中标记特定方法为非测试方法(不全局修改规则)
解决pytest误识别tf.test.TestCase.test_session为测试方法的问题
这个问题我之前在TensorFlow+pytest的组合测试里也碰到过,确实挺头疼——pytest默认会把所有以test_开头的方法都当成测试用例,哪怕它是父类提供的工具方法。给你两个不用全局修改pytest配置的优雅解决方案:
方法一:给方法设置__test__ = False
直接在类里给test_session方法添加__test__属性并设为False,pytest在扫描测试方法时会自动忽略这个方法:
from contextlib import contextmanager import tensorflow as tf class TestCase(tf.test.TestCase): @contextmanager def test_session(self): with super().test_session() as sess: yield sess # 核心设置:告诉pytest这不是测试方法 test_session.__test__ = False
这种方式的好处是完全保留原方法名,不影响你在测试用例里正常调用self.test_session(),同时不会在测试报告里留下任何跳过的标记,因为它根本不会被pytest识别为测试用例。
方法二:使用@pytest.mark.nottest装饰器
如果你觉得设置属性的写法不够直观,可以用pytest官方提供的nottest装饰器,作用和上面完全一致:
import pytest from contextlib import contextmanager import tensorflow as tf class TestCase(tf.test.TestCase): @pytest.mark.nottest @contextmanager def test_session(self): with super().test_session() as sess: yield sess
这个装饰器专门用来标记非测试方法,可读性更强,只要你的pytest版本在3.0以上(现在大部分项目都是)就可以正常使用。
这两种方案都不需要修改全局的pytest配置,完全针对这个特定方法处理,完美解决你之前用@pytest.mark.skip导致测试报告出现跳过标记的问题。
内容的提问来源于stack exchange,提问作者xiang0x48
相关产品推荐
相关产品推荐

