当前位置: 首页 > news >正文

测试用例接口开发实战

测试用例接口开发实战

前言

在上一集,我们也大概完成了对Jmeter的二次开发的Demo版本的了解,我们接下来就要基于这个Demo来将Jmeter压测进行平台化。

那么这一集,我们讲一讲测试用例接口开发实战。

StressCaseController

我们的Controller其实也就那些增删改查的操作加上一个执行测试用例的API。

但是我们一开始先不讲执行测试用例的API,先放一放,先把增删改查的API完成。

find

@RequestMapping("/find")public JsonData findById(@RequestParam("projectId")Long projectId,@RequestParam("id")Long caseId){return JsonData.buildSuccess(stressCaseService.findById(projectId,caseId));}

del

@PostMapping("/del")public JsonData del(@RequestBody StressCaseDelReq req){return JsonData.buildSuccess(stressCaseService.delete(req.getId(),req.getProjectId()));}
save
@PostMapping("/save")public JsonData save(@RequestBody StressCaseSaveReq req){return JsonData.buildSuccess(stressCaseService.save(req));}
update
@PostMapping("/update")public JsonData update(@RequestBody StressCaseUpdateReq req){return JsonData.buildSuccess(stressCaseService.update(req));}
完整代码

@RestController
@RequestMapping("/api/v1/stress_case")
public class StressCaseController {@Resourceprivate StressCaseService stressCaseService;@RequestMapping("/find")public JsonData findById(@RequestParam("projectId")Long projectId,@RequestParam("id")Long caseId){return JsonData.buildSuccess(stressCaseService.findById(projectId,caseId));}@PostMapping("/del")public JsonData del(@RequestBody StressCaseDelReq req){return JsonData.buildSuccess(stressCaseService.delete(req.getId(),req.getProjectId()));}@PostMapping("/save")public JsonData save(@RequestBody StressCaseSaveReq req){return JsonData.buildSuccess(stressCaseService.save(req));}@PostMapping("/update")public JsonData update(@RequestBody StressCaseUpdateReq req){return JsonData.buildSuccess(stressCaseService.update(req));}@GetMapping("/execute")public JsonData execute(@RequestParam("projectId")Long projectId,@RequestParam("id")Long caseId){return JsonData.buildSuccess(stressCaseService.execute(projectId,caseId));}
}

不用多说,自定义请求体类如下

StressCaseSaveReq
@Data
public class StressCaseSaveReq {private Long projectId;private Long moduleId;private Long environmentId;private String name;private String description;private String assertion;private String relation;private String stressSourceType;private String threadGroupConfig;private String jmxUrl;private String path;private String method;private String query;private String header;private String body;private String bodyType;}
StressCaseDelReq
@Data
public class StressCaseDelReq {private Long id;private Long projectId;}
StressCaseUpdateReq
@Data
public class StressCaseUpdateReq {private Long id;private Long projectId;private Long moduleId;private Long environmentId;private String name;private String description;private String assertion;private String relation;private String stressSourceType;private String threadGroupConfig;private String jmxUrl;private String path;private String method;private String query;private String header;private String body;private String bodyType;}

可以看到,这就是测试用例的自定义请求体类了。

接下来就要完成Service和它的Impl即可。

StressCaseService

public interface StressCaseService {StressCaseDTO findById(Long projectId, Long caseId);int delete(Long id, Long projectId);int save(StressCaseSaveReq req);int update(StressCaseUpdateReq req);}

StressCaseServiceImpl

findById
public StressCaseDTO findById(Long projectId, Long caseId) {LambdaQueryWrapper<StressCaseDO> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(StressCaseDO::getProjectId, projectId);queryWrapper.eq(StressCaseDO::getId, caseId);StressCaseDO stressCaseDO = stressCaseMapper.selectOne(queryWrapper);return SpringBeanUtil.copyProperties(stressCaseDO, StressCaseDTO.class);}
delete
public int delete(Long id, Long projectId) {LambdaQueryWrapper<StressCaseDO> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(StressCaseDO::getProjectId, projectId);queryWrapper.eq(StressCaseDO::getId, id);return stressCaseMapper.delete(queryWrapper);}
save
public int save(StressCaseSaveReq req) {StressCaseDO stressCaseDO = SpringBeanUtil.copyProperties(req, StressCaseDO.class);return stressCaseMapper.insert(stressCaseDO);}
update
 public int update(StressCaseUpdateReq req) {StressCaseDO stressCaseDO = SpringBeanUtil.copyProperties(req, StressCaseDO.class);LambdaQueryWrapper<StressCaseDO> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(StressCaseDO::getProjectId, req.getProjectId());queryWrapper.eq(StressCaseDO::getId, req.getId());return stressCaseMapper.update(stressCaseDO, queryWrapper);}
