首页 > 解决方案 > 对相似类型的测试进行参数化

问题描述

我有一个A由两种类型B1B2. 我想编写一个测试套件来检查两者B1并正确B2实施A。说是形式

class A:
    def __init__(self, from_object): pass
    def do_something(self): pass

并且B1B2继承A。我的测试看起来像

class TestA:
    @pytest.fixture(params=[input1, input2])
    def some_data(request):
        return T(request.param)
    @pytest.mark.parametrize("with_object", [pytest.lazy_fixture("some_data")])
    def test_do_something(with_object):
        assert with_object.do_something() == expectation

我想T达到B1and B2,但我不知道如何很好地实现这一目标。你对此有什么提示吗?

标签: pythonunit-testingpytest

解决方案


通常我会实现这一点,但使用indirect=True将参数(在您的情况下为 2 个不同的类)传递给some_data夹具,然后可以访问它request.param并返回一个初始化的对象:

class TestA:
    @pytest.fixture()
    def some_data(self, request):
        return request.param()

    @pytest.mark.parametrize("some_data", (B1, B2), indirect=True)
    def test_do_something(self, some_data):
        assert some_data.do_something() == expectation

这假设这将比我的示例中的/some_data()进行更复杂的初始化,因为否则您实际上不需要该固定装置。如果夹具需要一些额外的参数化数据,您可以使输入参数更复杂:B1B2

class TestA:
    @pytest.fixture()
    def some_data(self, request):
        return request.param[0](request.param[1])

    @pytest.mark.parametrize(
        "some_data",
        ((B1, {'abc': 'xyz'}), (B2, {'abc': 'xyz'})),
        indirect=True
    )
    def test_do_something(self, some_data):
        assert some_data.do_something() == expectation

推荐阅读