从0到1 ,超详细!利用Apifox完成接口自动化测试并实现持续集成

一、基础知识

1. 什么是接口自动化测试

接口自动化测试是通过编写脚本,使用自动化测试工具来模拟用户与应用程序接口进行交互的过程,对接口的输入和输出进行验证,检查接口是否按照预期的方式工作,接口测试相对稳定,容易实现自动化持续集成,可以减少人工回归测试的时间成本,缩短测试周期。

2. 接口自动化测试的优势

提高测试效率和准确性:通过自动化测试,可以快速、准确地执行大量的测试用例,而且不会出现人为错误或遗漏。这不仅可以减少测试时间,提高测试效率,还可以提高测试的准确性,从而确保产品质量。

更好的一致性和可重复性:接口自动化测试可以确保测试的一致性和可重复性。每次执行测试时,都会按照预定的步骤和要求进行,从而避免了人为因素对测试结果的影响。

更好的稳定性和可靠性:接口自动化测试可以确保测试的稳定性和可靠性。由于测试是自动执行的,没有人为干扰,因此可以减少测试过程中出现的异常情况。

更好的回归测试:接口自动化测试可以确保更好的回归测试。由于测试是自动执行的,因此可以在每次修改代码或添加新功能时快速地重新运行测试用例,从而确保不会引入新的缺陷。

3.接口自动化测试开展的必要性

分层测试的“金字塔”模型是一种常见的软件测试模型,它根据测试的层次和重要性进行分类。在金字塔模型中,测试被分为多个层次,从底层到高层,每个层次都对应着不同的测试阶段和重点。

底层是单元测试,主要针对代码中的函数、类方法等最小功能单元进行测试,确保每个功能模块都能按预期要求正常运行。

向上是接口测试,主要对数据传输、数据库性能等进行测试,确保数据传输以及处理的完整性。接口功能的完整运作对整个项目功能扩展、升级与维护有着重要的作用。

最顶端是UI测试,以用户体验为主,软件的所有功能都是通过这一层展示给用户的,因此UI测试的工作很重要。由于UI界面以最终的用户体验为主,因此在UI测试中并不是100%地使用自动化测试,需要人工操作来确定UI界面的准确性和易用程度。

在分层测试的“金字塔”模型中,接口测试属于第二层服务集成测试范畴。相比UI层(主要是WEB或APP)自动化测试而言,接口自动化测试收益更大,且容易实现,维护成本低,有着更高的投入产出比

4. 接口自动化测试的关键步骤

熟悉业务和需求。评估可行性和测试范围。并不是所有的业务和所有接口都适合自动化,需要评估可行性、性价比、可持续性等等。

接口测试基础知识:‌了解HTTP/HTTPS协议、‌请求方法(‌如GET、‌POST、‌PUT、‌DELETE等)‌、‌状态码、‌请求头、‌请求体等基本概念和原理,数据库知识,业务流,数据流等这些是进行接口测试的基础,‌理解这些概念有助于更好地设计和执行测试。‌

接口测试技术:‌熟悉参数化、‌断言、‌数据驱动、‌Mock等常用的接口测试技术,‌包括正向测试、‌负向测试、‌边界值测试等。‌

接口测试用例设计:‌根据接口定义,编写测试用例,包括输入参数、预期结果等

编写测试脚本:使用合适的工具或框架编写测试脚本,例如Python的requests库、Java的HttpClient、国产工具。脚本包括请求发送、参数传递、数据验证等。

执行测试:运行测试脚本,发送接口请求,获取返回结果,进行断言判断。

接口测试报告分析:‌能够通过接口测试工具生成的测试报告进行分析,‌包括接口覆盖率、‌执行结果、‌性能指标等,‌以便评估测试的质量和效果。‌

执行回归测试:如果有新的版本发布或修改,执行回归测试,确保修改不会影响其他功能

接口持续集成:‌将接口自动化测试集成到持续集成流程中,例如Jenkins、GitLab CI等 ,实现自动化测试的持续执行。

5.如何进行接口自动化

1、如何开展

