通过自动化单元测试的形式守护系统架构

news2024/11/24 19:53:22

目录

0前言

1 背景

2 为什么选择 Archunit

3 Archunit 是什么

4 引入 Archunit

4.1 开始就是如此简单

4.2 如何组织架构规则

4.3 团队如何规范化


0前言

通过自动化单元测试的形式守护系统架构是一种有效的方式,可以确保系统在不断演进和修改的过程中保持稳定和可靠。

自动化单元测试是指通过编写测试代码来验证系统中的各个单元(如函数、类、模块等)是否按照预期工作。它可以帮助开发人员及时发现和修复代码中的问题,确保系统的各个组件在修改后仍然能够正常工作。

1 背景

随着需求开发迭代,代码库规模逐渐变大,新的团队成员引入等诸多因素,系统起初制定的架构规则不可避免遭到破坏。不仅仅是破坏团队的统一开发规范,更为重要的是随着代码库规模逐渐增长,大大降低系统的可维护性、扩展性,增加评审复杂度和重构成本,也最终导致团队生产力下降以及研发成本增长。

在敏捷开发环境下,系统通过迭代增量的交付价值,系统架构也是如此。团队不可能在项目之初就建立完美的系统架构,系统架构应该随着系统迭代不断演进。

架构演进和架构腐化是看待架构的不同视角:架构腐化着眼于现状,架构演进侧重于未来

架构腐化不可避免,随着时间流转腐化现象必然发生。而我们需要做的是:通过某种方式及早发现和修正

2 为什么选择 Archunit

我们需要通过引入一种机制或技术,降低或及早发现架构腐化现象的发生,保持统一的系统架构约束。

  • 支持架构规则自动化检查
  • 轻量级,接入成本低
  • 结果及时反馈
  • 灵活扩展且扩展成本低

对于架构规则常见的验证方式:代码评审、代码质量分析工具或平台、Archunit

以下对常见的几种方式进行优劣势对比:

代码评审:通过强流程控制代码评审活动发生,增强代码评审的强度和质量

优势

  • 不需要引入额外的技术,没有学习成本
  • 灵活:通过人工评审方式可以覆盖架构约束更全面

劣势

  • 非自动化方式执行,质量靠人工保证,人为因素存在较多不可控因素
  • 代码评审范围越广,人力成本投入则越大
  • 代码评审流程后置,不能及时反馈规则检测结果

代码质量分析工具:比如 Sonar、Checkstyle 等

优势

  • 成熟的工具或平台,内置开箱即用的规则
  • 三方工具支持,不影响代码库结构

劣势

  • 缺少灵活性,架构规则约束支持程度有限,不能很好的解决架构层面规则约束
  • 强调代码质量分析结果,不能有效处理强制规则约束
  • 定制规则有一定成本 (因平台扩展能力而异)

Archunit:通过单元测试形式对架构规则自动化检查

优势

  • 支持丰富的架构约束规则定制能力,例如分层依赖规则、包依赖规则、循环依赖、继承关系约束等
  • 虽然以单测代码方式体现,但不影响主业务开发,可以通过增量方式引入,逐步增强应用的架构约束能力
  • Archunit 提供的 Java 流式 API 易于理解,接入和使用成本低
  • 使用纯 Java 单测框架以单元测试形式自动化执行,及时反馈单测结果

劣势

  • 需要额外编写单元测试代码,增加了一部分工作量
  • 引入了新的类库有一定学习成本

3 Archunit 是什么

ArchUnit 是一款免费、简单可扩展的类库,它可以使用任何 Java 单元测试框架来检查 Java 代码的架构约束。基于 Archunit 我们可以自动化检测:

  • 循环依赖
  • 包的包含关系
  • 类的依赖关系
  • 类和包的包含关系
  • 继承关系
  • 注解

Archunit 和代码质量分析工具的关系如下图所示,二者都可以对代码进行分析,在功能覆盖上存在一定交叉。

Archunit*不能解决所有的架构属性的约束自动化验证*,其主要侧重于系统的演进性、可维护性、可测试性、可解释性等,也可以对耦合度、命名规范等进行验证。

4 引入 Archunit

4.1 开始就是如此简单