完整代码
@Service
public class StressCaseServiceImpl implements StressCaseService {@Resourceprivate StressCaseMapper stressCaseMapper;@Overridepublic StressCaseDTO findById(Long projectId, Long caseId) {LambdaQueryWrapper<StressCaseDO> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(StressCaseDO::getProjectId, projectId);queryWrapper.eq(StressCaseDO::getId, caseId);StressCaseDO stressCaseDO = stressCaseMapper.selectOne(queryWrapper);return SpringBeanUtil.copyProperties(stressCaseDO, StressCaseDTO.class);}@Overridepublic int delete(Long id, Long projectId) {LambdaQueryWrapper<StressCaseDO> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(StressCaseDO::getProjectId, projectId);queryWrapper.eq(StressCaseDO::getId, id);return stressCaseMapper.delete(queryWrapper);}@Overridepublic int save(StressCaseSaveReq req) {StressCaseDO stressCaseDO = SpringBeanUtil.copyProperties(req, StressCaseDO.class);return stressCaseMapper.insert(stressCaseDO);}@Overridepublic int update(StressCaseUpdateReq req) {StressCaseDO stressCaseDO = SpringBeanUtil.copyProperties(req, StressCaseDO.class);LambdaQueryWrapper<StressCaseDO> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(StressCaseDO::getProjectId, req.getProjectId());queryWrapper.eq(StressCaseDO::getId, req.getId());return stressCaseMapper.update(stressCaseDO, queryWrapper);}
}
StressCaseDTO
@Data
public class StressCaseDTO implements Serializable {private Long id;private Long projectId;private Long moduleId;private Long environmentId;private String name;private String description;private String assertion;private String relation;private String stressSourceType;private String threadGroupConfig;private String jmxUrl;private String path;private String method;private String query;private String header;private String body;private String bodyType;private Date gmtCreate;private Date gmtModified;
}

相关文章:

测试用例接口开发实战

测试用例接口开发实战 前言 在上一集&#xff0c;我们也大概完成了对Jmeter的二次开发的Demo版本的了解&#xff0c;我们接下来就要基于这个Demo来将Jmeter压测进行平台化。 那么这一集&#xff0c;我们讲一讲测试用例接口开发实战。 StressCaseController 我们的Controll…...

C#中压缩文件夹,及其内容

压缩包格式&#xff0c;本文主要用于说明如何使用代码 文件或文件夹压缩为 zip压缩包及其解压操作&#xff0c; 下面分两个版本进行实现 1.简单版本 bool DoCompressDirectoryInfo(string folderPath){try{var zipFilePath $"{folderPath}.zip";var directoryInfo …...

机器学习 | 回归算法原理——多项式回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最速下降法&#xff08;梯度下降法&#xff09;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…...

力扣224【基本计算器】

给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数&#xff0c;比如 eval() 。 1 < s.length < 3 * 105 s 由数字、‘’、‘-’、‘(’、‘)’、和 ’ ’ 组成 s 表示一个有效的…...

【Linux】HTTP 协议

目录 1. URL2. HTTP 协议2.1. HTTP 请求2.2. HTTP 响应 1. URL URL 表示着是统一资源定位符(Uniform Resource Locator), 就是 web 地址&#xff0c;俗称“网址”; 每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址; URL 的主要由四个部分组成: sche…...

@Builder注释导致@RequestBody的前端json反序列化失败,HTTP400

项目里发生了一个bug&#xff0c;就是前端请求一个接口时候&#xff0c;报了HTTP 400 Bad Request 通常来说这个问题是前后端的参数没对齐&#xff0c;比如前端传了个String&#xff0c;但后端对应的是Integer。 所以我就排查了半天&#xff0c;结果没发现啥错误&#xff0c;…...

网络学习|如何理解服务的端口号

文章目录 1. 端口号的定义2. 端口号的分类3. 端口号的用途4. 注意事项5. 示例图解 后端面试中可能遇到的端口相关问题及答案1. 什么是端口号&#xff1f;为什么需要端口号&#xff1f;2. 知名端口&#xff08;Well-Known Ports&#xff09;有哪些&#xff0c;举例说明&#xff…...

《0基础》学习Python——第十八讲__爬虫/<1>

