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

MES系统工作流的单元测试方案

MES系统工作流的单元测试方案

在基于Java实现的MES系统中,若算子组成工作流并通过JSON传递数据,后端解析JSON后执行业务逻辑的流程,单元测试的核心是确保以下内容的正确性:

  1. 算子功能的正确性(每个算子单独的逻辑)。
  2. 工作流的正确性(算子间数据传递和组合逻辑)。
  3. JSON的解析和业务逻辑的正确性

以下是具体的方法和步骤:


1. 测试目标划分

1.1 算子的单独测试

每个算子是工作流的基础模块,因此需要确保其逻辑正确。

要测试的内容:
  • 算子是否能正确处理输入数据。
  • 算子的输出是否符合预期。
测试方法:
  • 使用JUnit或类似框架,为算子的核心功能单独编写测试用例。
  • 模拟输入数据并验证算子的输出。
示例代码:
@Test
void testFilterOperator() {FilterOperator filterOperator = new FilterOperator();List<Data> input = Arrays.asList(new Data("valid"), new Data("invalid"));List<Data> expectedOutput = Arrays.asList(new Data("valid"));List<Data> actualOutput = filterOperator.execute(input);assertEquals(expectedOutput, actualOutput);
}

1.2 JSON生成与组合测试

JSON的生成和组合是工作流中各算子协作的重要环节,需确保生成的JSON结构正确。

要测试的内容:
  • 每个算子是否能正确生成JSON片段。
  • 不同算子间的输出是否能正确组合为一个完整的JSON。
测试方法:
  • 对JSON生成逻辑进行单元测试,验证输出的JSON是否符合预期结构。
  • 使用org.jsoncom.google.gson库对JSON进行验证。
示例代码:
@Test
void testJsonComposition() {// 模拟多个算子的输出String operator1Output = "{\"key1\": \"value1\"}";String operator2Output = "{\"key2\": \"value2\"}";// 模拟组合逻辑JSONObject finalJson = new JSONObject();finalJson.put("operator1", new JSONObject(operator1Output));finalJson.put("operator2", new JSONObject(operator2Output));String expectedJson = "{ \"operator1\": {\"key1\": \"value1\"}, \"operator2\": {\"key2\": \"value2\"} }";assertEquals(expectedJson, finalJson.toString());
}

1.3 后端业务逻辑测试

后端业务逻辑依赖于JSON的正确解析和数据处理,因此需要对解析逻辑进行单独测试。

要测试的内容:
  • JSON解析是否正确提取了需要的数据。
  • 数据提取后,业务逻辑是否正常执行。
测试方法:
  • 使用伪造的JSON模拟前端发送的数据,验证解析逻辑的输出。
  • 使用Mock框架(如Mockito)模拟依赖项,隔离测试环境。
示例代码:
@Test
void testJsonParsingAndBusinessLogic() {String inputJson = "{ \"operator1\": {\"key1\": \"value1\"}, \"operator2\": {\"key2\": \"value2\"} }";// 模拟JSON解析JSONObject jsonObject = new JSONObject(inputJson);String value1 = jsonObject.getJSONObject("operator1").getString("key1");String value2 = jsonObject.getJSONObject("operator2").getString("key2");// 模拟业务逻辑BusinessLogic logic = new BusinessLogic();String result = logic.processData(value1, value2);assertEquals("Processed: value1, value2", result);
}

2. 模拟整体工作流测试

在验证单个算子逻辑和JSON生成逻辑后,需要对整个工作流的执行链条进行测试。

要测试的内容:
  • 工作流是否能正确执行。
  • 工作流的最终输出是否符合预期。
测试方法:
  • 使用Mock框架模拟HTTP请求和响应,验证从请求到结果的完整流程。
  • 可以结合Spring Boot Test进行集成测试,验证控制器逻辑。
示例代码:
@Mock
private WorkflowService workflowService;@Autowired
private MockMvc mockMvc;@Test
void testWorkflowExecution() throws Exception {// 模拟请求和响应String requestJson = "{ \"input\": \"testData\" }";String expectedResponse = "{ \"result\": \"success\" }";when(workflowService.execute(any(String.class))).thenReturn(expectedResponse);mockMvc.perform(post("/workflow/execute").contentType(MediaType.APPLICATION_JSON).content(requestJson)).andExpect(status().isOk()).andExpect(content().json(expectedResponse));
}

