利用Python如何实现数据驱动的接口自动化测试

news2024/12/24 9:05:03

目录

前言

1、需求

2、方案

3、实现

总结


前言

大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读取。下面话不多说了,来一起看看详细的介绍吧。

1、需求

某API,GET方法,token,mobile,email三个参数

  • token为必填项
  • mobile,email 必填其中1项
  • mobile为手机号,email为email格式

python接口自动化测试视频教程:

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibiliicon-default.png?t=N3I4https://www.bilibili.com/video/BV1AF411T7qJ/?spm_id_from=333.999.0.0  

 

2、方案

针对上面的API,在做接口测试时,需要的测试用例动辄会多达10+, 这个时候采用数据驱动的方式将共性的内容写入配置文件或许会更合适。

这里考虑把API、参数、以及预期结果预行在格式化的CSV里保存,利用csv组件从CSV里读取URL、参数以及预期结果,Requests组件发起请求,将响应结果与预期结果进行比对,最后把比对结果写到结果CSV。

流程如下图 

3、实现

1、在上代码之前,先安装好如下几个组件:

  • csv  读写CSV文件
  • json
  • requests  发起请求,获取响应结果
  • unittest    测试用例调度

2、data.csv(本示例选取部分用例)

3、reader_CSV函数代码示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

import csv

import json

import requests

import time

import unittest

def readCSV(self,filename):

 '''

 :param filename: 需要读取的数据文件

 :return: [{data1},{data2}...]

 '''

 datas = []

 try:

 #以DictReader的方式读取数据文件,方便与json互做转换

 with open(filename,'r') as csvfile :

 #从文件里读取到的数据转换成字典列表的格式

 reader = csv.DictReader(csvfile)

 for row in reader:

 data = {}

 data['id'] = row['id']

 data['url'] = row['url']

 data['token'] = str(row['token'])

 data['mobile'] = row['mobile']

 data['email'] = row['email']

 data['expect'] = json.dumps(row['expect']) \

 if isinstance(row['expect'],dict) \

 else row['expect'] #如果expect读取出来的不是json则取其原值,否则转为json格式保存到result里

 datas.append(data)

 return datas

 #如果文件找不到,返回空的datas

 except FileNotFoundError:

 print("文件不存在",filename)

 return datas

4、request_URL函数示例(包含GET请求和POST请求2个方法)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

def get_request(self,url,params):

 '''

 通用的调用GET接口方法

 :param url:string 接口路径

 :param params:{"":"","":""} 需要传入的参数

 :return: response响应体

 '''

 print("调用API...")

 r = requests.get(url,params=params)

 print(r.text)

 return r

def post_request(self,url,params):

 '''

 通用的调用POST接口方法

 :param url: string 接口路径

 :param params: {"":"","":""} 需要传入的参数

 :return:response响应体

 '''

 print("调用API...")

 r = requests.post(url,params=json.dumps(params)) #post的方法必须用json.dumps()转化成json格式

 print(r.text)

 return r

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibiliicon-default.png?t=N3I4https://www.bilibili.com/video/BV1AF411T7qJ/?spm_id_from=333.999.0.0                  

 

5、assert_Result函数示例

1

2

3

4

5

6

7

8

9

def assertResult(self,except_value,real_value):

 '''

 校验样本字符串中是否包含指定字符串

 :param except_value: string 指定字符串

 :param real_value: string 样本字符串

 :return: Boolean 样本中包含指定字符串返回True,否则返回False

 '''

 ifsuccess = except_value in str(real_value)

 return ifsuccess

6、write_CSV函数示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

def writeCSV(self,filename,results):

 '''

 写入csv文件指定内容

 :param filename: string 需要写入的文件名称

 :param results: [{data1},{data2},...] 写入的内容

 :return: 无

 '''

 print("写文件:",filename)

 #以DictWriter的方式写文件

 with open(filename,'w+') as csvfile:

 headers="id,url,token,mobile,email,expect,real_value,assert_value".split(",")

 writer = csv.DictWriter(csvfile,fieldnames=headers)

 #写表头

 writer.writeheader()

 #写数据

 if results.__len__() > 0 :

 for result in results:

 writer.writerow(result)

 csvfile.close()