首先,调试单个接口,保证单个接口的正确和通畅,其次,明确数据流,业务流,最后,将N个接口测试脚本串起来,先把最基础最简单的做起来,就成功一大半了,至于扩展性的第三方接口、https、定时任务、自动出测试报告、自动发邮件等等功能,这都是不断累计和优化的,

2.开展之前需要知道的

现在的测试对象包含几个页面,每个页面涉及几个接口?分别在哪一步调用?每个接口包含哪些字段?各个字段对应数据库哪张表?每个表中各个字段是什么意思?各个接口对表产生了怎样的操作?

二、照猫画虎

Apifox自动化测试基本使用
1.创建项目及团队

创建成功如下,在团队中可以新建项目、添加成员和权限授予等操作

点击项目进入后如下,可对此项目进行、接口管理、自动化测试、项目设置和邀请成员等相关操作

2.环境配置

通过为Apifox配置环境做到开发环境、测试环境、集成环境,正式环境来区分测试

3.编排测试场景

3.1 新建测试场景

测试场景用于将多个接口请求与实际可能发生的一些特殊情况(如条件判断、循环)有序的组合在一起,来模拟一个真实业务流程,组成自动化测试单元。

在测试场景中添加测试步骤

创建测试场景后可以在其中添加测试步骤。测试步骤中支持导入接口、接口用例、自定义请求和从 cURL 导入接口,并且你还可以在步骤中设置测试条件等附加操作。进入测试场景后,点击“添加步骤”并添加接口。可以选择「从接口导入」和「从接口用例导入」

导入接口时存在两种模式:分别是”手动同步“和”自动同步“模式

手动同步

在该模式下,当项目内的接口文档有数据变化时,并不会影响测试步骤内的接口。测试人员点击“手动同步”按钮后,测试步骤内的接口数据才会与接口文档数据同步。当测试步骤内的接口数据有变化时,即使点击了“手动同步”按钮,测试步骤内的数据也并不会同步至接口文档,反而会再次抓取接口文档内的数据并与之同步。

自动同步

在该模式下,当项目内的接口文档有数据变化时,测试步骤内的接口也会同步更新

诸如从接口用例导入,添加自定义请求, CURL 导入,从其它测试场景导入,引用其它测试场景等用到再补充说明

4.测试步骤间传递数据

假设在一个自动化测试计划中,需提取 A 接口返回数据中的 值并作为 B 接口的请求参数。可以通过下面两个方法完成接口间的参数传递和连接过程。

  1. 页面可视化操作

在 B接口 中定义参数值时点击“魔法棒” icon,选择“读取前置步骤的运行结果”选项,指定“提取部分”数据,填写参数名 / 路径后点击“确定”

  1. 根据语法规则操作

根据语法规则操作,填写指令来引用前置步骤的返回数据。

语法规则表

分类

功能点

语法示例


请求


URL


{{$.<步骤 id>.request.url}}


path 参数


{{$.<步骤 id>.request.pathParam.<字段名>}}


query


{{$.<步骤 id>.request.query.<字段名>}}


header


{{$.<步骤 id>.request.header.<字段名>}}


body(form)


{{$.<步骤 id>.request.body.<字段名>}}


body(json)


{{$.<步骤 id>.request.body.<字段路径>}}


响应


body


{{$.<步骤 id>.response.body.<字段路径>}}


header


{{$.<步骤 id>.response.header.< 字段名>}}


cookie


{{$.<步骤 id>.response.cookie.< 字段名>}}


循环


element(ForEach 循环中的数组内元素)


{{$.<循环步骤 id>.element.<字段路径>}}


index


{{$.<循环步骤 id>.index}}

5.流程控制条件

在测试场景中新增流程控制条件(分组、条件分支、ForEach 循环、For 循环和等待时间)。满足更复杂的测试场景/流程配置的使用,最终借助自动化测试功能解决复杂场景的测试工作

分组

当测试流程中多个步骤存在相关联关系时,可以进行归类并放入到同一个分组中。通过对测试步骤的分组,让测试场景具备更好的可读性和操作性。

ForEach

循环在 ForEach 循环中,可以根据设定的某数组内的元素个数,循环执行编排内的全部步骤,循环次数等于数组内的元素个数。还支持提取当前循环的元素值以及当前循环的索引值。

