我正在运行一些测试,其中一个将异常与其消息进行比较,看起来像这样,BaseCallback只是一个具有来自 的抽象方法的类abc,我正在测试如果未故意使用继承定义方法,则会出现错误我错过了__call__基类强制的方法
from base import BaseCallback
import pytest
def test_base_callback_call():
class MyDummyCallback(BaseCallback):
def __init__(self, metric):
self.metric = metric
def on_step(self, record=None, logbook=None, estimator=None):
print(record)
with pytest.raises(Exception) as excinfo:
callback = MyDummyCallback(metric="fitness")
assert (
str(excinfo.value) == "Can't instantiate abstract class MyDummyCallback with abstract methods __call__ "
)
Run Code Online (Sandbox Code Playgroud)
问题是我正在同时测试多个Python版本,它适用于Python 3.6、3.7和3.8,但在Python 3.9中,断言消息从“无法使用抽象方法调用实例化抽象类MyDummyCallback”更改为“ Can ” '不使用抽象方法 调用实例化抽象类 MyDummyCallback ”
所以这使得我的测试失败,因为缺少S
有没有办法在此函数中设置有效的 python 版本(例如从 3.6 到 3.8)并为 python 3.9 创建另一个测试?或者处理这种变化的建议方法是什么?
我通过检查 2 条消息中的 1 条进行了扭转,如果至少存在 1 条则测试通过,但感觉有点奇怪
小智 8
pytest 允许您使用skipif装饰器有条件地跳过测试。
@pytest.mark.skipif(sys.version_info >= (3, 9))
def test_base_callback_call():
...
Run Code Online (Sandbox Code Playgroud)
https://docs.pytest.org/en/6.2.x/skipping.html#id1