测试框架中的测试数据应该采取那种形式来维护,使用? csv? yaml? excel?
推荐excel:易于维护、灵活便捷。还可以设置颜色、字体、标注。总结——好看又好用
pip install openpyxl
D:/test001.xlsx
#封装公共方法读取Excel
def read_excel(file):
'''
读取Excel文件
:return:返回generator类型数据
'''
#打开工作簿
wb = load_workbook(file)
ws = wb.active
for d in ws.iter_rows(min_row=2, values_only=True):
yield d
在python的函数(function)定义中,只要出现了yield表达式(Yield expression),那么事实上定义的是一个generator function, 调用这个generator function返回值是一个generator。这根普通的函数调用有所区别,generator函数返回的是一个generator实例,generator有以下特别:
1.遵循迭代器(iterator)协议,迭代器协议需要实现__iter__、next接口
2.能过多次进入、多次返回,能够暂停函数体中代码的执行
通俗来说,就是不能直接返回结果,而是在你调用他的时候,生成一个结果,yield你可以看成牙膏,你每挤(调用)一次,他就出来一点(生成一个值),直到挤完()。请看代码示例:
b = read_excel('D:/test001.xlsx')
for i in b:
print(i) #每次print,可以看作每次调一次read_excel这个generator,就会返回一个从excel中读取的行,直到读完
运行返回结果:
(1, '正确用户名,密码登录', 'admin', 123)
(2, '正确用户名,错误密码登录', 'admin', 122)
(3, '正确用户名,密码为空登录', 'admin', None)
四、数据驱动测试
pytest的测试数据通过装饰器@pytest.mark.parametrize()
来实现
@pytest.mark.parametrize(args_name,args_value)
args_name:参数名,字符串,多个参数中间用逗号隔开
args_value:参数值(列表,元组,字典列表,字典元组),有多个值用例就会执行多少次,是list,多组数据用元祖类型;传三个或更多参数也是这样传。list的每个元素都是一个元组,元组里的每个元素和按参数顺序一一对应
当我们看到参数args_value:参数值(列表,元组,字典列表,字典元组)
时,有没有想起刚才generator的打印结果?
参数说明中:有多个值用例就会执行多少次
时,有没有想起前面的挤牙膏?这里的有多个值用例就会执行多少次
就等于,看你有多少牙膏,就挤你多少次。完美契合!!!
看代码:
@allure.title("{case_name}")
@pytest.mark.parametrize(
"NO, case_name, username, passwd",
read_excel('D:/test001.xlsx')
)
def test_search_001(NO, case_name, username, passwd):
elem_username.send_key(username)
elem_passwd.send_key(passwd)
login_btn.click()
这条用例的执行步骤如下:
1.用例开始执行,调用参数
2.调用read_excel()读取参数,返回第一行数据,作为"NO, case_name, username, passwd"
这几个参数名的值,传入用例
3.用例获取到参数值,执行完成
4.因为@pytest.mark.parametrize()是有多个值用例就会执行多少次
,所及继续执行
5.重复步骤1
6.重复步骤2
.
.
.
直到excel中的数据被按照行数读取完,该用例执行结束。
ps:读取的参数不仅可以用在用例的执行步骤中,还可以用在allure报告中,如@allure.title("{case_name}")
,实现在报告中参数化展示用例标题。allure报告如何使用