基于Docker构建CI/CD工具链(六)使用Apifox进行自动化测试
添加测试接口
在Spring Boot Demo项目里实现一个简单的用户管理系统的后端功能。具体需求如下:
-
实现了一个RESTful API,提供了以下两个接口 :
- POST请求
/users:用于创建新的用户。 - GET请求
/users:用于获取所有用户的列表。
- POST请求
-
创建新用户功能:
- 用户可以通过向
/users发送 POST 请求来创建新用户。 - 新用户的信息通过请求体以 JSON 格式提供,包括用户的姓名和年龄。
- 用户可以通过向
-
获取所有用户列表功能:
- 用户可以通过向
/users发送 GET 请求来获取所有已创建用户的列表。 - 服务器将返回一个包含所有用户信息的 JSON 数组。
- 用户可以通过向
-
用户对象定义:
- 用户对象由姓名和年龄两个属性组成。
- 用户对象的定义嵌套在
UserController类内部,仅在该类中可见。
package com.copier.springbootdemo.rest;import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {// 用于存储用户对象的列表private List<User> users = new ArrayList<>();// 创建新用户的端点@PostMappingpublic User createUser(@RequestBody User user) {users.add(user); return user;}// 获取所有用户的端点@GetMappingpublic List<User> getAllUsers() {return users; }// 表示用户的内部类static class User {private String name;private int age;public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }}
}
构建Apifox Docker镜像
编辑如下内容的Dockerfile,从FROM node:18.13.0的基础镜像开始构建一个新的镜像,然后在其中安装了apifox-cli。
FROM node:18.13.0
RUN npm i -g apifox-cli@latest --registry=https://registry.npmmirror.com/
在同级目录下执行如下命令,构建工具镜像,有告警不要怕
docker build -t docker.mvcode.cn:8083/apifox:1.0.0 .

使用如下命令测试镜像是否构造成功
docker run --rm docker.mvcode.cn:8083/apifox:1.0.0 apixfox -v

然后通过如下命令,将镜像推动到镜像库(如何构建镜像库点这里:Docker+nexus构建自己的制品库之(三)Docker仓库的使用)。推送到镜像库后我们就可以随便使用了。
docker push docker.mvcode.cn:8083/apifox:1.0.0

准备测试用例
如何使用Apifox不是本文档所关注的内容,禁用截图演示整个过程项目的文档请移步Apifox帮助文档。
创建数据模型

添加用户接口和测试用例
查询接口

查询测试用例

新增用户接口

新增用户测试用例

测试环境

测试场景

运行测试

导出
根据图中所示将测试场景导出为“Apifox ClI格式”。

配置Gitlab CI/CD
新增测试脚本
将导出的文件放在项目的testcases目录下

#!/bin/bash
# 获取当前目录路径,用于后续挂载到 Docker 容器中
APP_ROOT=$(pwd)
mkdir report
docker run --rm \-v /home/copier/.m2/:/root/.m2/ \-v $APP_ROOT:/app \-w /app \docker.mvcode.cn:8083/apifox:1.0.0 apifox run -k \--out-dir ./report --out-file apitest -r html,cli \--env-var "serverURL=http://192.168.3.52:9999" \./testcases/usertest.apifox-cli
这段脚本主要用于在 Docker 容器中运行apifox镜像,执行 API 测试,并生成测试报告。
-
APP_ROOT=$(pwd): 这一行代码将当前工作目录的路径保存在APP_ROOT变量中。 -
mkdir report: 创建一个名为report的目录,用于存储测试报告。 -
docker run --rm ...: 这是运行 Docker 容器的命令。下面是它的各个参数解释:--rm: 表示当容器退出时立即删除容器。这有助于在容器结束后自动清理资源,防止垃圾文件的堆积。-v /home/copier/.m2/:/root/.m2/: 将主机中的/home/copier/.m2/目录映射到容器内的/root/.m2/目录,这样容器内的 Maven 缓存可以重复使用。-v $APP_ROOT:/app: 将主机中的$APP_ROOT目录映射到容器内的/app目录,这样容器就可以访问主机上的测试用例文件等资源。-w /app: 指定容器的工作目录为/app,这是为了确保后续的命令在正确的工作目录下执行。docker.mvcode.cn:8083/apifox:1.0.0: 指定要运行的 Docker 镜像,其名称为apifox,版本为1.0.0。apifox run -k ...: 这是在容器内执行的具体命令,它启动了apifox工具来运行 API 测试。下面是各个参数的解释:-k: 表示以非交互式模式运行,即不需要用户输入。--out-dir ./report: 指定测试报告的输出目录为当前工作目录下的report目录。--out-file apitest: 指定测试报告的文件名为apitest。-r html,cli: 指定测试报告的格式为 HTML。--env-var "serverURL=http://192.168.3.52:9999": 设置一个环境变量serverURL,其值为http://192.168.3.52:9999,这个环境变量可能会在测试过程中被用到。./testcases/usertest.apifox-cli: 指定要运行的测试用例文件路径。
Apifox CLI(Command Line Interface,即命令行界面)主要用来以命令行方式运行接口测试过程,具体参数参照:如何使用以及参数说明。

执行自动化测试
通过查看Gilab的流水线和作业我们可以查看运行结果。
流水线执行结果:

API测试结果:

