第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

 

posted @ 2023-02-08 22:05  小瓶子喵  阅读(1743)  评论(0)    收藏  举报