问题描述:
- 环境:Pycharm
- 问题复述:
在计算器的pytest练习中,老师要求封装 add, div 测试步骤到 yaml 文件, 可加法里面的测试数据的期望结果,和除法的不一样,如何通过pytest.mark.parametrize 一次性传参呢?
相关代码
calc.py 相关代码:
from decimal import Decimal
# 声明一个Calc类
class Calc:
# 定义类方法add,传入参数a和b, 方法的返回值是 a+b
def add(self, a, b):
return Decimal(str(a)) + Decimal(str(b))
# 定义类方法div,传入参数a和b, 方法的返回值是 a/b
def div(self, a, b):
return Decimal(str(a)) / Decimal(str(b))
test_calc.py 相关代码
# 定义一个get_data方法
def get_data():
# 定义一个data变量,将data.yml里面的数据读出来
data = yaml.safe_load(open("data/data.yml", encoding='UTF-8'))
# 方法返回 data
return data
@pytest.mark.parametrize('a, b, expect', get_data()["mix"])
def test_mix(self, a, b, expect, initialization):
self.get_steps(a, b, expect, initialization)
# 定义一个获取步骤文件内容的方法
def get_steps_file(self):
with open('steps/mix_steps.yml') as f:
return yaml.safe_load(f)
# 分析步骤文件里的内容
# 取出mix里面的add和div对应的测试数据
def get_steps(self, a, b, expect, initialization):
# 调用读取步骤文件的方法
steps = self.get_steps_file()
# 循环分析每一个步骤
for step in steps:
print(f"step=={step}")
# 若步骤等于add,则执行add的测试用例
if 'add' == step:
assert initialization.add(a,b) == Decimal(str(expect))
# 若步骤等于div,则执行div的测试用例
if 'div' == step:
assert initialization.div(a,b) == Decimal(str(expect))
mix_steps.yml 相关代码
- add
- div
data.yml 相关代码
mix:
- [1, 1, 2]
- [2, 3, 5]
报错信息:
因为加法和减法共用了一套数据,加法可以pass,但是除法会fail,因为case先执行的是加法步骤,再执行的除法步骤,在执行除法之后,整个case都fail掉了
解决办法:
我用了两套数据去分别执行加法和减法,虽然成功了,但是用了6个参数,而且后面如果增加减法和乘法,还需要额外6个,感觉太麻烦了,而且在结果树上(用例里面都是6个参数)看起来也很奇怪。。。所以求助一下老师和同学,怎么做更好?
test_calc.py 相关代码,修改了:
# 取出mix里面的add和div对应的测试数据
@pytest.mark.parametrize('a1, b1, expect1', get_data()["mix"]["add1"])
@pytest.mark.parametrize('a2, b2, expect2', get_data()["mix"]["div1"])
# 调用分析测试步骤的方法
def calc_mix(self, a1, b1, expect1, a2, b2, expect2, initialization):
self.get_steps(a1, b1, expect1, a2, b2, expect2, initialization)
# 分析步骤文件里的内容
def get_steps(self, a1, b1, expect1, a2, b2, expect2, initialization):
# 调用读取步骤文件的方法
steps = self.get_steps_file()
# 循环分析每一个步骤
for step in steps:
print(f"step=={step}")
# 若步骤等于add,则执行add的测试用例
if 'add' == step:
assert initialization.add(a1,b1) == expect1
# 若步骤等于div,则执行div的测试用例
if 'div' == step:
assert initialization.div(a2,b2) == expect2
data.yml 相关代码,修改了:
mix:
add1:
- [1, 1, 2]
- [2, 3, 5]
- [1, 3, 4]
div1:
- [2, 1, 2]
- [6, 2, 3]