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

news/2024/11/23 0:49:28/

目录

前言

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.ppmy.cn/news/59475.html

相关文章

Vulkan实战之Instance

文章目录 创建实例(**Creating an instance**)检查扩展支持(**Checking for extension support**)销毁清除(**Cleaning up**)最终代码 创建实例(Creating an instance) 您需要做的第一件事是通过创建一个实例来初始化Vulkan库。实例是应用程序和Vulkan库之间的连接&#xff0c…

Android9.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局

1.前言 在9.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…

总结一下vue的关键字和用处

Vue.js 是一个轻量级的 JavaScript 框架,用于构建用户界面和单页面应用程序。下面是一些 Vue.js 中的关键字和它们的用途: v-bind:用于动态绑定属性和事件监听器。例如,可以用 v-bind 绑定一个元素的属性(如&#xff…

node.js的核心模块

node的核心模块由一些精简而高效的库组成 文章目录 全局对象全局对象和全局变量processcosole utilutils.inheritsutils.inspect 事件机制事件发射器error 事件继承EventEmitter 文件系统访问fs.readFile(filename,[encoding],[callback(err,data)])fs.readFileSync(filename,…

Python小姿势 - ## Python中的迭代器与生成器

Python中的迭代器与生成器 在Python中,迭代是一个非常重要的概念,迭代器和生成器是迭代的两种最常见的形式。那么,迭代器与生成器有何不同呢? 首先,我们先来了解一下迭代器。 迭代器是一种对象,它可以记住遍…

Kubernetes云原生实战05 一键安装三主三从高可用集群

大家好,我是飘渺。 今天咱们继续更新Kubernetes云原生实战系列,本节文章会使用Kubekey安装一个三主三从的高可用集群。 在开始之前请分别登录kubernets集群节点,分别修改节点的主机名,跟第一章中提到的节点规划表保持一致。 hostnamectl set-hostname k8s-master1 hostn…

Activiti7流程操作详解

一、Activiti流程操作步骤 定义流程,按照BPMN的规范,使用流程定义工具,用流程符号把整个流程描述出来 部署流程,把画好的流程定义文件,加载到数据库中,生成表的数据 启动流程,使用java代码来操…

日志打印最佳实践

日志打印最佳实践 标题为什么要记录日志? 打印调试:用日志来记录变量或者某一段逻辑,记录程序运行的流程,即程序运行了哪些代码,方便排查逻辑问题。 问题定位:程序出异常或者出故障时快速的定位问题,方…