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

Rod*_*o A 1 python pytest

我正在运行一些测试,其中一个将异常与其消息进行比较,看起来像这样,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