使用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%]
我正在寻找如何制作双人间 @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%]