关于接口测试——自动化框架的设计与实现

一、自动化测试框架

在大部分测试人员眼中只要沾上“框架”,就感觉非常神秘,非常遥远。大家之所以觉得复杂,是因为落地运用起来很复杂;每个公司,每个业务及产品线的业务流程都不一样,所以就导致了“自动化测试框架”去完成自动化测试的时候产生很多不稳定因素,这样就很难定位成一个固定的框架。其实不然,真正的自动化测试框架不是一个模式,而是一种思想和方法的集合,通俗的讲就是一个架构。

二、自动化测试框架思想

为了更好的了解自动化测试框架,我们先从自动化测试的发展历程说起;一般测试工作限在3年以上且接触过自动化测试的应该对以下几种自动化测试框架思想有一定的认知:

  • 模块化思想

  • 库思想

  • 数据驱动思想

  • 关键字驱动思想

以上仅仅是代表了一种自动化测试的思想,并不能定义为框架。上面讲到框架=思想+方法,于是演化了以下五种框架:

1、模块化测试脚本框架

需要创建小而独立的可以描述的模块、片断以及待测应用程序的脚本。这些树状结构的小脚本组合起来,就能组成能用于特定的测试用例的脚本。

2、测试库框架

与模块化测试脚本框架很类似,并且具有同样的优点。不同的是测试库框架把待测应用程序分解为过程和函数而不是脚本。这个框架需要创建描述模块、片断以及待测应用程序的功能库文件。

3、关键字驱动或表驱动的测试框架

这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具,并可以用来“驱动"待测应用程序和数据的测试脚本代码,关键宇驱动测试看上去与手工测试用例很类似。在一个关键字驱动测试中,把待测应用程序的功能和每个测试的执行步骤一起写到一个表中。

这个测试框架可以通过很少的代码来产生大量的测试用例。同样的代码在用数据表来产生各个测试用例的同时被复用。

4、数据驱动测试框架

在这里测试的输入和输出数据是从数据文件中读取(数据池,ODBC源,CSV文件,EXCEL文件,Json文件,Yaml文件,ADO对象等)并且通过捕获工具生成或者手工生成的代码脚本被载入到变量中。在这个框架中,变量不仅被用来存放输入值还被用来存放输出的验证值。整个程序中,测试脚本来读取数值文件,记载测试状态和信息。这类似于表驱动测试,在表驱动测 试中,它的测试用例是包含在数据文件而不是在脚本中,对于数据而言,脚本仅仅是一个“驱动器”,或者是一个传送机构。然而,数据驱动测试不同于表驱动测试,尽管导航数据并不包含在表结构中。在数据驱动测试中,数据文件中只包含测试数据。

5、混合测试自动化框架

最普遍的执行框架是上面介绍的所有技术的一个结合,取其长处,弥补其不足。这个混合测试框架是由大部分框架随着时间并经过若干项目演化而来的。

三、接口自动化测试框架策略
  1. 设计出来的框架是直接给测试人员,而且其他的测试人员只需要简单的向里面不断的补充测试用例即可;所以我们的框架设计必须三简化即操作简单,维护简单,扩展简单。

  2. 设计框架的同时一定要结合业务流程,而且不仅仅靠技术实现,其实技术实现不难,难点对业务流程的理解和把握。

  3. 设计框架时要将基础的封装成公用的,如:get请求、post请求和断言封装成同基础通用类。

  4. 测试用例要与代码分享,这样便于用例管理,所以将我们选择上面的数据驱动思想。

四、接口自动化测试框架设计
1、进行接口框架设计前,我们先看看当前的一些主流接口自动化工具框架

2、以上各工具特性 

根据以上的特性可得我们优先考虑Python+Requests和HttpRunner;下面我们根据其两个框架分别来分析下用例执行过程。

3、用例执行解析

Python的Requests库针对所有的HTTP请求方法,采用的是统一的接口

requests.request(method, url, **kwargs)

其中,kwargs可以保护HTTP请求所有可能用到的信息,例如:headers、cookies、params、data、auth等。所以,只要遵循Requests的参数规范,在接口测试用例中复用Requests参数的概念即可。而HttpRunner处理逻辑很简单,直接读取测试用例中的各项参数,传递给Requests发起请求。

