我的软考历程

摘要

2023年2月,我所在的公司做了开发纱线MES系统的决定,该系统为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的智能化和数字化水平。我在该项目中被任命为系统架构设计师,全面掌管该项目的架构设计工作。本文将结合我在该项目中的架构设计工作经验,详细介绍如何把单元测试方法应用在项目中。在该项目中,我们采用了多种单元测试方法,包括静态测试和动态测试。静态测试在不运行程序的情况下,通过代码分析、人工走查等方式检查问题和缺陷。动态测试在运行项目后,通过访问项目去发现问题点。单元测试提高了项目的稳定性,最终在2023年10月,该系统正式上线并运行至今,系统运行稳定,表现优异,得到了客户工厂和公司领导的一致赞扬。

项目背景

随着我国从制造业大国升级为制造业强国以及工厂数字化和智能化的持续推进,我所在的某地某科技公司基于自研的物联网平台相继开发了染整一体化和织布一体化等系统,这些系统上线后,得到了工厂的追捧,也为公司带来了丰厚的经济回报。基于此,我司于2023年2月开始研发纱线MES系统,该系统预算730万,建设工期10个月,涵盖纱线工厂从清花、梳棉、并条、精梳、粗纱、细纱到络筒的全流程工序,将为纱线工厂提供全面的生产管理解决方案以及基于数据的智能决策分析能力。该项目为物联网层次架构,整体分为感知层、网络层和应用层。其中网络层为公司已有的物联网平台,这次重点建设内容为感知层和应用层,感知层使用Golang语言开发,作为联网网关部署在工厂侧,负责工厂数据的采集和云端指令的下发。应用层为纱线MES系统主体,采用Java语言开发,使用Spring Cloud微服务架构,数据库使用Mysql,缓存使用Redis,前端框架使用vue.js,日志、监控和链路追踪采用skywalking、prometheus、grafana和ELK,最终通过devops的方式部署在kubernetes集群中。系统上线后,将提供以下:基础管理、数据接入、工单排产、数字孪生、工资计算、智控中心和数据分析等等功能,通过以上功能,可以全面提升纱线工厂的数字化和智能化水平,使其运营水平和生产效率得到质的提升。

论述内容

由于该项目涉及流程多,处理过程复杂,同时项目参与者众多,需求变动快。为了提升项目的稳定性,我们采用单元测试方法来保证项目的质量。单元测试分为静态测试和动态测试,静态测试是指在不运行程序的情况下,通过人工走查、代码工具分析等方式去发现程序中的错误和问题,从而修正错误。动态测试是指在启动系统的情况下,通过人工验证功能或者别的驱动方式去让系统运行起来,让系统的业务运转起来,从而发现系统运行中的错误和问题,动态测试通常会采用边界值分析、等价类划分、因果图、决策树、代码覆盖等方式实现,为了提高系统的稳定性,我们会对不同级别的功能采用不同的测试方式。除此之外,我们在每次迭代后,都会采用自动化测试的方式去进行回归测试,通过回归测试保证业务的连贯性。下面我会详细论述各种测试方法在本项目中的应用。

一、静态测试

静态测试是保证代码质量的一种重要方式,我们在项目中会采取两种方式进行静态测试:一、成员代码互审会议;二、通过CICD中的自动化代码分析工具以及Idea中的代码审核插件。每次迭代中,当代码要提交测试前,小组就会举行代码评审会议,把本次迭代修改的代码逻辑给大家讲述一遍,大家一起去发现代码中的缺陷和问题,旨在提高代码的质量和可修改性以及可扩展性。当代码开发者修改之后,再次提交代码时,需要经过其他开发者的审核,在这个过程中,审核者要严格审查代码,否则具有同等的责任。除此之外,我们公司统一安装了Idea中的代码扫描工具,只要通过扫描才能进行代码提交,否则该代码会勒令修改,直到达到扫描标准。当代码提交后,CICD会自动化再次扫描代码,并生成报告,防止有问题的代码进入后续流程。我们公司就是通过这种方式,显著提高了代码的质量,在系统运行前就对系统的质量进行了把关。

二、动态测试

动态测试是测试团队的工作重心,动态测试的主要目标是提升系统的质量,发现系统存在的问题。所以,在项目的需求阶段,测试团队就要参与进来,识别测试需求,进行测试案例设计,经过测试评审之后,当完成系统开发之后,就可以进行动态测试。动态测试的种类很多如等价类划分、边界值分析、覆盖测试、基于因果图、基于决策树、基于正交等等方式,我们在设计测试案例时,主要采用了边界值分析和覆盖测试,边界值分析比较容易理解,比如我们在录入工厂的工序时,1-10的范围是合法的,测试人员在测试时就要测试边界值如0、1、2、9、10、11等等,看系统是否正常运行并进行响应。我们在进行覆盖测试时,首先要决定使用哪种级别的覆盖级别,覆盖测试分为:语句覆盖、条件覆盖、分支覆盖、条件分支覆盖、组合覆盖、路径覆盖等等。其中语句覆盖最弱,路径覆盖最强。我们在选择覆盖测试时首先要对系统模块的重要性做一个分析,因为都选择路径覆盖,成本太高,耗费时间太长,不具备可操作性。所以我们根据重要性的不同采用不同级别的覆盖测试方式,比如,数据接入模块是系统的核心,我们在进行动态测试时就要采用路径覆盖,确保流程没有任何问题,避免造成严重的故障。又比如,消息通知模块不在主流程中,它的执行过程对主流程影响不大,并且消息保存再数据库中,也可以重新发送,所以在测试时就采用条件覆盖,降低测试级别,保障测试进度。当动态测试进行完成后,测试人员需要生成测试报告,该报告详细描述测试的全部信息,以便其他人员查看,通过发现的问题,要给对应的负责人提bug,让其在规定时间内完成。