当前循环 element

系统自动将 ForEach 循环中设置的数组中的元素提取出来保存在此处指定的变量中。例如:{{$.1.element.data.name}}。每次循环开始时,会基于当前循环的数组素更新这个变量的实际值。如果元素是个对象,可以通过使用 JSONPath 来提取对象中的某个子级字段。

当前循环 index

当前循环的索引值,会保存在此变量中。例如:{{$.1.index}}。第一次循环开始时,这个索引值为 0,之后每次循环开始时会 +1 更新值。

For 循环

当测试步骤需要重复执行时,可以指定相应的循环次数重复执行。在循环的附加设置中,支持添加“中断条件”和“遇到错误时”的循环异常处理选项。

条件分支

当测试流程中存在多条件判断时,可以通过添加条件分支(If 语法)来区分流程执行的步骤。即当判断配置的条件满足时,该判断条件下的子步骤才会执行, 相反子步骤则会被跳过。

等待

当测试流程中某个步骤需要执行后需要等待一段时间时,比如 A 步骤需要等待若干时间后再执行 B 步骤,可以通过新增等待条件来解决。

6.前/后置操作,脚本

断言

“后置操作”支持添加断言,可以对接口返回的数据或响应时间设置断言,以判断当前接口返回是否符合预期。

提取变量

在一些接口中,基于 A 接口返回的结果需要自动提取数据并设置为变量(临时变量/环境变量/全局变量),方便其它接口运行的时候直接使用。

数据库操作

连接数据库后,就可以对该数据表进行增删查改和其他操作。支持在控制台中打印由数据库操作返回的结果,也可以将其提取为变量,以便在其它接口请求参数、断言、自定义脚本和读写其它数据库等多种场景中使用

使用脚本

使用后置脚本功能测试(断言)请求返回结果的正确性。使用前置脚本动态修改接口请求参数,如增加接口签名参数等。使用脚本操作变量并在接口请求之间传递数据。脚本可以直接 调用其他语言编写的程序,支持java(.jar)、python、php、js、BeanShell、go、shell、ruby、Lua 等语言编写的外部程序。

全局脚本 / 分组脚本

1.支持全局设置(在根目录里设置)前置操作、后置操作,设置后项目里的所有接口运行时都会生效。

2.支持分组里设置前置操作、后置操作,设置后分组里的所有接口运行时都会生效。

接口请求的执行流程如下:[全局前置脚本] -> [分组前置脚本] -> [接口前置脚本] -> [发送接口请求] -> [返回接口结果] -> [全局后置脚本] -> [分组后置脚本] -> [接口后置脚本]。

脚本调试

调试脚本可以在 前置脚本 和 后置脚本 里编写,使用console.log('hello')方式将调试信息写入控制台,打开 控制台 即可查看。

7.导出测试场景数据

测试场景支持导出 Apifox CLI、Postman、Jmeter 格式数据文件,它们可以在本地环境中或外部持续集成流水线中运行,以便更好地与团队中现有的测试工作流相融合。

8.从其它项目导入接口/用例至测试步骤

测试场景支持跨项目导入接口与接口用例。这意味着除了可以引用本项目中的接口导入作为步骤之外,还支持导入其它项目的接口作为步骤,共同组成一个完整的业务流程,这对于有着复杂业务流程的系统或架构而言非常重要

9.运行测试

运行环境

测试步骤中每个接口的运行链接(前置 URL)

测试数据

测试场景支持导入外部测试数据集。当测试场景运行时,系统会循环运行数据文件里所有的数据集,并且会将数据集里的数据赋值对应的变量

循环次数

循环次数是指整个测试场景完整执行的轮次。

线程数

线程数指的是同时并发运行测试场景的线程数,每个线程都会按顺序运行选中的所有步骤。注意这是一个处于 Beta 阶段的功能,可能会出现预期之外的问题。

运行于

实际消耗硬件资源运行测试场景的机器。所有测试场景中发起的请求,会从这里指定的机器发起,所以有可能因为请求机器的网络环境不同导致产生不同的测试结果。注意:此设置不会保存为测试场景的运行配置中,每次都是默认使用本机运行测试场景。并且这个设置不会在批量运行、CLI 运行时生效,使用以上方式运行时还是消耗当前机器资源发起请求。