3. 辅助工具与最佳实践

3.1 使用Mock框架

  • Mockito:隔离依赖组件,确保只测试目标功能。
  • WireMock:用于模拟HTTP接口请求和响应。

3.2 数据驱动测试

  • 使用参数化测试(如JUnit5中的@ParameterizedTest)覆盖更多数据场景。
  • 使用外部JSON文件作为测试输入,增强可维护性。
示例:
@ParameterizedTest
@ValueSource(strings = { "test_case_1.json", "test_case_2.json" })
void testWithJsonFile(String fileName) throws Exception {String jsonInput = new String(Files.readAllBytes(Paths.get("src/test/resources/" + fileName)));// 测试逻辑...
}

3.3 使用JSON Schema验证

确保生成的JSON和预期的结构一致,可以使用JSON Schema进行验证。

示例:
@Test
void testJsonSchemaValidation() {String generatedJson = "{ \"key\": \"value\" }";String schema = "{ \"type\": \"object\", \"properties\": { \"key\": { \"type\": \"string\" } }, \"required\": [\"key\"] }";SchemaValidator validator = new SchemaValidator();assertTrue(validator.validate(generatedJson, schema));
}

总结

  1. 对单个算子进行单元测试,验证输入输出的正确性。
  2. 对JSON生成、组合和解析进行单元测试,确保数据流转正确。
  3. 对后端业务逻辑解析和处理进行单独测试,确保逻辑无误。
  4. 使用Mock和集成测试框架验证工作流的整体执行链条。

这种分层次的单元测试和集成测试方法,既保证了系统的每个模块高质量,又能验证整体的工作流执行效果。

相关文章:

MES系统工作流的单元测试方案

MES系统工作流的单元测试方案 在基于Java实现的MES系统中&#xff0c;若算子组成工作流并通过JSON传递数据&#xff0c;后端解析JSON后执行业务逻辑的流程&#xff0c;单元测试的核心是确保以下内容的正确性&#xff1a; 算子功能的正确性&#xff08;每个算子单独的逻辑&…...

2.学习TypeScript 编译选项配置

自动编译 我们可以使用 tsc ...../.ts -w 命令进行ts文件的自动编译 执行后 编译会持续侦听 自动编译 这种方式只能侦听一个文件 对做项目肯定是不现实的&#xff0c;为了解决这个问题&#xff0c;我们需要添加一个tsconfig.json文件&#xff0c;写入一个基础对象 再有tsconfi…...

计算机网络之王道考研读书笔记-2

第 2 章 物理层 2.1 通信基础 2.1.1 基本概念 1.数据、信号与码元 通信的目的是传输信息。数据是指传送信息的实体。信号则是数据的电气或电磁表现&#xff0c;是数据在传输过程中的存在形式。码元是数字通信中数字信号的计量单位&#xff0c;这个时长内的信号称为 k 进制码…...

【BUG】记一次context canceled的报错

文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢&#xff1f; 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…...

[SWPUCTF 2022 新生赛]善哉善哉

右击查看属性 然后放在010查看一下 摩斯密码解码 用佛曰解码 用md5加密看一下 最后一步md5&#xff0c;没有说明编码&#xff0c;尝试utf8和gbk ss4 施主&#xff0c;此次前来&#xff0c;不知有何贵干? import hashlib print(hashlib.md5(ss4.encode(utf8)).hexdigest())f…...

《PCI密码卡技术规范》题目

单选1 在《PCI密码卡技术规范》中&#xff0c;下列哪项不属于PCI密码卡的功能&#xff08;&#xff09;。 A.密码运算功能 B.密钥管理功能 C.物理随机数产生功能 D.随主计算机可信检测功能 正确答案&#xff1a;D. <font style"color:#DF2A3F;">解析&…...

城市大屏设计素材宝库:助力设计师高效创作

城市大屏设计工作要求设计师在有限的时间内打造出令人惊叹的视觉效果&#xff0c;而拥有一套必备的素材集无疑是如虎添翼。这些素材犹如设计师的得力助手&#xff0c;无论是构建整体布局的设计模板&#xff0c;还是点缀细节的图标图形&#xff0c;都能在关键时刻发挥重要作用&a…...

HCIA-Access V2.5_5_1PON系统概述_PON网络概述