三、回归测试

回归测试是每次迭代的一种重点,当进行一个迭代时,测试人员首先要分析这次迭代对现在系统业务的影响,并把影响模块和范围标注出来,形成回归测试范围,然后根据回归范围进行回归测试用例的挑选,形成回归测试用例。当本次迭代完成后,测试人员通过自动化脚本的方式执行回归测试用例,并生成回归测试报告。通过回归测试,可以保证现有改动不会影响老的业务,可以让业务的持久性和稳定性得到保证。

总结

通过采用了多种单元测试方法,我们保证了系统的开发进度和质量。最终在2023年12月,该项目正式投产并对外提供服务,至今稳定运行,各项功能和性能指标均远远超过了客户的预期,得到了客户工厂和公司领导的一致赞扬。虽然项目取得了成功,但是也遇到过一些问题,在项目初期,由于产品经理对纱线业务的不熟悉,导致很多功能的调整和返工,这打击了开发人员的士气,基于此,我提出两个解决方式:1、派产品进入工厂一线,与工人交流,熟悉操作流程,彻底摸清纱线业务,保证需求质量;2、开发人员也要学习纱线业务,遇到问题反馈给产品,同时在做设计时,采用灵活的设计模式,为需求的变动留下可操作的空间。我们通过这两个方法解决了这个问题,保证了项目的进展。通过这次实践,我不仅学习到了测试相关技术,也锻炼了自己的架构和管理能力,我意识到只有不断地学习和实践才能让知识融汇于自己的技术体系之中,才能在未来的工作中游刃有余、勇担大任,为祖国的信息化建设贡献自己的力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87228.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87228.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/87228.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ简单消息监听

如何监听RabbitMQ队列 简单代码实现RabbitMQ消息监听 需要的依赖 <!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>x.x.x</version>&l…

自定义注解的使用

