【问题标题】:Using pytest, can I get fixture values outside test function?使用 pytest,我可以在测试功能之外获取夹具值吗?
【发布时间】:2019-01-22 06:55:44
【问题描述】:

我正在使用参数化测试来测试 2 个不同的数据集。比如像这样。 some_data() 函数返回测试数据。

test_data = [
    (some_data1_v1(), some_data2_v2()),
    (some_data1_v2(), some_data2_v2())
]

@pytest.mark.parametrize('a,b', test_data)
def test_fn(a,b):
    pass

但是对于一些只检查一般行为的测试,我不需要测试 2 个数据集,因为这两个数据集都有适当的一般数据。 我想将some_data1_v1() 函数转换为夹具并在测试中使用它,像这样

def test_fn2(some_data1_v1):
    pass

如果我愿意,那么在test_data 列表构造期间调用some_data1_v1() 引发异常Fixtures are not meant to be called directly...

所以改为这个

def test_fn2(some_data1_v1):
    pass

我喜欢这个

@pytest.mark.parametrize('some_data1_v1', [some_data1_v1()])
def test_fn2(some_data1_v1):
    pass

这让我有一个测试数据源——“假夹具”(返回数据的常用函数),并在test_data 列表中传递测试数据(第一个示例或最后一个示例)。但我认为我在常用函数中存储数据的方法是打破“夹具抽象”。

有没有更好的方法来做我所做的事情?

【问题讨论】:

    标签: python pytest fixtures


    【解决方案1】:

    您可以使用parametrized fixturerequest.param 指的是params 序列中的具体条目

    例如:

    @pytest.fixture(params=(1, 2, 3))
    def fix1(request):
        return request.param
    
    
    @pytest.fixture(params=(4, 5, 6))
    def fix2(request):
        return request.param
    
    
    def test1(fix1, fix2):
        print(fix1, fix2)
    
    
    def test2(fix1):
        print(fix1)
    

    和执行:

    $ pytest t.py
    
    ...
    
    collected 12 items                                                             
    
    t.py::test1[1-4] 1 4
    PASSED
    t.py::test1[1-5] 1 5
    PASSED
    t.py::test1[1-6] 1 6
    PASSED
    t.py::test1[2-4] 2 4
    PASSED
    t.py::test1[2-5] 2 5
    PASSED
    t.py::test1[2-6] 2 6
    PASSED
    t.py::test1[3-4] 3 4
    PASSED
    t.py::test1[3-5] 3 5
    PASSED
    t.py::test1[3-6] 3 6
    PASSED
    t.py::test2[1] 1
    PASSED
    t.py::test2[2] 2
    PASSED
    t.py::test2[3] 3
    PASSED
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-06
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多