1)Requests接口请求示例


def test_login(self):

url = "www.xxx.com/api/users/login"

data = {

"name": "user1",

"password": "123456"

}

resp = requests.post(url, json=data)

self.assertEqual(200, resp.status_code)

self.assertEqual(True, resp.json()["success"])

在该用例中,实现了HTTP POST请求,然后对响应结果进行判断,检查响应code等是否符合预期。

这样的用例在实际项目中会存在两个问题:

  • 用例模式基本固定,会存在大量相似或重复的用例,用例维护有很大问题

  • 用例与执行代码不分离,参数数据也未分离,同样不易维护

2)HttpRunner使用json/yaml格式处理测试用例,分离后的用例描述如下


{

"name": "test login",

"request": {

"url": "www.xxx.com/api/users/login",

"method": "POST",

"headers": {

"content-type": "application/json"

},

"json": {

"name": "user1",

"password": "123456"

}

},

"response": {

"status_code": 200,

"headers": {

"Content-Type": "application/json"

},

"body": {

"success": true,

"msg": "user login successfully."

}

}

}

3)HttpRunner用例执行引擎



def run_testcase(testcase):

req_kwargs = testcase['request']try:

url = req_kwargs.pop('url')

method = req_kwargs.pop('method')

except KeyError:

raise exception.ParamsError("Params Error")


resp_obj = requests.request(url=url, method=method, **req_kwargs)

diff_content = utils.diff_response(resp_obj, testcase['response'])

success = False if diff_content else True

return success, diff_content

4)从测试用例中获取HTTP接口请求参数,testcase['request']


{

"url": "www.xxx.com/api/users/login",

"method": "POST",

"headers": {

"content-type": "application/json"

},

"json": {

"name": "user1",

"password": "123456"

}

}

5)发起Http请求

  1. requests.request(url=url, method=method, **req_kwargs)

6)检测测试结果,即断言

  1. utils.diff_response(resp_obj, testcase['response'])

五、接口自动化测试框架落地

根据简单易用易维护原则我们使用HttpRunner工具设计框架。

1、HttpRunner简介

主要特性:

  • 集成了Requests的全部特性,满足对http、https的各种测试需求

  • 测试用例与代码分离,采用YAML/JSON的形式描述测试场景,保障测试用例具备可维护性

  • 测试用例支持参数化和数据驱动机制

  • 基于 HAR 实现接口录制和用例生成功能

  • 结合 Locust 框架,无需额外的工作即可实现分布式性能测试

  • 执行方式采用 CLI 调用,可与 Jenkins 等持续集成工具完美结合

  • 测试结果统计报告简洁清晰,附带详尽统计信息和日志记录

  • 具有可扩展性,便于扩展实现 Web 平台化

  1. #### 2、环境准备

安装HomeBrew(MacOs软件包管理工具,类似apt-get、yum)

  • 终端执行
  1. /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  • 安装pyenv并配置环境变量:python版本管理器,可同时管理多个Python版本(HttpRunner是基于Python开发,但是支持Python3.6.0以上)

brew install pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile

echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

exec $SHELL -l
  • 安装Python3.6

pyenv install --list //查看可安装的Python版本

pyenv install 3.6.0 //安装3.6.0版本

pyenv rehash //更新pyenv

pyenv versions //查看已经安装的python版本,带*号的是当前使用的版本
  • 选择Pyhton
  1. pyenv global 3.6.0 //设置全局版本,即当前系统使用的版本将切换为3.6.0

  • 安装HttpRunner并校验

pip install httprunner

//运行如下命令,若正常显示版本号,则说明httprunner安装成功:

hrun -V

0.9.8

至此HttpRunner已搭建完成

3、用例管理

在HttpRunner中,测试用例引擎最大的特色就是支持Yaml/Json格式的用例描述形式;