通知

是否在手动运行本测试场景完成之后,发送一个通知信息给指定的对象,信息内会有测试总览结果和详情链接。打开后可以设置是只要完成运行即进行通知还是在仅发生失败时进行通知,用以减少无效通知的打扰。通知对象的详细说明请参考此处

共享

点击高级设置右侧的“共享”选项后,每次运行测试场景后的测试报告都将会自动共享给项目内的其它成员。你可以在“测试报告”中的“共享” tab 页中查看所有已在团队内共享的测试报告。


高级设置

遇到错误时的策略

当某个测试步骤执行出错时,例如出现断言错误、数据格式校验错误或服务器错误等情况,系统根据预设的策略进行处理,提供以下 3 种策略:

忽略:跳过当前异常步骤,继续执行后续步骤。

跳到下一轮循环:结束当前循环测试,跳转到下一轮循环测试。

结束运行:停止测试,并标记为失败。

间隔停顿

前一个测试步骤运行完成后,停顿一段时间,再运行下一个步骤。

保存请求 / 响应详情

开启后将保存接口的实际请求、请求响应 headers 与 bodies,但数据过多有可能会影响性能,你可以选择保存“全部请求”或“仅失败请求”。

保存变量变化值

测试场景运行结束后,将测试过程中有变化的环境/全局变量值保存至项目中的环境/全局变量。

使用全局 Cookie

如果使用全局 Cookie,则在测试场景中,所有接口的请求都将带上全局 Cookie。

如果不使用全局 Cookie,则在测试场景中,每个接口的请求都将带上自己的 Cookie。

保存 Cookie 到全局

测试场景运行结束后,将已变化的 Cookie 值保存至当前项目内的全局 Cookie 中。


运行功能测试

运行功能测试后将进入测试场景运行页。下图中的饼状图显示运行结果总览,并且在测试场景的运行过程中实时变化;饼状图下面是具体执行的测试步骤,在运行中将会显示每个测试步骤的执行情况。

功能测试运行结束后,可以点击接口步骤中的“更多详情”查看该接口在测试过程中的各项指标和状态,包括接口名称、请求方式、请求地址、响应状态码、响应时间、响应内容、据校验及断言情况等

定时运行功能测试

通过设置“定时任务”,定时自动执行已配置好的自动化测试场景,获取任务运行结果,完成定时测试、回归的需求

批量运行测试

批量运行测试实例/场景能够为节省大量的手动执行时间

手动运行性能测试

对 API 发起大规模的服务请求,检测 API 的性能瓶颈和稳定性、暴露压力状态下的可能风险、确保 API 在高负荷情况下能够稳定地运行和响应请求。

数据驱动测试

测试场景支持导入外部测试数据集。当测试场景运行时,系统会循环运行数据文件里所有的数据集,并且会将数据集里的数据赋值对应的变量。

10.持续集成.........待补充

持续集成可以通过频繁地代码集成和测试代码改动后的运行情况,尽早地发现和解决可能存在的问题。使用 Apifox CLI 与持续集成工作流相结合,便捷地执行已在 Apifox 预设的测试场景。

在持续集成环境中安装 Apifox CLI

与 CI/CD 平台相集成.........

与 Jenkins 集成.........

与 Gitlab 集成.........

与 Github Actions 集成.........

11.查看测试报告

查看测试报告

自动化测试运行结束后将输出一份测试报告,你可以在此处直观地看到哪些接口没有通过测试。

查看性能测试报告

性能测试报告记录了测试过程中的各项关键的性能测试指标,包括各个接口的总请求数、每秒接口请求数、平均响应时间、最大/最小响应时间以及请求失败率。

导出测试报告

测试报告支持以 HTML 格式进行导出。测试任务运行结束后,点击“导出报告”按钮即可。

分享测试报告

进入某个测试报告后,点击右侧的“分享”按钮,生成链接并发送给他人,同事可以勾选“同时分享请求/响应详情”选项,将这份测试报告中的所有接口请求/返回详情一并进行分享。其他用户打开链接后也可以直接看到该测试报告的详情,提升团队协作效率。

