覆盖pytest参数化函数名称

时间:2016-06-01 17:56:10

标签: python rename pytest fixtures parameterized

我的参数确定参数化pytest的名称。我将使用一些随机化的参数进行这些测试。为了使我在junit中的报告名称不被搞砸,我想为每个参数化测试创建一个静态名称。

有可能吗?

JUnit似乎有一个参数:Changing names of parameterized tests

class TestMe:
    @pytest.mark.parametrize(
        ("testname", "op", "value"),
        [
            ("testA", "plus", "3"),
            ("testB", "minus", "1"),
        ]
    )
    def test_ops(self, testname, op, value):

我尝试覆盖request.node.name但是我只能在测试执行期间重命名它。

我几乎是肯定的,我要么需要编写插件,要么需要一个夹具。您认为最好的方法是什么?

2 个答案:

答案 0 :(得分:14)

您正在寻找pytest.mark.parametrizeids参数:

  

字符串ID列表或可调用字符串。如果字符串,每个都对应   到argvalues,以便它们是测试ID的一部分。如果可以调用它   应该采用一个参数(单个argvalue)并返回一个字符串或   返回

您的代码看起来像

@pytest.mark.parametrize(
    ("testname", "op", "value"),
    [
        ("testA", "plus", "3"),
        ("testB", "minus", "1"),
    ],
    ids=['testA id', 'testB id']
)
def test_industry(self, testname, op, value):

答案 1 :(得分:1)

您还可以在https://github.com/singular-labs/parametrization或pypi上使用pytest参数包装器

<input
    type="file"
    ref="src"
    accept="*"
    @change="onFilePicked"
>

onFilePicked (e) {
    const files = e.target.files;
    if(files[0] !== undefined) {
        this.upload.src.name = files[0].name;
        this.upload.src.type = files[0].name;
        this.file.object = files[0];
        if (this.upload.src.name.lastIndexOf('.') <= 0) return;
        const fr = new FileReader();
        fr.readAsDataURL(files[0]);
        fr.addEventListener('load', () => {
            this.upload.src.url = fr.result;
            this.upload.src.file = files[0]; 
        });
        fr.onload = () => {
            this.uploadSource();
        }
    } else {
        this.upload.src.name = '';
        this.upload.src.file = '';
        this.upload.src.url = '';
    }
},

您的代码如下:

pip install pytest-parametrization

等于:

from parametrization import Parametrization

class TestMe:
    @Parametrization.autodetect_parameters()
    @Parametrization.case(name="testA", op='plus', value=3)
    @Parametrization.case(name="testB", op='minus', value=1)
    def test_ops(self, op, value):
        ...