一、什么是爬虫 爬虫是一种网络数据抓取的技术。通过编写程序&#xff08;通常使用Python&#xff09;&#xff0c;爬虫可以自动化地访问网页&#xff0c;解析网页内容并提取出所需的数据。爬虫可以用于各种用途&#xff0c;如搜索引擎的索引&#xff0c;数据分析和挖掘&#x…...

NFTScan 浏览器现已支持 .mint 域名搜索功能!

近日&#xff0c;NFT 数据基础设施 NFTScan 浏览器现已支持用户输入 .mint 域名进行 Mint Blockchain 网络钱包地址的搜索查询&#xff0c; NFTScan 用户能够轻松地使用域名追踪 NFT 交易&#xff0c;为 NFT 钱包地址相关的搜索查询功能增加透明度和便利性。 NFTScan explorer…...

Git基本原理讲解、常见命令、Git版本回退、Git抛弃本地分支拉取仓库最新分支

借此机会写篇博客汇总一下自己去公司实习之后遇到的一些常见关于Git的操作。 Git基本认识 Git把数据看作是对小型文件系统的一组快照&#xff0c;每次提交更新&#xff0c;或在Git中保存项目状态时&#xff0c;Git主要对当时的全部文件制作一个快照并保存这个快照的索引。同时…...

前端网页打开PC端本地的应用程序实现方案

最近开发有一个需求&#xff0c;网页端有个入口需要跳转三维大屏&#xff0c;而这个大屏是一个exe应用程序。产品需要点击这个入口&#xff0c;并打开这个应用程序。这个就类似于百度网盘网页跳转到PC端应用程序中。 这里我们采用添加自定义协议的方式打开该应用程序。一开始可…...

遇到not allow unquoted fieldName怎么办

前言 Exception in thread "main" com.alibaba.fastjson2.JSONException: not allow unquoted fieldName, offset 2, character , line 1, column 3, fastjson-version 2.0.25 { "data":null, "code":200, "msg":"成功"…...

IDEA安装并使用通义灵码

IDEA安装并使用通义灵码 通义灵码介绍安装通义灵码 通义灵码介绍 在数字革命的前沿&#xff0c;阿里云技术团队匠心独运&#xff0c;倾力打造“通义灵码”——一个融合尖端科技的智能编码助手&#xff0c;旨在革新软件工程的未来。 实时代码扩展 通义灵码具备深度理解代码脉络的…...

<数据集>AffectNet表情识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;29752张 标注数量(xml文件个数)&#xff1a;29752 标注数量(txt文件个数)&#xff1a;29752 标注类别数&#xff1a;7 标注类别名称&#xff1a;[anger,contempt,disgust,fear,happy,neutral,sad,surprise] 序号类…...

ThinkPHP对接易联云打印

引入composer包 composer require yly-openapi/yly-openapi-sdk <?phpnamespace app\common\library;use app\admin\model\yp\Order; use App\Api\PrintService; use App\Config\YlyConfig; use App\Oauth\YlyOauthClient; use think\Cache; use think\Config;class Yly {…...

JavaScript轮播图

HTML部分 <div class"box" onmouseover"over()" onmouseout"noover()"><img src"./img/zuo.png" alt"" class"left_arrow" onclick"left_last()"><img src"./img/yy.png" al…...

修复SteamUI.dll加载失败的指南,快速修复failed to load steamui.dll

在使用Steam平台进行游戏下载、安装和运行时&#xff0c;可能会遇到一些系统错误&#xff0c;比如“failed to load steamui.dll”。这个错误通常意味着Steam的用户界面库文件steamui.dll出现了问题。本文将详细介绍steamui.dll文件的相关信息以及如何修复这一问题。 一.什么是…...

PCL Local Surface Patches 关键点提取

目录 一、算法原理1、算法原理2、 参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、算法原理 主曲率是某一点局部形状的体现,Local Surface Patches 关键点检测法…...

Vue与ASP.NET Core Web Api设置localhost与本地ip地址皆可访问

Vue的设置 我们创建并启动一个Vue项目&#xff0c;如下所示&#xff1a; 打开cmd&#xff0c;输入ipconfig查询本地ip地址&#xff1a; 想通过本地ip地址访问&#xff0c;把localhost改成本地ip地址&#xff0c;发现打不开&#xff1a; 这是因为Vue项目默认只有localhost&…...

Android 线程池的面试题 线程线程池面试题

1.为什么要用线程池 降低资源消耗&#xff1a;通过复用线程&#xff0c;降低创建和销毁线程的损耗。 提高响应速度&#xff1a;任务不需要等待线程创建就能立即执行。 提高线程的可管理性&#xff1a;使用线程池可以进行统一的分配、调优和监控。 2. 线程池执行流程&#xff08…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...