三、小试牛刀

常温拆零拣货流程

低温生鲜拣货流程(常温定时达)

四、应用拓展

接口自动化测试与 Jenkins 集成

jenkins的简介

Jenkins‌是一个开源的持续集成工具,它基于Java开发,用于自动化各种任务,如代码编译、测试、部署等

Jenkins是一个可以持续集成,持续交付,持续部署的自动化工具;

持续集成:开发者可以频繁的将代码发送至主干,并进行自动化测试;

持续交付:在持续集成的基础上,将代码部署到预生产环境;

持续部署:随时deliver给客户,并且是自动化的;

Jenkins具有如下有点:

1.更友好的用户界面;

2.开源项目拥有大批的plugin;

3.有好的用户界面使得学习成本降低;

4.Cl工具,随时deliver给用户,自动化部署;

Jenkins的安装

官网地址:Jenkins

jenkins旧版本地址:jenkins-windows安装包下载_开源镜像站-阿里云

1.打开安装,点击next 一直进入下一步

2.客户端启动

首次访问时,需要使用初始管理员密码,该密码通常位于Jenkins安装目录下的initialAdminPassword文件

3.安装推荐的插件

创建管理员,点击保存并完成,进入界面

4.安装完成后在 Web 浏览器中输入 http://localhost:8080 来访问 Jenkins 控制台。配置完成后,可以开始创建构建任务(Jobs),定义构建流程、触发条件、构建步骤等。Jenkins支持通过Web界面进行操作,也可以集成到持续集成/持续部署的工作流中,实现自动化构建和部署。

配置 NodeJS 环境

运行 Apifox CLI 前需确保 Node.js 版本号 >= v14.20.1,需要先在 Jenkins 环境中配置 NodeJS 依赖。

.在 Jenkins 的管理页面,点击“Manage Jenkins”,然后选择“Manage Plugins”进入插件管理页面。

2、打开 Jenkins 插件管理中找到 NodeJS 插件,安装并重启。

3.1 在全局工具配置中新建 NodeJS,填写 NodeJS 别名(比如 nodejs18)、版本号(需 >= v14.20.1)和包名 apifox-cli。

3.2 安装 Apifox-CLI,引向本地的NodeJS目录,直接在 Node 环境运行任务

安装

npm install -g apifox-cli # npm 源命令

npm i -g apifox-cli@latest --registry=https://registry.npmmirror.com/ # 国内镜像源

你可以通过以下命令确认是否安装成功。

node -v && apifox -v && which node && which npm && which apifox

触发自动化测试
  1. 在可视化流水线中添加配置(Freestyle Project)
  2. 将嵌入式代码集成至流水线(Pipeline)
可视化配置流水线

打开 Apifox,在持续集成详情页中获取 CLI 命令。若 Jenkins 环境具备联网条件,可以选择使用「实时运行在线数据」命令;如果不具备联网条件,那么需要先导出 CLI 的 json 数据文件至环境中,再通过 CLI 执行。

所有的运行配置都设置完成之后,下方实际生成的命令即是符合你配置需求的命令。如果是使用在线数据运行,则在使用之前,还需要添加 Access Token (API 访问令牌),用来补充鉴权。添加完成后的完整命令才可成功运行。

插入完成之后,点击整个命令即可复制到剪切版,然后粘贴到终端或使用的 CI/CD 平台流水线中,即可通过 Apifox CLI 运行这个测试场景:

在项目配置页面,找到“构建环境(Build Environment)”选项,通过 Freestyle Project 构建,勾选“Provide Node & npm bin/ folder to PATH”,并选择你在“全局工具配置(Tools)”中设置的 NodeJS 版本(如 nodejs18)

构建环境设置好以后,找到“构建步骤(Build Steps)”选项,点击“添加构建步骤(Add build step)”,选择“Execute Shell”(如果是 Windows 系统,选择“Execute Windows Batch Command”)。

在“命令”输入框中粘贴 Apifox CLI 命令并保存。

注意点1:找到正确的 指令指示的路径

注意点2:数据库文件放到Jenkins执行目录下