自定义注解 /*** 自定义注解*/ Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface FieldLabel {// 字段中文String label();// 字段顺序int order() default 0;// 分组标识String group() default "default";}解析自定义注解&#xf…

Linux:network:socket 绑定到一个interface,如果删除这个interface会怎么样?

最近碰到一个问题,应用绑定到了一个GRE的interface,如下socket绑定到了bond10这个interface。 ss -anp | grep bond udp UNCONN 0 0 100.0.5.113%bond10:5061 0.0.0.0:* users

OpenGL 3D编程大师基础之路:从几何体到物理引擎

引言&#xff1a;开启3D编程之旅 欢迎来到令人兴奋的3D编程世界&#xff01;本教程将带您从OpenGL基础开始&#xff0c;逐步掌握3D渲染的核心技术&#xff0c;最终实现一个包含物理模拟的完整3D场景。我们将探索几何体创建、光照系统、纹理映射、变换操作和碰撞检测等关键主题…

解决往GitHub提交大文件报错问题

前言 GitHub仓库单个文件的推荐大小不能超过50MB&#xff08;仅限于警告&#xff09;&#xff0c;但绝对不能超过100MB&#xff08;拒绝提交&#xff09; 问题 人总有手贱的时候&#xff0c;一不小心往Git仓库拷贝大文件并尝试push到GitHub&#xff0c;发现报错后才意识到问…

PostgreSQL基于归档日志的持续恢复测试

测试环境&#xff1a; os: linux PG: 17.4 src ip: 192.168.100.51 dst ip: 192.168.100.138 src: PGDATA/home/postgres174/pgdata dst: PGDATA/data/174/pgdata_standby 归档路径&#xff1a; 192.168.100.138 /data/174/archivedir 测试流程&#xff1a; 1. 主库(…

Linux——内核——网络协议

Linux网络协议栈是Linux内核中实现网络通信的核心组件&#xff0c;其设计遵循分层架构&#xff0c;支持多种网络协议和功能。以下从协议栈的分层结构、关键组件、工作流程、数据包处理机制、优化与调试等方面进行详尽阐述&#xff1a; 一、协议栈的分层结构 Linux网络协议栈基…

vue | 插件 | 移动文件的插件 —— move-file-cli 插件 的安装与使用

问题&#xff1a;想将打包生成的 dist 文件下的样式相关文件&#xff0c;进行移动。 解决&#xff1a;在 npm 上找写好的兼容操作系统的包 move-file-cli 插件 &#xff0c;用于移动文件 move-file-cli 插件的安装与使用 安装&#xff1a;npm install move-file-cli --save-d…

多个单片机简单通讯框架

文章目录 一、场景描述二、框架搭建设计思路通信协议设计2号单片机通讯框架框架优化建议 三、2号单片机的通讯框架如何处理消息丢失和重传&#xff1f;消息丢失与重传机制设计改进的通信协议重传机制实现关键机制说明优化建议 一、场景描述 有3个单片机进行通讯&#xff0c;分…

如何在服务区已有预装镜像的情况下管理自己的包

你的需求非常明确&#xff1a;希望利用 NGC 镜像预装的主环境包&#xff08;如 PyTorch、CUDA&#xff09;&#xff0c;同时能独立管理自己额外安装的包&#xff0c;避免直接污染主环境。以下是几种解决方案&#xff0c;按推荐度排序&#xff1a; 方案 1&#xff1a;虚拟环境复…

JavaWeb之Servlet(2)RequestResponse..

文章目录 1 Request和Response的概述2 Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据1-3小结2.2.4 获取请求参数的通用方式请求参数和请求数据的区别问题案例分析问题解决 2.3 IDEA快速创建Servlet2.4 …

将 h264+g711a存为 mp4文件,记录

将 h264g711a存为 mp4文件&#xff0c;记录 &#x1f4cc; 关键问题&#xff1a;MP4 不原生支持 G.711A MP4 容器格式 不原生支持 G.711&#xff08;包括 A-law&#xff0c;也就是 G.711A&#xff09;音频&#xff0c;所以不能直接将 G.711A 音频封装进 MP4 文件中。常见的做法…

【Elasticsearch】全文检索 组合检索

全文检索 1.全文检索1.1 准备测试数据1.2 案例分析1.2.1 match&#xff08;分词检索&#xff09;1.2.2 match_phrase&#xff08;短语检索&#xff09;1.2.3 match_phrase_prefix&#xff08;短语前缀匹配&#xff09;1.2.4 multi_match&#xff08;多字段匹配&#xff09;1.2.…

信号处理学习——文献精读与code复现之TFN——嵌入时频变换的可解释神经网络(上)

​​​​​​​​​​​​​​TFN: An interpretable neural network with time-frequency transform embedded for intelligent fault diagnosis - ScienceDirecthttps://www.sciencedirect.com/science/article/abs/pii/S0888327023008609?via%3Dihub &#xff08;看看玲娜贝…

Panda3D实战:从入门到精通

Panda3D基础实例 创建一个简单的Panda3D场景,加载一个模型并显示: from direct.showbase.ShowBase import ShowBaseclass MyApp(ShowBase):def __init__(self):ShowBase.__init__(self)self.scene = self.loader.loadModel("models/environment")self.scene.repa…

Galera集群:高可用MySQL同步复制方案

目录 Galera Cluster 概述 核心架构与组件 WSREP API Group Communication System (GCP) 同步复制机制 复制流程详解 冲突检测算法 关键特性 多主架构实现 强一致性保障 自动成员管理 性能优化策略 并行复制实现 流控机制详解 批处理与压缩 部署与监控 详细配…

MybatisPlus-03.快速入门-常用注解

一.MP的原理 mp究竟是如何知道我们需要对哪个表进行操作&#xff0c;并且又是如何知道要操作哪些字段的呢&#xff1f;这是因为mp使用到了反射机制&#xff0c;我们在定义mapper接口时使其继承了BaseMapper接口&#xff0c;并指定了BaseMapper接口泛型为User&#xff0c;因此m…

ABAP+记录一个BDC的BUG修改过程

问题背景&#xff1a; 业务顾问反馈在使用BDC 进行MEQ1进行供应商配额时&#xff0c;由于以前录屏时用例只有3行数据&#xff0c;导致现在有5行数据的时候&#xff0c;代码仍然只获取了3行数据进行录入&#xff0c;现在需要更改代码&#xff0c;使其按照实际情况自动调整行数。…

github上传代码步骤(http)

github上传步骤&#xff08;http&#xff09; 之前github上传不了代码&#xff0c;总是报错。后面发现自己用的ssh上传需要秘钥&#xff0c;现在我介绍一个最简单的http上传方法&#xff08;虽然没有ssh安全。。。但简单嘛~&#xff09;&#xff0c;现在我做个例子&#xff0c…

深入理解Nginx-以实际http通信例子改造带ssl配Nginx的实战-优雅草卓伊凡|麻子

深入理解Nginx-以实际http通信例子改造带ssl配Nginx的实战-优雅草卓伊凡|麻子 SSL/TLS在Nginx中的底层实现原理 Nginx的SSL模块架构 Nginx通过ngx_http_ssl_module模块实现SSL/TLS功能&#xff0c;该模块基于OpenSSL库构建。根据Nginx官方文档&#xff0c;SSL模块在Nginx架构…