部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >测试数据验证的3大难题,这个工具全搞定!

测试数据验证的3大难题,这个工具全搞定!

作者头像
可可的测试小栈
发布于 2025-01-14 06:19:15
发布于 2025-01-14 06:19:15
25710
代码可运行
举报
文章被收录于专栏:全栈测试全栈测试
运行总次数:0
代码可运行

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服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 引入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 服务器。

部分式例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 验证数据发送的完整性。
 */
@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);
}

四、总结

这种方法让我们能够迅速校验客户端请求的次数和内容,确保它们在限定时间内的准确性。这不仅关乎速度,更关乎业务需求的深入验证。

在自动化测试框架里,既能保证快速有效的测试,同时也能保证测试结果的稳定性,从而降低代码的维护。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可可的测试小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
可以,大佬,互粉一下
可以,大佬,互粉一下
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Java注解之@Autowired
在Java中,@Autowired注解的作用是将依赖关系自动注入到类中,它是Spring框架中的一个核心注解之一。@Autowired可以用于自动装配一个类的成员变量、构造函数或者方法,以实现依赖注入(Dependency Injection)。
用户4396583
2024/08/09
6810
private final、@Autowired、@Resource你更喜欢哪个?
现在有一些流言,想必大多都是非Java程序员对Java程序员的称谓或者嘲讽:“spring boy”。
灬沙师弟
2023/10/24
1.4K0
private final、@Autowired、@Resource你更喜欢哪个?
【面试】Spring Boot构建项目时有哪些常用的注解?
Spring Boot是一款强大的开发框架,其核心思想是通过注解来简化配置,提高开发效率。
鳄鱼儿
2024/05/21
1140
注解@Autowired是如何实现的
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。spring技术自身也在不断的发展和改变,从当前springboot的火热程度来看,java config的应用是越来越广泛了,在使用java config的过程当中,我们不可避免的会有各种各样的注解打交道,其中,我们使用最多的注解应该就是@Autowired注解了。这个注解的功能就是为我们注入一个定义好的bean。那么,这个注解除了我们常用的属性注入方式之外还有哪些使用方式呢?它在代码层面又是怎么实现的呢?这是本篇文章着重想讨论的问题。
chengcheng222e
2021/11/04
7480
Spring依赖注入的魔法:深入DI的实现原理【beans 五】
在软件开发的舞台上,依赖注入是一个强大的设计模式,而Spring框架以其优雅的实现而脱颖而出。你可能已经使用了DI,但你是否真正了解它的实现原理呢?在这篇文章中,我们将打开DI的黑盒,揭开Spring DI的神秘面纱,让你更深刻地理解这一关键的框架特性。
一只牛博
2025/05/30
1050
Spring依赖注入的魔法:深入DI的实现原理【beans 五】
@Autowired注解到底怎么实现的,你能说清楚么?
使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式。
Java小咖秀
2021/07/12
6880
2022年最新版Spring专项面试突击
Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring 帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。
JavaEdge
2022/02/02
3310
2022年最新版Spring专项面试突击
Spring注解篇:@Component详解!
在Java开发中,Spring框架以其强大的功能和灵活性,成为了许多开发者的首选。其中,@Component注解是Spring框架中非常关键的一个组成部分。它不仅简化了组件的注册和管理,还使得依赖注入变得异常简单。本文将详细介绍@Component注解的使用方法、源码解析、实际应用案例以及优缺点分析,帮助开发者更好地理解和运用这一注解。
喵手
2024/08/10
2.5K0
Spring注解篇:@Component详解!
27道高频Spring面试题,你能答对几个?
Spring框架是一个为Java应用程序开发提供综合、广泛的基础性支持的Java平台。 Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。 Spring框架本身也是按照设计模式精心打造的,这使得我们可以在开发环境中安心地集成Spring框架,不必担心Spring是如何在后台工作的。
程序员追风
2019/07/24
5030
大公司为什么禁止在 Spring Boot 项目中使用 @Autowired 注解?
查阅了相关文档了解了一下,原来这个提示是spring framerwork 4.0以后开始出现的,spring 4.0开始就不推荐使用属性注入,改为推荐构造器注入和setter注入。
搜云库技术团队
2023/08/08
5470
大公司为什么禁止在 Spring Boot 项目中使用 @Autowired 注解?
Spring IOC
实际开发中,我们如果在对象 A 内部去创建、修改或者注销另一个对象 B,这会导致对象之间非常复杂的依赖关系,不利于代码的维护更新。
Qwe7
2022/08/12
4680
Spring6框架中依赖注入的多种方式(推荐构造器注入)
一个典型的企业应用程序不是由单个对象(或在Spring术语中称为bean)组成的。
codetrend
2024/05/26
3890
Spring面试底层原理的那些问题,你是不是真的懂Spring?
1、什么是 Spring 框架?Spring 框架有哪些主要模块? Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring 帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring 框 架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成 Spring 框架,不 必担心 Spring 是如何在后台进行工作的。 Spring 框架至今已集成了 20 多个模块。这些模块主要被分如下图所示的核心容器、
Java架构
2018/07/04
1.6K0
Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 ✨
大家好这里是苏泽,一个从小喜欢钻研原理的疯小子 这篇文章是我的专栏《Spring 狂野之旅:底层原理高级进阶》 🚀 的第一篇文章 也是学习写一个讲解底层原理的博客的第一课 我认为深入了解一个事物的全貌是一件神秘而刺激的过程 希望你们能和我一样Enjoy the process 这个专栏里我希望能把Spring的底层原理讲得彻彻底底 让普通人也能一看就懂的程度 会慢慢更新 如果有想法可以在评论区提哦 相互交流学习的小伙伴可以关注一下我 技术博客每日一更
苏泽
2024/03/01
1640
推荐收藏系列:Spring boot 2.x注解Annotation大全
@component,而其余 @Controller、@Service、@Repository都组合了@component注解,主要为便于使用者Class组件进行归类。默认加载IOC容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作
macrozheng
2019/08/06
7240
Spring中的@Autowired注解详细讲解
@Autowired注解可以用于构造函数、setter方法、字段以及配置方法上,以指示Spring自动注入相应的bean。它的工作原理基于类型匹配,Spring容器会查找与所需类型匹配的bean,并自动注入。
祁画
2024/07/28
4620
一个属性同时使用Autowired和Resource注解会发生什么?
如题,如果在同一个属性上使用@Autowired注解注入bean1,然后使用@Resource注解注入bean2会发生什么?
编程大道
2022/07/01
4810
一个属性同时使用Autowired和Resource注解会发生什么?
精进Spring—Spring常用注解【经典总结】
Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式。
Java编程指南
2019/10/23
5400
精进Spring—Spring常用注解【经典总结】
Spring经典高频面试题,原来是长这个样子
本文选自《Spring 5核心原理与30个类手写实战》一书,文末参与互动有机会赢取本书。本文题目目录:
博文视点Broadview
2020/06/10
4760
Spring经典高频面试题,原来是长这个样子
Spring复杂的IOC容器之短小的注解篇
在使用依赖注入绑定FXNews相关实现类时,为了减少配置量,我们可以采用Spring的IoC容器提供的自动绑定功能,如下所示:
大忽悠爱学习
2022/05/10
3670
推荐阅读
相关推荐
Java注解之@Autowired
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验