【pytest】3.pytest的数据驱动

前言

测试框架中的测试数据应该采取那种形式来维护,使用? csv? yaml? excel?
推荐excel:易于维护、灵活便捷。还可以设置颜色、字体、标注。总结——好看又好用

一、安装依赖

 pip install openpyxl

二、创建Excel数据文件

D:/test001.xlsx

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报告如何使用

你可能感兴趣的:(pytest,pytest,python,开发语言)