2017-02-22 31 views
1

我在参数化测试中无法访问灯具(本例中为capsys)。目前我使用的是虚拟夹具,使这项工作:从参数化测试中访问灯具(例如,capsys)

import pytest 

@pytest.fixture 
def params(request): 
    from collections import namedtuple 
    return namedtuple('Params', 'input output')(*request.param) 

@pytest.mark.parametrize('params', [ 
    ('a', '1a\n'), 
    ('b', '1b\n'), 
], indirect=True) 
def test_output(capsys, params): 
    print('1' + params.input) 
    out, err = capsys.readouterr() 
    assert out == params.output 

有没有办法改写这个代码不params灯具?

回答

1

你可以简单地删除indirect参数:

import pytest 

@pytest.mark.parametrize('params', [ 
    ('a', '1a\n'), 
    ('b', '1b\n'), 
]) 
def test_output(capsys, params): 
    inp, expected = params 
    print('1' + inp) 
    out, err = capsys.readouterr() 
    assert out == expected 

但更好的方法是直接用名字做parametrize传递参数:

import pytest 

@pytest.mark.parametrize('inp, expected', [ 
    ('a', '1a\n'), 
    ('b', '1b\n'), 
]) 
def test_output(capsys, inp, expected): 
    print('1' + inp) 
    out, err = capsys.readouterr() 
    assert out == expected 
+0

嗯,这是令人尴尬......当我试图为了让这个工作,我确定我看到错误的数量传递给测试的错误,但显然这个例子工作正常。谢谢! –