gpt4 book ai didi

python - 使用pytest测试同一类的不同实例

转载 作者:行者123 更新时间:2023-12-04 08:43:07 25 4
gpt4 key购买 nike

我想做什么

我想使用 pytest (Python 3.x) 在同一类的不同实例上运行一组单元测试。

我尝试实现的想法

我想遍历预定义的参数列表。例如,我选择该列表的第一个条目并使用相应的参数实例化我的类。然后,我运行所有测试,其中所有测试都在我的类的同一个实例上运行。如果测试成功完成,我们选择参数列表的第二个条目,重新实例化我的类,然后再次运行测试。我们重复这个过程,直到到达参数列表的末尾或测试失败。

到目前为止我尝试了什么

到目前为止,“遍历预定义的参数列表”部分的想法正在发挥作用。特别是,我创建了一个具有以下结构的类:

@pytest.mark.usefixtures('setup_func')
class TestA(unittest.TestCase):
def test_1(self):
# do something with self.my_obj
self.assertEqual(X, Y)

def test_2(self):
# do something with self.my_obj
self.assertEqual(V, W)

如你所见,我在顶部定义了一个usefixtures;因此,当我执行命令 pytest tests 时,首先调用相应的函数(我在其中实例化 my_obj),然后执行测试。 setup_func 存储在 conftest.py 中,如下所示:

@pytest.fixture(scope='class')
def setup_func(request):
my_obj = ... # create the object
request.cls.my_obj = my_obj

我不确定这是否清楚,但是 self.my_obj 上的 test_1() 中的修改在 test_2() 中可见 -这是有意的。这些测试本质上是在 my_obj 中逐步执行一个过程,并在每一步之后进行测试是否符合预期。

我的问题

我如何修改上面的示例以使用 my_obj 的不同实例重复整个过程?

免责声明:我知道已经有很多讨论/帖子/等。人们通常引用 @pytest.mark.parametrize;但是,我看不出这在此处如何适用。

限制

我看到可以预先实例化所有可能的 my_obj 实例,这些实例已经在 setup_func 中,然后只需将这些对象的列表传递给测试函数。但是,这在我的场景中是不可行的,因为单个 my_obj 已经需要大量内存(因为它是一个数据生成器)。

最佳答案

你可以使用 pytest parametrizing fixtures .下面是没有与 Unittest 混合的纯 pytest 示例。也许这会有所帮助

import pytest


class MyObj:
def __init__(self, val):
self.val = val
self.step = 0

def __str__(self):
return f"MyObj val:{self.val} step: {self.step}"


@pytest.fixture(scope='class', params=["1", "2"])
def my_obj(request):
my_obj = MyObj(request.param)
return my_obj


@pytest.mark.usefixtures("my_obj")
class TestA:
def test_1(self, my_obj):
my_obj.step = 1
print(my_obj)
pass

def test_2(self, my_obj):
my_obj.step = 2
print(my_obj)

输出:

MyObj val:1 step: 1
MyObj val:1 step: 2
MyObj val:2 step: 1
MyObj val:2 step: 2

关于python - 使用pytest测试同一类的不同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64465706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com