第3课、Pytest参数化-parametrize和excel yaml文件读写
一、parametrize介绍
参数化的目的是为了使测试用例代码与测试数据进行分离,这样,测试人员只需要维护测试数据,而不用更改代码。pytest模块给我们提供了专门用来参数化的装饰器:@pytest.mark.parametrize() 。
使用规则:
@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None,
scope=None))
argnames:必传,参数名, 以逗号分隔的字符串,表示一个或多个参数名称(key),或参数字符串的列表/元组
argvalues:必传,参数值,若argnames有一个刚单值列表传入,若argnames有多个,以套用元组的列表展示,无组内与参数名一一对应
indirect:为true时,那argnames一定是一个fixture函数名称,argvalues值将传入对应的fixture内,相当于@pytest.fixture(params=)的用法,默认False
ids:标记子用例执行名称,与argvalues数量一致,未指定自动生成,默认None
scope:如果指定,则表示参数的范围。范围用于按参数实例对测试进行分组。它还将覆盖任何fixture函数定义的范围,允许使用测试上下文或配置设置动态范围
代码实例:
import pytest class TestCase(): test_data = [{"username":"用户1","psw":"密码1"},{"username":"用户2","psw":"密码2"}] @pytest.mark.parametrize("test_data", test_data) def test_demo1(self,test_data): print('请输入用户:{}'.format(test_data['username'])) print('请输入密码:{}'.format(test_data['psw'])) assert "1" == "1"

二、【数据驱动】excel数据读取
cmd安装xlrd模块:
pip install xlrd==1.2.0
语法:
基本操作语句
参数rowx代表行的索引,第一行是0。
import xlrd data = xlrd.open_workbook("data_demo.xls") #打开文件,返回一个Book对象 #book中的操作 table = data.sheets()[0] #通过索引顺序获取,返回Sheet对象 table = data.sheet_by_index(0) #通过索引顺序获取,返回Sheet对象 table = data.sheet_by_name("工作表一") #通过名称获取,返回Sheet对象,一般用这个 #sheet中的操作 #返回book中所有工作表的名字,如:['工作表一', '工作表二', '工作表三'] names = data.sheet_names() #检查某个sheet是否导入完毕,返回布尔型 state = data.sheet_loaded("工作表一" or 1) #行(row)操作 #获取该sheet中的有效行数 nrows = table.nrows #返回由该行中所有的单元格对象组成的列表,列表中是一个个Cell对象(数据类型:值)。0是第一行 row = table.row(rowx) #返回由该行中所有的单元格对象组成的列表,与上一个一样 row = table.row_slice(rowx) len = table.row_len(rowx) #返回该列的有效单元格长度 #获取第三行数据,第start列到第end列(start~end列)[不含第end列]。 返回由该行中所有单元格的数据类型组成的列表, 如:array('B', [2, 1, 1])#注:0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error types = table.row_types(rowx, start_colx=0, end_colx=None) #获取第四行数据,第start列到第end列(start~end列)[不含第end列]。 返回由该行中所有单元格的数据组成的列表 values = table.row_values(rowx, start_colx=0, end_colx=None) 列(col)操作 #获取列表的有效列数 ncols = table.ncols #返回由该列中所有的单元格对象组成的列表 col = table.col(colx, start_rowx=0, end_rowx=None) #返回由该列中所有的单元格对象组成的列表 col = table.col_slice(colx, start_rowx=0, end_rowx=None) #返回由该列中所有单元格的数据类型组成的列表 types = table.col_types(colx, start_rowx=0, end_rowx=None) #返回由该列中所有单元格的数据组成的列表 values = table.col_values(colx, start_rowx=0, end_rowx=None) #单元格操作 cell = table.cell(rowx,colx) #返回单元格对象 type = table.cell_type(rowx,colx) #返回单元格中的数据类型 value = table.cell_value(rowx,colx) #返回单元格中的数据
一、excel文档读取:
import pytest import xlrd def dict_date(filename,sheetname): # 初始化工作 data = xlrd.open_workbook(filename) # 打开表格文件 table = data.sheet_by_name(sheetname) # 打开sheet页 header = table.row_values(0) # 获取第一行的标题 rowNum = table.nrows # 获取总行数 colNum = table.ncols # 获取总列数 print("总行数:{}".format(rowNum)) print("总列数:{}".format(colNum)) if rowNum <= 1: print("总行数小于1") else: r = [] j = 1 for i in range(rowNum - 1): #rowNum一共6行,去掉标题就是5行数据 s = {} # 从第二行取对应的values值 values = table.row_values(j) for x in range(colNum): s[header[x]] = values[x] r.append(s) j += 1 return r if __name__ == "__main__": print(dict_date("data.xlsx","Sheet1"))

二、excel文档写入:
cmd安装xlwt模块
pip install xlwt
基本操作:
import xlwt #创建工作簿,encoding='utf-8',设置字符编码就可以在excel中输出中文了。 默认是ascii。style_compression 表示是否压缩,不常用 workbook = xlwt.Workbook(encoding='ascii',style_compression=0) #创建工作表 oneWorkSheet = workbook.add_sheet("sheet1") #写入数据(行,列,数据) oneWorkSheet.write(0, 0, "hello") #保存数据 workbook.save("./myExcel.xls")
写入excel实例:
import xlwt #封装数据写入方法 def excl_write(list_data, excel_path): '''表格写入全部数据''' if not isinstance(list_data, list): raise TypeError("数据必须是列表") # 1.初始化操作 workbook = xlwt.Workbook(encoding='utf-8') worksheet = workbook.add_sheet("工作表一") # 2.先写入标题行 keys_data = list(list_data[0].keys()) num = len(keys_data) for c in range(num): worksheet.write(0, c, label=keys_data[c]) # 3.写入数据信息 rows_num = len(list_data) for r in range(rows_num): values_data = list(list_data[r].values()) cows_num = len(values_data) for c in range(cows_num): worksheet.write(r + 1, c, values_data[c]) # 保存数据到硬盘 workbook.save(excel_path) if __name__ == '__main__': data = [{'ID': 1.0, '用户名': 'user1', '密码': 'psw1'}, {'ID': 2.0, '用户名': 'user2', '密码': 'psw2'}, {'ID': 3.0, '用户名': 'user3', '密码': 'psw3'}, {'ID': 4.0, '用户名': 'user4', '密码': 'psw4'}, {'ID': 5.0, '用户名': 'user5', '密码': 'psw5'}] excl_write(data,'./myExcel.xlsx')

三、excel参数化实例应用
excel数据驱动实践:
1,从数据文件中读取数据,数据格式必须是列表中套多个字典的形式,如[{}]
2,将读取到的数据通过parametrize装饰器传入测试用例函数中
import pytest from read_demo import dict_date case_data = dict_date('data.xlsx','Sheet1') #1.将数据从文件读取 class TestCase(): @pytest.mark.parametrize('data',case_data) #2.读取的数据需要用parametrize装饰器传入用例 def test_login_case(self,data): '''登录测试''' print("输入用户名:{}".format(data['用户名'])) print("输入密码:{}".format(data['密码'])) assert 1 == 1
浙公网安备 33010602011771号