Hi,你好呀,我是可可。
在测试过程中,涉及数据验证时,我们常常面临三大难题:数据不准确、处理速度慢、结果难以复现。
今天,我要强推一个神器,它让我的数据测试工作变得轻松又高效!
一、相关背景
模块化开发和分布式服务器部署盛行的时代,我们在系统测试中经常要确保与后端服务的数据交互是完整无误的。但实际操作起来,却可能遇到不少难题。
在实际工作中,我们可能会遇到的一些挑战。
1、后端开发未同步
后端服务还在紧锣密鼓的开发,测试工作无法顺利全面进行。
2、权限限制
测试人员可能因为权限的限制而无法触及后端数据,严重阻碍对数据交换完整性的验证工作。
3、第三方开发
后端服务是由第三方团队负责开发,进行有效的集成测试就会变得更加复杂。
我们需要更加精细和智能化的测试工具和方法,有效地识别和解决数据交换过程中可能出现的问题,从而提高软件质量。
二、WireMock
我们通过搭建 WireMock 服务器,模拟客户端数据的接收过程。这种方法简单而高效,它允许我们在设定的时间内验证服务器接收到的数据量和频率,从而确保客户端发送的数据符合预期。
1、面临的问题
我们的用例需要精准,以下是三个关键点:
1)依照场景自动化触发API请求,确保功能点都能在自动化流程中被准确触发。
2)现实业务中的请求地址转换为WireMock配置的路径,在一个受控的环境中模拟真实请求。
3)验证监控数据是否与预期值一致,确保自动化测试准确性的关键。
2、相关环境
用例核心在于:利用Rest-Assured来完成API的数据发送。在实际项目中,这一步通常是通过客户端项目的功能来触发的。
接下来,通过验证服务器接收到的数据来确认API的数据发送是否成功。
✅ IDE: IntelliJ IDEA
✅ 语言:Java
✅ API服务器 :WireMock
✅ API 请求:Rest-Assured
✅ 测试框架:TestNg
✅ 项目类型:Maven
3、关键步骤
1) WireMock 的POST构建与启动 :
创建和配置 WireMock 服务器,设置 POST 请求的 stub,以便模拟真实的 API 行为。
2) Rest Assured 模拟API请求:
使用 Rest Assured 库发送模拟的 API POST 请求
3) WireMock API 获取POST数据:
掌握如何通过 WireMock API 获取接收到的 POST 数据,以进行后续的验证和分析。
三、实现过程
假如有一个系统功能需要测试——数据发送。
确保数据的完整性。怎么做?简单说,数据发出去后,我们得去服务器端看看,接收到的数据和发出去的是否一模一样,每个字段都得对上,确保没有遗漏。
我们得连续触发这个功能,看看它是否每次都能准时、完整地发送数据。
1、过程分解
对于这个测试需求,本示例使用 WireMock 工具搭建一个模拟服务器,来替代真实的后端服务。通过这种方式,可以在本地测试数据发送功能。
我们利用模拟工具WireMock,来模拟服务器端的行为,捕获和验证数据。即使我们不能直接接触服务器,也能确保数据的完整性和准确性。
1)搭建并启动Mock 服务器
创建一个 WireMock 服务器,模拟真实的后端数据接收接口。
2)发送数据
触发本地系统的数据发送功能,使用 RestAssured 模拟数据发送,为了更好地验证数据发送功能,这里数据的发送是在一个新线程中完成。实时监控服务器接收数据的状况,动态测试系统的数据发送能力。
3)监控记录请求
Mock 服务器会记录所有接收到的请求,包括发送的数据。
4)比对数据
在监控过程中,可以WireMock 服务器里获取记录的数据,以确定数据发送功能未被篡改且没有丢失数据。在验证大量数据发送过程中,我们可以通过设置超时,来确认数据发送功能没有延迟或数据丢失。
2、Maven 配置
配置Java项目中依赖项的XML配置片段,在Maven项目的pom.xml文件中。它定义项目所需的三个库依赖,这些依赖是用于在Java项目中集成和运行WireMock服务器以及Jetty服务器的必要组件。
依次配置了三个依赖项,用于在Java项目中集成WireMock服务器和Jetty服务器,用于测试和模拟HTTP服务。
<!-- 引入WireMock依赖,用于在测试中模拟HTTP服务 -->
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-jre8</artifactId>
<version>3.0.1</version>
<type>pom</type>
<scope>test</scope>
</dependency>
<!-- 引入Jetty Servlet依赖,提供Servlet API的实现 -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>11.0.22</version>
</dependency>
<!-- 引入Jetty Server依赖,提供HTTP服务器和Servlet容器的核心功能 -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>11.0.22</version>
</dependency>
3、代码解析
代码给出完整的测试用例执行流程,且对每一个方法进行了逐一解释。
1、构建WireMock 服务器:
启动服务器并配置 WireMock,使其能够处理特定的 HTTP 请求。最后,返回一个 200 状态的响应,并包含 Content-Type 为 application/json 的头信息。
2、新建一个新线程Thread dataSendRequest 执行sendPost()方法。
sendPost 利用RestAssured 会每隔100 毫秒发送一次数据到MockServer,重复发送100 次且从第51次开始,发送内容testPostInvalid。
3、dataValidation() 方法
先通过调用receivedDataMonitor()方法,获取MockServer 收到的请求数据接着,再对请求的数据进行内容与大小的验证。
4、receivedDataMonitor()方法
每500毫秒循环一次地按接收到的时间,分别把请求的次数保存以做延迟性验证。
5、最后是合并线程和关闭MockServer 服务器。
部分式例代码如下:
/**
* 验证数据发送的完整性。
*/
@Test(description = "To Verify Data Sending Integrity ")
public void testDataIntegrity() {
// 初始化并启动WireMock服务器,监听9090端口
wireMockServer = startWireMockServer(9090);
// 设置数据发送的阈值和数量
long threshold = 10;
int eventSentCount = 100;
// 在新线程中发送数据,模拟并发发送场景
baseURI = "http://localhost:9090/api/data/receive";
Thread dataSendRequest = new Thread(() -> {
try {
// 实际发送POST请求的方法
sendPost(eventSentCount, 100);
} catch (Exception e) {
// 发送数据时的异常处理
System.out.println("Error: Sending Data");
}
});
// 启动线程
dataSendRequest.start();
// 验证数据发送的完整性
dataValidation(eventSentCount, threshold);
// 等待发送数据的线程结束
try {
dataSendRequest.join();
} catch (InterruptedException e) {
// 处理线程中断异常
throw new RuntimeException(e);
}
// 停止WireMock服务器
stopWireMockServer(wireMockServer);
}
四、总结
这种方法让我们能够迅速校验客户端请求的次数和内容,确保它们在限定时间内的准确性。这不仅关乎速度,更关乎业务需求的深入验证。
在自动化测试框架里,既能保证快速有效的测试,同时也能保证测试结果的稳定性,从而降低代码的维护。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有