使用pytest制作多个@pytest.mark.parametrize

Make multiple @pytest.mark.parametrize with pytest

我正在寻找如何制作双人间 @pytest.mark.parametrize

这个包装器有很大的优势,因为它允许您测试参数上的断言,如果它为假则移至下一个参数。

我想做一个双 @pytest.mark.parametrize 来比较两个表:

excepted = {"Parametre 1":{"Objet 1":"Yes","Objet 2":"Yes","Objet 3":"Yes"},"Parametre 2":{"Objet 1":"No","Objet 2":"Yes","Objet 3":"Yes"}}
obtained = {"Parametre 1":{"Objet 1":"Non","Objet 2":"Yes","Objet 3":"Yes"},"Parametre 2":{"Objet 1":"No","Objet 2":"Yes","Objet 3":"Yes"}}

my tables :

excepted : 
         Parametre 1 Parametre 2
Objet 1         Yes          No
Objet 2         Yes         Yes
Objet 3         Yes         Yes

obtained : 
         Parametre 1 Parametre 2
Objet 1         Non          No
Objet 2         Yes         Yes
Objet 3         Yes         Yes

喜欢下面的方法:

import pytest
import pandas as pd
@pytest.mark.parametrize("objet", ['Objet 1', 'Objet 2', 'Objet 3'])
def object_test(objet: str):
    obtained = pd.DataFrame(obtained)
    assert objet in obtained.index.values
    excepted = pd.DataFrame(excepted)
    for column in results.columns:
        obtained_cell = obtained.loc[objet][column]
        excepted_cell = excepted.loc[objet][column]
        test_cell(objet, obtained_cell, excepted_cell)


def test_cell(object_name, obtained_cell, excepted_cell):
    if excepted_cell  == 'Yes':
        assert obtained_cell == excepted_cell, f"{object_name}"
    else:
    if obtained_cell == 'Yes':
        warnings.warn(UserWarning(f"bad annotation"))

我会在上面添加 test_cell

@pytest.mark.parametrize(["object_name, obtained_cell, excepted_cell"], object_test())
def test_cell(object_name, obtained_cell, excepted_cell):

但我不能,因为我必须为我的函数指定值对象

如果我对您的查询的理解正确,您需要以参数化方式传递来自 3 个不同实体的每个项目。这可以使用相同的参数化夹具轻松实现。

official doc 开始,您可以这样做:

def object_test(objet: str):    # not sure from where you'd pass this
    obtained = pd.DataFrame(obtained)    # not sure how you'd access `obtained`
    assert objet in obtained.index.values
    excepted = pd.DataFrame(excepted)
    for column in results.columns:
        obtained_cell = obtained.loc[objet][column]
        excepted_cell = excepted.loc[objet][column]
        yield (objet, obtained_cell, excepted_cell)  # THIS IS WHAT YOU DO

@pytest.mark.parametrize("object_name,obtained_cell,excepted_cell", object_test())
def test_cell(object_name, obtained_cell, excepted_cell):
    assert object_name

示例:

def object():
    for x in range(5):
        yield (x, x**2, x**3)

@pytest.mark.parametrize("x,y,z", object())
def test_me(x, y, z):
    assert x ** 2 == y
    assert x ** 3 == z

$ pytest tests/test_me.py

tests/test_me.py::test_me[0-0-0] PASSED                                [ 20%]
tests/test_me.py::test_me[1-1-1] PASSED                                [ 40%]
tests/test_me.py::test_me[2-4-8] PASSED                                [ 60%]
tests/test_me.py::test_me[3-9-27] PASSED                               [ 80%]
tests/test_me.py::test_me[4-16-64] PASSED                              [100%]