测试用例接口开发实战
测试用例接口开发实战
前言
在上一集,我们也大概完成了对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;
}
相关文章:
测试用例接口开发实战
测试用例接口开发实战 前言 在上一集,我们也大概完成了对Jmeter的二次开发的Demo版本的了解,我们接下来就要基于这个Demo来将Jmeter压测进行平台化。 那么这一集,我们讲一讲测试用例接口开发实战。 StressCaseController 我们的Controll…...
C#中压缩文件夹,及其内容
压缩包格式,本文主要用于说明如何使用代码 文件或文件夹压缩为 zip压缩包及其解压操作, 下面分两个版本进行实现 1.简单版本 bool DoCompressDirectoryInfo(string folderPath){try{var zipFilePath $"{folderPath}.zip";var directoryInfo …...
机器学习 | 回归算法原理——多项式回归
Hi,大家好,我是半亩花海。接着上次的最速下降法(梯度下降法)继续更新《白话机器学习的数学》这本书的学习笔记,在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目,…...
力扣224【基本计算器】
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 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 地址,俗称“网址”; 每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址; URL 的主要由四个部分组成: sche…...
@Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
项目里发生了一个bug,就是前端请求一个接口时候,报了HTTP 400 Bad Request 通常来说这个问题是前后端的参数没对齐,比如前端传了个String,但后端对应的是Integer。 所以我就排查了半天,结果没发现啥错误,…...
网络学习|如何理解服务的端口号
文章目录 1. 端口号的定义2. 端口号的分类3. 端口号的用途4. 注意事项5. 示例图解 后端面试中可能遇到的端口相关问题及答案1. 什么是端口号?为什么需要端口号?2. 知名端口(Well-Known Ports)有哪些,举例说明ÿ…...
《0基础》学习Python——第十八讲__爬虫/<1>
一、什么是爬虫 爬虫是一种网络数据抓取的技术。通过编写程序(通常使用Python),爬虫可以自动化地访问网页,解析网页内容并提取出所需的数据。爬虫可以用于各种用途,如搜索引擎的索引,数据分析和挖掘&#x…...
NFTScan 浏览器现已支持 .mint 域名搜索功能!
近日,NFT 数据基础设施 NFTScan 浏览器现已支持用户输入 .mint 域名进行 Mint Blockchain 网络钱包地址的搜索查询, NFTScan 用户能够轻松地使用域名追踪 NFT 交易,为 NFT 钱包地址相关的搜索查询功能增加透明度和便利性。 NFTScan explorer…...
Git基本原理讲解、常见命令、Git版本回退、Git抛弃本地分支拉取仓库最新分支
借此机会写篇博客汇总一下自己去公司实习之后遇到的一些常见关于Git的操作。 Git基本认识 Git把数据看作是对小型文件系统的一组快照,每次提交更新,或在Git中保存项目状态时,Git主要对当时的全部文件制作一个快照并保存这个快照的索引。同时…...
前端网页打开PC端本地的应用程序实现方案
最近开发有一个需求,网页端有个入口需要跳转三维大屏,而这个大屏是一个exe应用程序。产品需要点击这个入口,并打开这个应用程序。这个就类似于百度网盘网页跳转到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安装并使用通义灵码 通义灵码介绍安装通义灵码 通义灵码介绍 在数字革命的前沿,阿里云技术团队匠心独运,倾力打造“通义灵码”——一个融合尖端科技的智能编码助手,旨在革新软件工程的未来。 实时代码扩展 通义灵码具备深度理解代码脉络的…...
<数据集>AffectNet表情识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:29752张 标注数量(xml文件个数):29752 标注数量(txt文件个数):29752 标注类别数:7 标注类别名称:[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平台进行游戏下载、安装和运行时,可能会遇到一些系统错误,比如“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项目,如下所示: 打开cmd,输入ipconfig查询本地ip地址: 想通过本地ip地址访问,把localhost改成本地ip地址,发现打不开: 这是因为Vue项目默认只有localhost&…...
Android 线程池的面试题 线程线程池面试题
1.为什么要用线程池 降低资源消耗:通过复用线程,降低创建和销毁线程的损耗。 提高响应速度:任务不需要等待线程创建就能立即执行。 提高线程的可管理性:使用线程池可以进行统一的分配、调优和监控。 2. 线程池执行流程(…...
HunyuanVideo-Foley保姆级教程:从零部署到音效生成的5个关键步骤
HunyuanVideo-Foley保姆级教程:从零部署到音效生成的5个关键步骤 1. 环境准备与镜像部署 1.1 硬件要求检查 在开始部署前,请确保您的设备满足以下最低配置要求: 显卡:NVIDIA RTX 4090/4090D(24GB显存)内…...
MoveIt 2 Launch文件进阶:如何用MoveItConfigsBuilder灵活切换规划器(OMPL vs. Pilz)
MoveIt 2规划器切换实战:用MoveItConfigsBuilder实现OMPL与Pilz工业规划器的动态选择 在工业机器人应用开发中,运动规划器的选择往往决定了任务执行的效率和质量。想象一下这样的场景:你的机械臂需要在杂乱环境中快速避障移动时,…...
AutoUnipus:重新定义U校园学习效率的智能解决方案
AutoUnipus:重新定义U校园学习效率的智能解决方案 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 还在为U校园平台上堆积如山的网课任务而焦虑吗?每天花费…...
当Navicat密码遗忘时:开源解密工具如何重建数据库连接通路
当Navicat密码遗忘时:开源解密工具如何重建数据库连接通路 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 数据库连接中断的三大痛点场景 场…...
如何让扫描PDF变得可搜索?OCRmyPDF-Desktop完整解决方案
如何让扫描PDF变得可搜索?OCRmyPDF-Desktop完整解决方案 【免费下载链接】pdfocr-desktop PDF OCR Application, adds an OCR text layer to scanned PDF files, allowing them to be copied and searched. 项目地址: https://gitcode.com/gh_mirrors/oc/pdfocr-d…...
七牛云图床避坑指南:如何避免CNAME解析和HTTPS配置中的常见错误
七牛云图床高阶配置实战:CNAME与HTTPS深度排错手册 第一次用七牛云图床时,我在凌晨三点对着屏幕上的404错误发呆——明明按照文档一步步操作,为什么图片死活加载不出来?后来才发现是CNAME解析的TTL缓存问题。这种看似简单的配置背…...
海康WEBSDK无插件版实战:零基础构建WEB端网络摄像机实时监控系统
1. 环境准备:5分钟搞定基础配置 第一次接触海康WEBSDK无插件版时,我也被那些专业术语吓到过。但实际操作后发现,只要准备好三样东西就能开工:一台能联网的电脑、海康网络摄像机、以及从官网下载的开发包。这里分享几个新手容易踩的…...
OpenClaw自动化周报生成:Qwen3-32B私有镜像精准提取Git提交记录
OpenClaw自动化周报生成:Qwen3-32B私有镜像精准提取Git提交记录 1. 为什么需要自动化周报生成 每周五下午,我都会面临同样的困扰:需要从零散的Git提交记录中手动整理本周工作内容,再拼凑成一份结构化的周报。这个过程不仅耗时&a…...
MAX30102传感器总是不准?Arduino避坑指南:从焊接绝缘到手指摆放的5个关键细节
MAX30102传感器精度优化全攻略:从硬件调试到算法校准的完整解决方案 MAX30102作为一款高集成度生物传感器,在心率、血氧监测领域应用广泛,但许多开发者在Arduino平台上使用时常遇到数据不稳定、测量偏差大的问题。本文将系统性地剖析影响测量…...
vLLM-v0.17.1应用场景:智能硬件语音助手离线LLM推理部署
vLLM-v0.17.1应用场景:智能硬件语音助手离线LLM推理部署 1. 技术背景与需求分析 智能硬件语音助手正在经历从云端依赖向本地化处理的转变。传统方案面临三大痛点: 网络延迟问题:云端API调用导致响应速度受限隐私安全顾虑:用户对…...
