Pytest自动化测试框架关联/参数化实战

关联

利用Python提供的fixture可以实现关联

实现步骤:

在case目录下,新建conftest.py文件,比如我们需要token,就在这个文件下定义一个公共的方法,调用登录接口并返回需要的token值(注:公共的方法一般不传入参数,返回值其实也是看情况可要可不要的)

复制代码
@pytest.fixture(scope='function')   #使用pytest的fixture把下面的方法变成公共方法

在需要使用的测试案例中,传入方法名,在需要用到关联的参数时,直接使用

面试题:接口与接口之间的关联是怎么处理的?

答:框架使用的是Python的fixture,定义一个公共的方法,通过去引用这个人方法名字的方式,来自动调用这个公共的方法,并且获得需要的返回值,例如token,以此来解决关联的问题

pytest中数据和脚本分离(即实现参数化过程)

什么时候需要参数化

实际项目中,接口地址,请求头,请求参数等,这些都称为数据,一般来说,需要将数据单独存放,例如放在数据文件里

参数化一般用于相同接口不同参数的使用,比如登录接口,有登录成功和登录失败

pytest参数化

pytest的参数化主要有两种方式,第一种是使用pytest的parametrize实现参数化;第二种是使用数据文件

使用parametrize实现参数化

pytest参数化----parametrize理解:第一个参数是字符串,表示要给test_data()方法哪一个参数,即他俩是一样的,第二个参数给一个可序列的数据类型(即元组和数组),最后test_data()方法分别取序列的值执行

运行结果如下:

由此可以发现,现在的测试用例变成了四条,即可序列化元组(1,2,3,4)的长度,并且这时候的datas就是元组中的每个数据

使用parametrize编写第一个接口:

以此类推,可以编写多个接口

使用parametrize编写6个接口

优化

优化,还可以在每个测试案例前,加上接口名称,如下:

使用数据文件实现参数化

数据文件准备

可以用txt、excle、yaml等文件,存放数据,初学者推荐excle,比较直观

以下以excle文件为例:一般会有id、title、url、headers、method、data、http_code、msg几栏,注意sheet页

在data文件夹里存放数据文件

选中data文件夹,右键----在文件资源管理器中显示,将刚才的excle文件粘贴到data目录下

data文件夹下,就有个测试数据文件

取数据

这就会涉及到Python中读取excle的知识,需要用到Python中的第三方包xlrd

①安装xlrd包:pip3 install xlrd==1.2.0(指定版本)

②在utils中导入含文件读写方法的py文件

Python读取excle代码:

复制代码
复制代码
  1. import xlrd

  2. def read_excel(excel_path, sheet_name, skip_first=True):

  3. results = []

  4. datas = xlrd.open_workbook(excel_path) # 打开excel获取excel的操作对象

  5. table = datas.sheet_by_name(sheet_name) # 根据sheetname打开具体的页面

  6. # start_row = 1 if skip_first is True else 0

  7. if skip_first is True: # skip_first为true:从第二行取

  8. start_row = 1

  9. else:

  10. start_row = 0

  11. # 循环读取excel

  12. for row in range(start_row, table.nrows): # [1,2,3,4,5,6]

  13. results.append(table.row_values(row))

  14. return results

  15. # [

  16. # [行1],

  17. # [行2],

  18. # [行3]...

  19. # ]

  20. # 防止其他文件导入exceltools时执行这些代码,测试代码

  21. if __name__ == "__main__":

  22. a = read_excel(r'D:\小可爱\code\RCtest\data\人才管理系统.xlsx', "首页")

  23. print(len(a), type(a))

  24. for i in a :

  25. print(i)

在编写测试用例的py文件中里导入exceltools

代码如下:

复制代码
  1. import os,sys

  2. sys.path.append(os.getcwd())

  3. from utils.exceltools import read_excel

编写测试用例

首先,要特别注意读取excle返回的结果如下,是字符串类型的数据,需要eval一下,尤其注意token的值:'{"token":"user_login"}',可以发现,如果在excle数据文件中,如果直接写成{"token":user_login},那Python读取出来后,就会变成'{"token":user_login}',直接eval以下就能变成需要的字典格式

修改数据文件:

再次打印Python读取的excle文件,返回如下:

编写测试用例:

至此,实现了参数化的测试案例编写。

优化

观察可以发现,目前我们写的所有的测试案例,都是post方法的,一旦在excle表格中填写了其他类型的方法,那测试案例就会报错,因此,二次封装request方法很有必要(放在utils中)。

①封装代码如下:

复制代码
  1. import requests

  2. def http_request(url="", method="post", headers={}, json={}):

  3. if method == "post":

  4. return requests.post(url=url, headers=headers, json=json)

  5. elif method == "get":

  6. return requests.get(url=url, headers=headers, json=json)

  7. else:

  8. return False

②在测试案例中导入封装的方法:

复制代码
  1. import os,sys

  2. sys.path.append(os.getcwd())

  3. from utils.httprequest import http_request

③修改原测试案例(method参数之前就传了-----先见之明):

相关推荐
weixin_3823952317 分钟前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__22 分钟前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.1 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~2 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华3 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子5 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅5 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni6 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学7 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端