当前位置: 首页 > 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…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...