PON网络设备有很多各类&#xff0c;可应用于不同的业务场景&#xff0c;从而实现不同的业务&#xff0c;本章介绍PON系统应用组成&#xff0c;分析PON系统的硬件结构和模块功能&#xff0c;描述PON系统的应用场景&#xff0c;帮助你对接入网中设备形态有更深刻的印象。 你可以…...

群落生态学研究进展】Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…...

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器

大家好&#xff0c;今天给大家分享一个开源的自托管虚拟浏览器项目Neko&#xff0c;旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器&#xff0c;为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器&#xff0c;提供…...

职场上,如何做好自我保护?

今天我们讨论一个话题&#xff1a;在职场上&#xff0c;如何保护好自己&#xff1f;废话不多说&#xff0c;我们直接上干货。 &#xff08;一&#xff09; 1.时刻准备一点零食或代餐&#xff0c;如果遇到长时间的会议&#xff0c;就补充点能量。代餐最好选流体&#xff0c;这…...

华为数通最新题库 H12-821 HCIP稳定过人中

以下是成绩单和考试人员 HCIP H12-831 HCIP H12-725 安全中级...

mac iterm2 使用 lrzsz

前言 mac os 终端不支持使用 rz sz 上传下载文件&#xff0c;本文提供解决方法。 mac 上安装 brew install lrzsz两个脚本 注意&#xff1a;/usr/local/bin/iterm2-send-zmodem.sh 中的 sz命令路径要和你mac 上 sz 命令路径一致。 /usr/local/bin/iterm2-recv-zmodem.sh 中…...

PostgreSql-学习06-libpq之同步命令处理

目录 一、环境 二、介绍 三、函数 1、PQsetdbLogin &#xff08;1&#xff09;作用 &#xff08;2&#xff09;声明 &#xff08;3&#xff09;参数介绍 &#xff08;4&#xff09;检测成功与否 2、PQfinish &#xff08;1&#xff09;作用 &#xff08;2&#xff0…...

简单配置,全面保护:HZERO审计服务让安全触手可及

HZERO技术平台&#xff0c;凭借多年企业资源管理实施经验&#xff0c;深入理解企业痛点&#xff0c;为您提供了一套高效易用的审计解决方案。这套方案旨在帮助您轻松应对企业开发中的审计挑战&#xff0c;确保业务流程的合规性和透明度。 接下来&#xff0c;我将为大家详细介绍…...

HCIA-Access V2.5_4_1_1路由协议基础_IP路由表

大型网络的拓扑结构一般会比较复杂&#xff0c;不同的部门&#xff0c;或者总部和分支可能处在不同的网络中&#xff0c;此时就需要使用路由器来连接不同的网络&#xff0c;实现网络之间的数据转发。 本章将介绍路由协议的基础知识、路由表的分类、静态路由基础与配置、VLAN间…...

Spring IOC 和 AOP的学习笔记

Spring框架是java开发行业的标准 Spring全家桶 Web&#xff1a;Spring Web MVC/Spring MVC、Spring Web Flux 持久层&#xff1a;Spring Data / Spring Data JPA 、Spring Data Redis 、Spring Data MongoDB 安全校验&#xff1a;Spring Security 构建工程脚手架&#xff…...

二七(vue2-03)、生命周期四个阶段及八个钩子、工程化开发和脚手架、组件注册、拆分组件

1. 生命周期 1.1 生命周期四个阶段 <!-- Vue生命周期&#xff1a;一个Vue实例从 创建 到 销毁 的整个过程。生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁1.创建阶段&#xff1a;创建响应式数据2.挂载阶段&#xff1a;渲染模板3.更新阶段&#xff1a;修改…...

[树] 最轻的天平

问题描述 天平的两边有时不一定只能挂物品&#xff0c;还可以继续挂着另一个天平&#xff0c;现在给你一些天平的情况和他们之间的连接关系&#xff0c;要求使得所有天平都能平衡所需物品的总重量最轻。 一个天平平衡当且仅当“左端点的重量 \times 左端点到支点的距离 …...

Linux udev介绍使用

udev udev配置文件匹配键和赋值键操作符解释示例修改udev配置U盘自动挂载Usb卸载SD卡挂载SD卡卸载 udev配置文件 /etc/udev/udev.conf 这个文件通常很短&#xff0c;他可能只是包含几行#开头的注释&#xff0c;然后有几行选项&#xff1a; udev_root“/dev/” udev_rules“/…...