采用YAML/JSON格式编写维护测试用例,优势还是很明显的:

  • 相比于表格形式,具有更加强大的灵活性和更丰富的信息承载能力;

  • 相比于代码形式,减少了不必要的编程语言语法重复,并最大化地统一了用例描述形式,提高了用例的可维护性。

Yaml格式

Json格式

以下以数澜--数栖平台2.X中的研发平台为例(采取Json格式)

场景:项目空间后,需要快速支持创建Demo示例,即自动创建各种目录和任务。

1)确定业务流程所使用到的接口并通过Postman或Jmeter调试通过及分好类

  • 查询类(Get请求)接口:查询任务目录、查询资源组、查询工作流等

  • 新增类(Post请求)接口:新建目录、新建任务等

2)根据业务流程确定接口顺序

  • 如要在某个目录下新建任务:则先要调用新建目录接口再调用作建任务接口

3)向Json文件里按照规则填写接口相关信息

  • 接口Base_Url

  • 接口路径

  • 接口请求方式

  • 接口请求参数

  • 接口断言

  • 接口返回参数(关联接口时会用到上一接口返回的参数)

以下是部分用例示例

4)用例填写完成后,执行用例文件,如Json文件为task.json

  1. hrun task.json

5)查看运行结果

  • 在此目录下会自动生成一个reports文件,进入该文件夹可看到生成带时间的html(执行一次就会生成一个Html文件)

  • 打开此Html查看

全部通过

部分通过

  • 点击Log,可查看具体请求信息和返回信息

  • 点击trackback可查看定位错误信息

 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux_理解进程地址空间和页表

目录 1、进程地址空间示意图 2、验证进程地址空间的结构 3、验证进程地址空间是虚拟地址 4、页表-虚拟地址与物理地址 5、什么是进程地址空间 6、进程地址空间和页表的存在意义 6.1 原因一(效率性) 6.2 原因二(安全性) …

MVC模式中控制器、视图和模型之间的关系如何?

mvc模式将应用程序逻辑与表示层分离,包括控制器、视图和模型三个组件:控制器:协调用户输入,获取模型数据,验证输入,执行业务规则。视图:显示模型数据,不包含业务逻辑。模型&#xff…

如何使用AI解决所有EXCEL公式问题

有个假设前提,你略懂EXCEL公式 知道单元格“ $C1” 和 ”C1”的区别,当然你也可以自行度娘或问AI。 AI使用文心一言免费版方便容易获取。 第一步也是唯一的一步,向AI准确描述你的需求 示例:学生的成绩分布在0-100分之间&#x…

echarts+vue2实战(一)

目录 一、项目准备 二、(横向分页)柱状图 2.1、动态刷新 2.2、UI调整 2.3、分辨率适配 三、(竖向平移)柱状图 3.1、平移动画 3.2、不同数值显示不同颜色 四、(下拉切换)折线图 4.1、切换图表和分辨率适配 4.2、UI调整 五、(三级分类)饼图 5.1、数据切换 六、圆环…

dial tcp 10.96.0.1:443: connect: no route to host

1、创建Pod一直不成功,执行kubectl describe pod runtime-java-c8b465b98-47m82 查看报错 Warning FailedCreatePodSandBox 2m17s kubelet Failed to create pod sandbox: rpc error: code Unknown desc failed to setup network for…

java8 将对象list中的某一个属性取出组成一个list