使用 Archunit 编写架构规则约束非常简单,其提供了便捷的流式 API,可以快速的构建规则。

示例 1:RULE.01 所有的枚举类必须以 Enum 为后缀

示例 2:对应用分层进行约束校验

在 IDE 下执行 Archiunit 单元测试结果示意如下图所示:

4.2 如何组织架构规则

架构规则组织可以从多个维度,比如:

下图左侧所示:基于逻辑分类对规则进行分组

下图右侧所示:基于职能分类对规则进行分组

4.3 团队如何规范化

团队是否要引入 Archunit 本身也是一项架构决策,建议采用文档化形式对该决策进行记录.

如果团队想要引入 Archunit,从流程化和规范化视角可以基于准备 - 试点 - 优化 - 推广的模式进行实施:

实施准备:

  • 从规范复用的角度考虑,团队需要定义统一的开发规范,包括但不限于编码规范、异常规范、命名规范、依赖规范等等,并在团队内达成一致。建议采用统一的、文档化的形式进行记录 (比如,在线表格系统)。对于每条开发规则建议增加比如 “正例”、“反例”、“规则描述”、“规则详细说明”、“是否可自动实现” 等维度描述信息
  • 基于 Archunit 实现通用架构约束以便在不同项目间进行复用

应用试点:在产品线内部选定一个试点应用

复盘优化:基于试点效果进行复盘,基于团队成员反馈进行架构规则优化、已有规则的修改及废弃等等

推广普及: 基于试点的一些实践在其它应用或业务线进行推广普及

对于遗留系统已经形成了特定的规则 (有可能是已经发生腐化),由于业务系统的持续迭代,在单个迭代完全大规模重构已有系统的可能性不大。所以,建议采增量方式,在迭代研发资源可接受的范围内,逐步引入并丰富架构规则,并对破坏规则的应用代码进行重构。

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实战之数据挖掘详解

一、Python数据挖掘 1.1 数据挖掘是什么? 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过算法,找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言,拥有丰富的数据挖掘库&#…

数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病...

全文链接:http://tecdat.cn/?p23061 这个数据集(查看文末了解数据免费获取方式)可以追溯到1988年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标 "字段是指病人是否有心脏病。它的数值为整数,0无…

盖子的c++小课堂——第二十讲:动态规划

前言 中间呢其实还有两讲,但是那两讲太easy了,根本难不倒你们,所以,我索性不放了~~那我们今天讲一个比较容易的知识点——动态规划(终于没人给我催更了!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈…

IOC控制反转--.net framework

IOC控制反转–.net framework 分层架构: 一、传统依赖倒置实现 传统工艺:会有依赖,上端全部展示细节 BaseBll baseBll new BaseBll(); baseBll.DoSomething();依赖于抽象:左边依赖倒置,面向抽象 实现类继承接口&am…

React18和React16合成事件原理(附图)

💡 React18合成事件的处理原理 “绝对不是”给当前元素基于addEventListener做的事件绑定,React中的合成事件,都是基于“事件委托”处理的! 在React17及以后版本,都是委托给#root这个容器(捕获和冒泡都做了…

动态规划入门第1课

1、从计数到选择 ---- 递推与DP(动态规划) 2、从递归到记忆 ---- 子问题与去重复运算 3、动态规划的要点 第1题 网格路1(grid1) 小x住在左下角(0,0)处,小y在右上角(n,n)处。小x需要通过一段网格路才能到小y家。每次,小x可以选…

视频基础知识

1.视频比特率 视频的比特率是指传输过程中单位时间传输的数据量。可以理解为视频的编码采样率。单位是kbps,即每秒千比特。视频比特率是决定视频清晰度的一个重要指标。比特率越高,视频越清晰,但数据量也会越大。比如一部100分钟的电影&#…

5.4 Bootstrap 下拉菜单(Dropdown)插件

文章目录 Bootstrap 下拉菜单(Dropdown)插件用法在导航栏内在标签页内 选项方法 Bootstrap 下拉菜单(Dropdown)插件 Bootstrap 下拉菜单 这一章讲解了下拉菜单,但是没有涉及到交互部分,本章将具体讲解下拉菜…

(链表) 剑指 Offer 58 - I. 翻转单词顺序 ——【Leetcode每日一题】

❓剑指 Offer 06. 从尾到头打印链表 难度&#xff1a;简单 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1] 限制&#xff1a; 0 < 链…

自己实现数据结构,有更好的可操作性

https://leetcode.cn/problems/asteroid-collision/ 就是说&#xff0c;非得用人家写的栈不可么 stl 的 stack&#xff0c;没办法随机访问&#xff0c;用 vector 或者再不济数组&#xff0c;就好了&#xff0c;非要用 stl 的&#xff0c;就导致还得有另一个 vector 维护向左走…

多目标灰狼算法(MOGWO)的Matlab代码详细注释及难点解释(佳点集改进初始种群的MOGWO)

目录 一、外部种群Archive机制 二、领导者选择机制 三、多目标灰狼算法运行步骤 四、MOGWO的Matlab部分代码详细注释 五、MOGWO算法难点解释 5.1 网格与膨胀因子 5.2 轮盘赌方法选择每个超立方体概率 为了将灰狼算法应用于多目标优化问题,在灰狼算法中引入外部种群Archi…

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)