注意点3:执行乱码

对jekins进行配置

1.首先,找到jekins目录,修改jekins.xml文件中的配置,在<arguments>标签处增加-Dfile.encoding=utf-8,然后保存

2.重启jekins后, 去jekins中进行配置,在系统配置页面,全局属性处新增键值对,LANG,zh_CN.utf-8,然后在全局MAVEN_OPTS配置中添加-Dfile.encoding=utf-8。如果是Python自动化项目部署,再增加 PYTHONIOENCODING, UTF8

3.还不行的话,尝试勾选 使用uniconde utf-8提供全球语言支持 (没有指定编码集的字符,默认为 utf-8 编码)

在项目中点击 Build Now 即可运行。

将嵌入式代码集成至流水线

在项目配置页面,找到“构建环境(Build Environment)”选项,通过 Freestyle Project 构建,勾选“Provide Node & npm bin/ folder to PATH”,并选择你在“全局工具配置(Tools)”中设置的 NodeJS 版本(如 nodejs18)

配置 Pipeline,在项目配置页面,找到“Pipeline”选项,在“Definition”下拉菜单中选择“Pipeline script”。从[CI/CD] 页获取嵌入代码,粘贴至 Jenkins 的配置文件中

注意 需要更改 NodeJS 实际别名 和 实际可用的 Access Token,也可以在 Jenkins 添加一个名为APIFOX_ACCESS_TOKEN的环境变量,并将其值设置为你的 Access Token。这样,在执行流水线时,系统也能够读取到你的 Access Token。

代码也可以简化成下面这样的,把安装 Apifox CLI 的脚本去掉,因为预先在Tools 中设置了 NodeJS 和apifox-cli,会构建过程中直接使用已安装的工具。

在项目中点击 Build Now 即可运行。

Jenkins 定时构建

在 项目配置-构建触发器 ,勾选 Build periodically ,然后在日程表里写上 cron 表达式即可

Jenkins 定时任务触发时间 表达式 用法示例

1、定时任务表达式:Jenkins使用一种特定的表达式来定义定时任务的执行时间和频率。这个表达式被称为Cron表达式,它由5个或6个字段组成,分别表示分钟、小时、日期、月份和星期几。通过设置这些字段的值,可以实现各种不同的定时任务调度。

2、Cron表达式格式:Cron表达式的格式如下:

日期(1-31)

月份(1-12)

星期几(0-7,其中0和7都表示星期日)

3、特殊字符和符号:在Cron表达式中,还可以使用一些特殊字符和符号来表示特定的含义,例如:*:表示匹配任意值,:表示列举多个值-:表示范围/:表示步长

4、示例:以下是一些示例的Cron表达式:每天上午10点和下午4点各执行一次:0 10,16 * * *每隔5分钟执行一次:*/5 * * * *

以下是Cron表达式的一些常见用法示例:

每15分钟构建一次:H/15 * * * * 或 */15 * * * *

每天8点构建一次:H 8 * * * 或 0 8 * * *

每天8点~17点,两小时构建一次:H 8-17/2 * * *

周一到周五,8点~17点,两小时构建一次:H 8-17/2 * * 1-5

每月1号、15号各构建一次,除12月:H H 1,15 1-11 *

注意,Jenkins中的 H 标记用于分散任务的触发时间,以避免任务在同一时间点过载执行。同时,不同的调度框架或工具对Cron表达式的语法有所不同,因此在使用特定工具时应查阅其文档以了解详细的规则和支持的语法。

Apifox定时运行(收费-待补充)

消息通知集成到 钉钉

在钉钉的群聊机器人中获取 Webhook URL,然后将这个 Webhook 地址配置到 Apifox的URL 中

在配置信息中,需要对其进行安全设置(加签密钥)


打开 Apifox,在项目中新建一个通知事件,比如接口变更、文档变更、自动化测试、迭代分支变更等事件,配置完毕后保存即可

也可以在测试步骤中添加了通知事件,执行测试后会 在钉钉群聊中收到通知

消息通知集成到 Jenkins 服务(待补充)

当消息事件被触发时,将自动触发 Jenkins 发起一次构建行为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值