Pytest 如何为每个测试函数指定 python 版本

Pytest how to specify python version per test function

我正在 运行 进行一些测试,其中一个将异常与其消息进行比较,它看起来像这样,BaseCallback 只是一个 class 具有来自 [= 的抽象方法13=],我正在测试如果没有使用继承定义方法会出现错误,我故意错过了基础 class

强制要求的方法 __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__ "
    )

问题是我同时测试了几个 python 版本,它适用于 python 3.6、3.7 和 3.8 但在 python 3.9 中,断言消息从 “无法使用抽象 methods call 实例化抽象 class MyDummyCallback ” 到“无法用抽象 方法 调用 实例化抽象 class MyDummyCallback “

所以它使我的测试失败,因为缺少 S

有没有办法在此函数中设置有效的 python 版本(比如从 3.6 到 3.8)并为 python 3.9 创建另一个测试?或者处理此类更改的建议方法是什么?

我通过检查 2 条消息中的 1 条来扭转局面,如果至少存在 1 条则测试通过,但感觉有点奇怪

pytest 允许您使用 skipif 装饰器有条件地跳过测试。

@pytest.mark.skipif(sys.version_info >= (3, 9))
def test_base_callback_call():
   ...

https://docs.pytest.org/en/6.2.x/skipping.html#id1