目录 1. 返回静态页面 2. 返回非静态页面 2.1 ResponseBody 返回页面内容 2.2 RestController ResponseBody Controller 2.3 示例:实现简单计算的功能 3. 返回JSON对象 3.1 实现登录功能&#xff0c;返回 JSON 对象 4. 请求转发(forward)或请求重定向(redirect) 4.1 请…

Day 63 : 集成学习之 AdaBoosting (1. 带权数据集)

63.1 AdaBoosting基本算法&#xff1a;先从初始训练集训练一个弱学习器&#xff0c;在根据弱学习器的表现对训练样本进行权重调整&#xff0c;经过若干轮之后&#xff0c;将得到一组分类器&#xff0c;将数据输入这组分类器后会得到一个综合且准确的的分类结果。“三个臭皮匠&a…

评论管理功能

后端 bp.get("/comment/list") def comment_list():comments CommentModel.query.order_by(CommentModel.create_time.desc()).all()comment_list []for comment in comments:comment_dict comment.to_dict()comment_list.append(comment_dict)return restful.ok…

Python模块requests基本用法

简介 Python 的 requests 模块是一个流行的第三方库&#xff0c;用于发送HTTP请求。它提供了一组简洁且易于使用的API&#xff0c;使得在Python中进行网络通信变得更加简单和灵活。 目录 1. 基本概念 1.1. HTTP 协议 1.2. GET 请求 1.3. POST 请求 1.4. get 和 post 的区别…

uniapp 小程序 评分组件

效果图&#xff1a; 1、组件&#xff1a;starsRating.vue <template><view class"stars"><image click"btnStars1" class"starsicon" :src"starsObject[0]" mode"widthFix"></image><image c…

Stream API将对象中的某一字段取出转换为list或数组

List<DevicePartMaintain> devicePartMaintainList devicePartMaintainMapper.selectDevicePartMaintainByMitId(mitId);所有id转换为List 要使用Stream流获取devicePartMaintainList中所有的id&#xff0c;您可以使用stream()方法将列表转换为流&#xff0c;然后使用…

从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现

目录 1. 红黑树的引入和简介 2. 红黑树的性质和定义 3. 红黑树的插入 3.1 调整情况一 3.2 调整情况二 3.2.1 调整情况二中的单旋变色 3.2.2 调整情况二中的双旋变色 3.3 调整情况三 3.4 红黑树插入完整代码 4. 红黑树的验证和完整代码 4.1 验证是不是搜索树&#xf…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址&#xff1a;torch.nn — PyTorch 2.0 documentation 常用的&#xff1a;Sigmoid、ReLU、LeakyReLU等。 作用&#xff1a;为模型引入非线性特征&#xff0c;这样才能在训练过程中…

【0基础学习python】顺序结构+条件语句+循环结构(文章后面有人生重开模拟器的相关逻辑和简单实现)

1.顺序语句 默认情况下&#xff0c;python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 print(1) print(2) print(3)执行的结果一定为 1 2 3 &#xff0c;而不会出现 3 2 1 或者 1 3 2等&#xff0c;这种按照顺序执行的代码&#xff0c;我们称为顺序语句。 …