7、test_interface1函数示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

def test_interface1(self):

 #指定读取的数据文件名称

 data_file = "../data/data.csv"

 #指定最终结果生成的数据文件名称

 result_file = "../data/result_{}.csv".format(str(time.time()).split(".")[0])

 #读取指定文件的数据

 datas = self.readCSV(data_file)

 #数据文件有内容则调用接口,否则直接测试结束

 if datas.__len__() > 0:

 results =[]

 #获取数据文件里的每一行

 for testcase in datas :

 result = {}

 result["id"] = testcase["id"]

 result["url"] = testcase["url"]

 result["token"] = testcase["token"]

 result["mobile"] = testcase["mobile"]

 result["email"] = testcase["email"]

 result["expect"] = testcase["expect"]

 #组装参数

 params = {

 "token":result["token"],

 "mobile":result["mobile"],

 "email":result["email"]

 }

 #调用API接口,获取响应结果

 real_value = self.get_request(result["url"],params)

 #调用assert方法,检查预期结果是否在响应结果中存在

 assert_value = self.assertResult(result["expect"],real_value.text)

 result["real_value"] = real_value.text

 result["assert_value"] = assert_value

 #获取每一行里的所有字段以及实际结果和验证结果

 results.append(result)

 #执行完所有记录后,将所有结果写入result.csv

 self.writeCSV(result_file,results) #写入csv文件

 print("测试结束")

8、result_1523956055.csv(本示例中的测试结果请忽略)

总结

python封装了很多方法,对于测试来说开发速度相对较快,接口自动化测试如果采用CSV管理的数据驱动方式,使用csv+requests是测试开发不容错过的利器之一。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/483528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HbuilderX打包AndroidAPP使用教程

HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE。HBuilder的编写用到了Java、C、Web和Ruby。HBuilder本身主体是由Java编写。它基于Eclipse,所以顺其自然地兼容了Eclipse的插件。 HbuildX打包android的apk安装包时需要新建项目 …

Insix:面向真实的生成数据增强,用于Nuclei实例分割

文章目录 InsMix: Towards Realistic Generative Data Augmentation for Nuclei Instance Segmentation摘要本文方法数据增强方法具有形态学约束的前景增强提高鲁棒性的背景扰动 实验结果 InsMix: Towards Realistic Generative Data Augmentation for Nuclei Instance Segment…

Go语言开发小技巧易错点100例(七)

往期回顾: Go语言开发小技巧&易错点100例(一)Go语言开发小技巧&易错点100例(二)Go语言开发小技巧&易错点100例(三)Go语言开发小技巧&易错点100例(四)Go…

云原生Istio基本介绍

目录 1 什么是Istio2 Istio特征2.1 连接2.2 安全2.3 策略2.4 观察 3 Istio与服务治理3.1服务治理的三种形态 4 Istio与Kubernetes4.1 Kubernetes介绍4.2 Istio是Kubernetes的好帮手4.3 Kubernetes是Istio的好基座 5 Istio与服务网格5.1 时代选择服务网格5.2 服务网格选择Istio …

【Python入门】Pycharm的使用指南

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

五、C++内存管理机制 —— 分配器allocator(侯捷)

侯捷 C八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C 面向对象高级开发 1、C面向对象高级编程(上) 2、C面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C 设计模式 四、C 新标准 五、C 内存管…

剑指 Offer 12. 矩阵中的路径 / LeetCode 79. 单词搜索(深度优先搜索)

题目: 链接:剑指 Offer 12. 矩阵中的路径;LeetCode 79. 单词搜索 难度:中等 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 fals…

计算机组成原理笔记---整理自用

第二章 - 运算器 2.1.3 无符号整数 概述 机器字长限制了一次能处理数据位数的上限 无符号减法⭐️ 总结 2.1.4 带符号整数 原码 真值0有两种形式 0和-0n 1位机器字长原码的表示范围缺点:无法进行有符号加法运算 缺点 数值转换⭐️ 补码运算 加减法 – 符…

2023 年 五一杯 D 题大奖预定第一问求解过程与结果