开源机械爪控制库:从PID算法到ROS集成的全栈开发指南

1. 项目概述&#xff1a;一个开源的机械爪设计与控制库最近在机器人硬件开发的圈子里&#xff0c;开源项目“MeyerZhou/openclaw”引起了不少创客和机器人爱好者的注意。简单来说&#xff0c;这是一个专注于机械爪&#xff08;或称机械手、夹爪&#xff09;设计与控制的代码库和…...

使用mcp-maker快速构建AI工具调用服务器:从协议原理到工程实践

1. 项目概述与核心价值最近在折腾AI应用开发&#xff0c;特别是想给大语言模型&#xff08;LLM&#xff09;装上更强大的“手脚”&#xff0c;让它能直接操作我电脑上的各种软件和工具。这听起来很酷&#xff0c;对吧&#xff1f;但实际操作起来&#xff0c;你会发现一个核心痛…...

游戏技能工程化:用数据驱动与计算机视觉构建Apex Legends个人成长系统

1. 项目概述&#xff1a;从“Apex Growth”到“OpenClaw Skill”的爬升之路如果你是一名游戏开发者&#xff0c;尤其是对竞技类FPS&#xff08;第一人称射击&#xff09;游戏感兴趣&#xff0c;那么“Apex Legends”这个名字你一定不陌生。这款游戏以其快节奏、高机动性和深度的…...

LLVM开发实战指南:从入门到精通编译器与程序分析

1. 项目概述&#xff1a;为什么你需要一份LLVM指南&#xff1f;如果你是一名C开发者&#xff0c;或者对编译器、程序分析、代码优化这些底层技术感兴趣&#xff0c;那么“LLVM”这个名字对你来说一定不陌生。它早已不是象牙塔里的学术玩具&#xff0c;而是驱动着从iOS、macOS到…...

C++运行时类型识别实战:从typeid().name()到可读类型名

1. 为什么我们需要关心运行时类型识别&#xff1f; 在C开发中&#xff0c;我们经常会遇到需要知道某个变量或表达式具体类型的情况。特别是在调试复杂代码、编写泛型程序或进行元编程时&#xff0c;能够准确获取类型信息就显得尤为重要。想象一下&#xff0c;当你看到一个日志输…...

企业级后端四层架构实战:从理论到代码的清晰落地

1. 项目概述&#xff1a;一个四层架构的实战蓝图最近在GitHub上看到一个挺有意思的项目&#xff0c;叫BTawaifi/four-layer-system。光看名字&#xff0c;你可能会觉得这又是一个老生常谈的“四层架构”理论教程&#xff0c;无非是Controller、Service、Repository那套东西。但…...

Go语言实现Hermes引擎:高性能JavaScript字节码虚拟机解析与实践

1. 项目概述&#xff1a;一个Go语言实现的Hermes引擎最近在折腾一些需要高性能模板渲染的后端服务&#xff0c;偶然间在GitHub上发现了LAI-755/hermes-go这个项目。简单来说&#xff0c;这是一个用纯Go语言实现的Hermes引擎。如果你对前端生态熟悉&#xff0c;可能听说过Hermes…...

Midjourney像素艺术提示词工程:98%新手忽略的4个隐藏权重指令,实测提升风格还原度320%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney像素艺术提示词工程的底层逻辑重构 像素艺术在 Midjourney 中并非天然适配的生成模态&#xff0c;其高精度、低分辨率、强风格约束的特性与扩散模型默认的连续性渲染范式存在根本张力。要实现…...

AI智能体任务控制中心:构建可管理复杂项目的协作框架

1. 项目概述&#xff1a;为智能体装上“任务控制中心” 最近在折腾AI智能体&#xff08;Agent&#xff09;开发的朋友&#xff0c;可能都遇到过这样的场景&#xff1a;你精心设计了一个能联网搜索、处理文档、调用API的智能体&#xff0c;它单次任务的表现堪称完美。但当你试图…...

Arm Fast Models中VGIC架构与中断虚拟化解析

1. Arm Fast Models中的VGIC架构解析虚拟通用中断控制器(Virtual Generic Interrupt Controller, VGIC)是Armv7/v8架构虚拟化扩展的核心组件之一。在Fast Models仿真环境中&#xff0c;Iris组件通过精确建模实现了VGIC的完整功能&#xff0c;包括&#xff1a;物理中断与虚拟中断…...