实体类 public class Sp {String spdm;String spmc;public Sp() {}public Sp(String spdm, String spmc) {this.spdm spdm;this.spmc spmc;}public String getSpdm() {return spdm;}public void setSpdm(String spdm) {this.spdm spdm;}public String getSpmc() {return sp…

太爱这种数据可视化效果,零售行业的都看过来

在当今数字化浪潮下,数据可视化已成为零售行业洞察市场趋势、优化运营决策的关键技术。奥威BI零售数据分析方案凭借其卓越的数据可视化效果,成为零售企业的得力助手。接下来就通过BI节假日分析报表来简单地感受一下。 注:该BI节假日分析报表…

反激开关电源输出电解电容选型及计算

电容高频模型:ESRESLC的串联 1、耐压:根据输出的电压来取,需留一定余量,比如5V输出可以选6.3V或者10V的电解电容 2、容量 纹波电压 电容充放电引起的纹波电压(与电容容量存在着直接因果关系) ESR引起的纹…

校园任务平台系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,论坛管理,任务咨询管理,用户管理,基础数据管理 前台账户功能包括:系统首页,个人中心,任务资讯公告&#…

Springboot 实体类赋默认值 @Value 失效? 那怎么搞?

这是最近一个小伙找上来问的问题, 我初一看还没看出来啥猫腻,后面认真一想,决定也写下来记录下,给其他初学者也知道下。 原先思路错误代码: 这个小伙想利用 Value 注解, 给这个属性 赋值,defaul…

js 实现将后端请求来的 Blob 数据保存到用户选择的任意目录

js实现将后端请求来的 Blob 数据保存到用户选择的任意目录 实现方式 实现方式 实现方式是使用 window 的 showSaveFilePicker 方法。Window 接口的 showSaveFilePicker() 方法用于显示一个文件选择器,以允许用户保存一个文件。可以选择一个已有文件覆盖保存&#xf…

快手电商:618大促开启以来,短视频挂车GMV同增66%

日前,快手电商发布618大促阶段战报。数据显示,在5月20日-6月18日活动期间,平台动销商家数同比增长26%,动销中小商家数同比增长28%,动销中小商家订单量同比增长25%。 从经营场域来看,泛货架场已成为快手电商…

纯css星空动画

让大家实现一个这样的星空动画效果,大家会怎么做? js,不! 其实使用css就能写 我也不藏着掖着,源码直接放下面了 <script setup></script><template><div class"box"><div v-for"i in 5" :key"i" :class"layer…

PostgreSQL性能优化之分区表 #PG培训

在处理大规模数据时&#xff0c;PostgreSQL的性能优化是一个非常重要的话题&#xff0c;其中分区表&#xff08;Partitioned Tables&#xff09;是提高查询和数据管理效率的重要手段。本文将详细介绍PostgreSQL分区表的概念、优势、创建与管理方法以及一些常见的优化策略。 #P…

《广州化工》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《广州化工》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊 问&#xff1a;《广州化工》级别&#xff1f; 答&#xff1a;省级。主办单位&#xff1a;广州化工集团有限公司 主管单位&#xff1a;广州化工…

【CSS in Depth2精译】1.1.1 样式表来源

您添加到网页的样式表并非浏览器呈现样式的唯一来源。样式表有三种不同的类型或来源。您添加到页面的样式称为 作者样式&#xff08;author styles&#xff09;&#xff1b;此外还有 用户样式&#xff08;user styles&#xff09;&#xff0c;即终端用户设置的自定义样式&#…

python-赏月

[题目描述] 在某个星球上看到的月亮大小有一个规律&#xff0c;月亮为每30天一个周期&#xff0c;在这30天的周期里&#xff0c;月亮的大小分别为 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1。 虽然天气很冷&#xff0c;但这个星球上的某个居民今…

Java中的do-while循环及其示例

Java中的do-while循环及其示例 在上一个教程中&#xff0c;我们讨论了while循环。在本教程中&#xff0c;我们将讨论java中的do-while循环。do-while循环类似于while循环&#xff0c;但它们之间有区别&#xff1a;在while循环中&#xff0c;条件是在执行循环体之前求值的&am…

虚拟3D沉浸式展会编辑平台降低了线上办展的门槛

在数字化浪潮的引领下&#xff0c;VR虚拟网上展会正逐渐成为企业展示品牌实力、吸引潜在客户的首选平台。我们与广交会携手走过三年多的时光&#xff0c;凭借优质的服务和丰富的经验&#xff0c;赢得了客户的广泛赞誉。 面对传统展会活动繁多、企业运营繁忙的挑战&#xff0c;许…

Springboot3.3 整合Cassandra 4.1.5

一、数据库搭建 -- 创建Keyspace CREATE KEYSPACE school WITH replication {class:SimpleStrategy, replication_factor : 1};-- 创建表 CREATE TABLE student(id int PRIMARY KEY, name text, age int, genders int, address text ,interest set<text>,phone lis…