文章目录 第一题问题分析PageRank 算法(可跳过)PageRank 算法修正权重系数 结果各城市链出与链入链出 权重链入 权重 PageRank 算法结果代码 第一题 问题分析 从收货量、发货量、快递数量增长/减少趋势、相关性等多角度考虑,建立数学模型&…

[MAUI]模仿iOS多任务切换卡片滑动的交互实现

文章目录 原理创建布局创建分布函数创建动效创建绑定数据细节调整首张卡片的处理为卡片添加裁剪跳转到最后一张卡片 项目地址 看了上一篇博文的评论,大家对MAUI还是比较感兴趣的,非常感谢大家的关注,这个专栏我争取周更😉。 App之…

git把我本地文件传到我的指定的仓库

在使用Git将本地文件推送到指定仓库之前,请确保已经安装了Git并进行了基本配置。接下来,遵循以下步骤将本地文件推送到远程仓库: 兄弟先赏析悦目一下,摸个鱼 首先,在本地文件夹中打开命令行界面(在Windows上…

关于I帧/IDR、B帧、P帧、SPS、PPS

在h264编解码中,常常有I帧/IDR/B帧/P帧/IDR/NALU/GOP/,但往往没有关注细节。或者我们本身在实际应用中与使用过很多次,但对相关的技术名词不清楚。 在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只…

【C语言】 知识点汇总--基础知识点梳理(超全超详细)

目录 一、从源代码到exe 二、基本数据类型 三、字符在屏幕上的显示原理 四、溢出现象 五、类型转换规律 六、短路问题 七、指针变量类型的作用 八、指针类型的扩展——多级指针 九、指针类型的扩展——指针数组 十、指针类型的扩展——数组指针 十一、一维数组-名-特…

Doris(24):Doris的函数—聚合函数

1 APPROX_COUNT_DISTINCT(expr) 返回类似于 COUNT(DISTINCT col) 结果的近似值聚合函数。 它比 COUNT 和 DISTINCT 组合的速度更快,并使用固定大小的内存,因此对于高基数的列可以使用更少的内存。 select city,approx_count_distinct(user_id) from site_visit group by c…

Go语言-数据结构与算法

20.4 稀疏 sparsearray 数组 20.4.1 先看一个实际的需求  编写的五子棋程序中,有存盘退出和续上盘的功能 稀疏数组的处理方法是 : 1) 记录数组一共有几行几列,有多少个不同的值 2) 思想:把具有不同值的元素的行列及值记录在一个…

前端三剑客之HTML】

⭐个人主页:书生♡博客主页🙋‍♂ 🍑博客领域:java编程,前端,算法,强训题目 写作风格:干货,干货,还是tmd的干货 支持博主:点赞、收藏⭐、留言💬 目录 1.前端1.1什么是前端…

MySQL学习笔记第七天

第07章单行函数 2. 数值函数 2.4 指数函数、对数函数 函数用法POW(x,y)&#xff0c;POWER(X,Y)返回x的y次方EXP(X)返回e的x次方&#xff0c;其中e是一个常数&#xff0c;2.718281828459045LN(X)&#xff0c;LOG(X)返回以e为底的X的对数&#xff0c;当x<0时&#xff0c;返…

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集模块设计(一)总体方案

本章将根据高速数据采集指标要求&#xff0c;分析并确定高速数据采集模块的设计方 案&#xff0c;由此分析数据存储需求及存储速度需求给出高速大容量数据存储方案&#xff0c;完成 双通道高速数据采集模块总体设计方案&#xff0c;并综合采集、存储方案及 AXIe 接口需求 …

第一个C++程序

一、c结构 计算两个数的和&#xff1a; #include <iostream> using namespace std;int main(){int a,b;cin>>a>>b;cout<<"ab"<<ab<<endl;return 0; } #include <iostream> 是 C 标准库中的头文件之一&#xff0c;它包含…

Python程序员的薪资待遇怎么样?我来讲述一下自己五年的工作经历

大家好&#xff0c;我是一名毕业五年的程序员。接下来我将讲述一下我的五年经历&#xff0c;以及一些关于程序员薪资的问题。大学时学的是计算机专业&#xff0c;当时选择这个专业是因为听说这个专业比较好找工作。于是我就选了计算机专业&#xff0c;然后在大四的时候开始找工…