相关文章:
基于Docker构建CI/CD工具链(六)使用Apifox进行自动化测试
添加测试接口 在Spring Boot Demo项目里实现一个简单的用户管理系统的后端功能。具体需求如下: 实现了一个RESTful API,提供了以下两个接口 : POST请求 /users:用于创建新的用户。GET请求 /users:用于获取所有用户的列…...
Java 中建造者模式,请用代码具体举例
建造者模式是一种创建型设计模式,它允许你创建一个复杂对象的不同部分并将它们组装在一起,以产生最终的对象。以下是一个简单的 Java 示例,演示了建造者模式的用法: // 产品类 class Computer {private String cpu;private String…...
Tomcat 启动闪退问题解决方法
总体思路 解决Tomcat闪退问题,您可以尝试以下几种方法: 检查安装过程:确保您的Tomcat安装过程没有遗漏任何步骤。如果是zip包形式的Tomcat,解压后通常不需要额外配置环境变量。编辑启动脚本:打开Tomcat安装目录下的bi…...
使用docker部署数据可视化平台Metabase
目前公司没有人力开发数据可视化看板,因此考虑自己搭建开源可视化平台MetaBase。在此记录下部署过程~ 一、镜像下载 docker pull metabase/metabase:latest 运行结果如下: 二、创建容器 docker run -dit --name matebase -p 3000:3000\ -v /home/loc…...
数图智慧零售解决方案,赋能零售行业空间资源价值最大化
数图智慧零售解决方案 赋能零售行业空间资源价值最大 在激烈的市场竞争中,如何更好地提升空间资源价值,提高销售额,成为行业关注的焦点。近日,NIQ发布的《2024年中国饮料行业趋势与展望》称,“在传统零售业态店内&…...
Django中的实时通信:WebSockets与异步视图的结合【第167篇—实时通信】
👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代Web应用程序中,实时通信已经成为了必不可少的功能之一。无论是在线聊天、…...
R 格式(蓝桥杯)
文章目录 R 格式【问题描述】解题思路高精度乘法高精度加法 R 格式 【问题描述】 小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R格式整数的做法…...
Intellij idea的快速配置详细使用
IntelliJ IDEA是一款强大的集成开发环境(IDE),支持多种编程语言,包括Java、Kotlin、Scala等。以下是关于IntelliJ IDEA的快速配置和使用的详细步骤: 一、安装 前往IntelliJ IDEA的官方网站或可靠的软件下载平台&…...
JavaEE:JVM
基本介绍 JVM:Java虚拟机,用于解释执行Java字节码 jdk:Java开发工具包 jre:Java运行时环境 C语言将写入的程序直接编译成二进制的机器语言,而java不想重新编译,希望能直接执行。Java先通过javac把.java…...
Linux基础|线程池Part.1|线程池的定义和运行逻辑
线程池的定义和运行逻辑 多线程的问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么一个很自然的想法就出现了…...
蓝队面试经验总结
Sql注入 1、sql注入漏洞原理 开发者没有在网页传参点做好过滤,导致恶意 sql 语句拼接到数据库进行执行 2、sql注入分类 联合注入 、布尔盲注 、时间盲注 、堆叠注入 、宽字节注入 、报错注入 3、堆叠注入原理 在 mysql 中,分号 代表一个查询语句的…...
MySQL命令分类与大纲
一、数据库管理 创建与删除数据库 CREATE DATABASE:创建新数据库DROP DATABASE:删除已存在的数据库ALTER DATABASE:修改数据库属性 切换与查看数据库 USE:选择当前工作数据库SHOW DATABASES:列出所有可用数据库 二、…...
windows编译xlnt,获取Excel表里的数据
用git拉取项目 这个文件是空的 要用git拉下来,使用终端编译xlnt库 点击解决方案 运行生成 然后新建项目,配置好库, #include <iostream> #include <xlnt/xlnt.hpp>int main() {// 打开 Excel 文件xlnt::workbook workbook;workb…...
c#字段和属性的区别
在C#中,字段(fields)和属性(properties)都是类的成员,它们提供了类存储数据的方式,但它们在用途和功能上有着明显的区别。 字段 字段通常用来存储类或结构的状态信息。字段是类的数据成员&…...
微软正式发布Copilot for Security
微软公司近日宣布,其备受期待的安全自动化解决方案——Copilot for Security现已全面上市,面向全球用户开放。这一创新工具的推出标志着微软在提升企业安全防护能力方面迈出了重要一步,同时也为安全专业人士提供了强大的支持。 Copilot for …...
AI大模型日报#0416:李飞飞《2024年人工智能指数报告》、Sora加入Adobe、李彦宏聊百度大模型之路
导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 刚刚,李飞飞团队发布《2024年人工智能指数报告》:10大趋势,揭示AI大模型的“喜”与“忧” 摘…...
OpenCV轻松入门(八)——图片卷积
对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这个操作就叫卷积。 卷积需要4个嵌套循环,所以它并不快,除非我们使用很小的卷积核。这里一般使用3x3或者5x5 图像滤波 图像滤波是尽…...
鸿蒙HarmonyOS开发规范-完善中
代码规范 所有文件,包括自动生成的编译文件package.json都要格式化(IDE快捷键CtrlAltL);函数命名,C大驼峰,TS、JS小驼峰,函数命名注意动宾结构;静态常量需使用全大写,文…...
神经网络压缩图像
简介 典型的压缩管道由四个组件组成: 编码:输入图像 x x x通过编码器函数 ε \varepsilon ε,将其转换为潜在表示 z z z。 量化:截断 z z z以丢弃一些不重要的信息 熵编码:使用某种形式的熵编码(例如&…...
Catagory(rt)
继承(IMP融合):支持super命令码;继承推荐重写 分类(IMP替换):不支持super命令码;分类推荐组合 //替换(原来没了/破坏掉原来IMP/分类(替换特性)) 情况1: 自封装(组件化)开源库>分类推荐组合 情况2:逆向分析> 有意替换>分类IMP替换 #import "CatagoryViewContro…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
