首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ArchUnit,架构守护神 | 雷达哔哔哔

雷达描述: ArchUnit是一个基于 Java 的测试库,用于检查代码的结构特性,包和类的依赖关系、注解验证,甚至还能检查代码分层是否一致。...位置 2018年11月第19期技术雷达(11.14正式发布,文末可订阅),工具象限,建议试验 目标受众: 系统架构师,技术管理者,开发人员 关注问题: 如何在Java系统架构下,应用架构适应度函数(...如何在Java系统架构下,做系统演进后架构守护,减缓系统再次腐化?...ArchUnit是用来检查架构特征的Java测试库,比如包与类的依赖关系、注解、甚至是调用层级一致性。它可以附加在现有的测试方案中,以单元测试的方式运行,但目前只能用于Java架构。...但是能否正确地使用这种能力通过Fitness Function和演进式架构来促进架构对于业务的匹配度和适应度;还是截然相反的错误地滥用这种能力成为所谓的管理手段或是技术上的噱头,最终导致系统架构僵化,无法支撑业务需要

2.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

项目架构级别规约框架Archunit调研

简介 Archunit是一个免费、简单、可扩展的类库,用于检查Java代码的体系结构。提供检查包和类的依赖关系、调用层次和切面的依赖关系、循环依赖检查等其他功能。...更多内建的ArchRule或者通用的内置规则使用,可以参考官方例子。 基本使用例子 基本使用例子,主要从一些常见的编码规范或者项目规范编写规则对项目所有类进行检查。 包依赖关系检查 ?...", "..com.foo.."); 类依赖关系检查 ?...此外ArchUnit扩展一些API用于描述依赖代码之间关系,例如JavaMethodCall, JavaConstructorCall或JavaFieldAccess。...还提供了例如Java类与其他Java类之间的导入访问关系的APIJavaClass#getAccessesFromSelf()。

85610

代码检查又一利器:ArchUnit

人们常说“见字面”。我认为代码也是一样,看到一个人的代码,就会对这个人有一个大概的印象。...事实上现在也有很多公司实现了自动化,例如自动进行静态代码分析来确保代码质量,利用类似Cobertura这样的工具来检查单元测试覆盖程度等等。但是这并不能完全保证代码的整洁性和可靠性。...在介绍之前,我们先来想一想我们平时在Review别人代码可能会注意哪些问题。...ArchUnit的简单绝对不是空谈,如果你是maven项目,只需要在pom.xml文件中添加如下依赖: com.tngtech.archunit 如果你是Gradle项目,使用起来同样非常简单 dependencies { testCompile 'com.tngtech.archunit:archunit:0.8.0' } 当你添加了依赖以后

67010

“分布式” 开发规范治理​

多年前,对于软件开发的规范,我们主要依赖于口头约定 + code review,这依赖于团队拥有比较好的技术能力。应对于规模化时,这样的模式是无法实施的。...为了应对于这种变化,我们还需要一些额外的工具,以确保这些规范化的工具能被安装和使用。 在那之前,让我们先总结一下规范工具化的时机,以明确我们应该在哪个时机来应对分布式下的挑战。...分布式场景下的规范 现在,让我们回到先前我们定义的分布式场景,思考一下如何在这种场景下,构建规范工具化?...使用额外的代码模块( Git Submodule、软件包等)来执行规范的自动化,诸如于 npm 包、jar 包的形式。 工具检查器。检查是否安装了对应的工具,是否执行了对应的步骤。... Guarding 这种模式。 设计成熟度指标。用于指导和改善系统的架构设计。 去年,在设计 Guarding 这个多语言的架构守护工具,其与 ArchUnit 相比的场景是:多语言、多代码库。

76210

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

:通过单元测试形式对架构规则自动化检查 【优势】 支持丰富的架构约束规则定制能力,例如分层依赖规则、包依赖规则、循环依赖、继承关系约束等 虽然以单测代码方式体现,但不影响主业务开发,可以通过增量方式引入...,逐步增强应用的架构约束能力 Archunit 提供的 Java 流式API 易于理解,接入和使用成本低 使用纯Java单测框架以单元测试形式自动化执行,及时反馈单测结果 【劣势】 需要额外编写单元测试代码...Archunit是一款免费、简单可扩展的类库,它可以使用任何Java单元测试框架来检查Java代码的架构约束。...基于Archunit可以自动化检测: 循环依赖 包的包含关系 类的依赖关系 类和包的包含关系 继承关系 注解 Archunit和代码质量分析工具的关系如下图所示,二者都可以对代码进行分析,在功能覆盖上存在一定交叉...,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目 4.1 开始就是如此简单 使用Archunit编写架构规则约束非常简单,其提供了便捷的流式API

19820

Java 近期新闻:OmniFish 简介、Oracle 加入 Micronaut 基金会、OpenJDK 升级

在通往 Spring Batch 5.0.0 的道路上,第 7 个里程碑版本发布,主要特性包括:支持使用任何类型作为作业参数;改进作业参数转换。要了解关于这个版本的更多细节,请查看发布说明。...自 2020 年以来,Oracle 一直在为 Micronaut 项目提供开源贡献, Micronaut AOT 和 Micronaut Serialization。...Apache 软件基金会 Apache Tomcat 9.0.68 发布,其中包含一些值得注意的 Bug 修复,例如:破坏 JSP includes 的重构回归;使用 HTTP/2 和 NIO2 过程中客户端断开连接出现的意外超时...ArchUnit TNG 科技咨询公司发布了 ArchUnit 1.0.0 版本,这是一个可扩展的开源库,用于检查 Java 代码的架构,检查包和类、层和片之间的依赖关系,并检查循环依赖关系。...该版本带来了多项增强,包括:不再将 archunit_ignore_patterns.txt 文件中定义的忽略规则与 FreezingArchRule 类一起填充 ViolationStore 接口的实例

1.6K30

持续测试的重要性

针对与性能有关的需求编写用户故事,验收标准需明确给出性能指标,并要求团队成员在完成该用户故事,必须编写对应的性能测试。...比之于厚厚一叠超过400多页圣经一般的需求规格说明书,这些验收测试更加真实,也更加准确。...运行这些测试也能帮助我们发现已有代码与文档的不一致,也可以帮助我们更好地探测源代码在运行时的调用关系,尤其针对消息驱动的分布式系统,价值更为明显。...03 包的依赖检查 在为中国香港一家客户提供架构评审咨询,我引入了ArchUnit工具,它支持我们以编写单元测试的方式对系统的架构指标——包的依赖关系——进行检查: 使用该工具非常方便,直接在maven...加入它的依赖,之后就可以像编写单元测试那样调用ArchUnit的API对包的依赖关系进行检查。

45820

代码分析与自动化重构工具集:Modernizing

既然要用自己的时间来开发,还和项目没有关系,这种用爱发电的事情,用开源的方式最合适了。 我们需要怎样的工具? 从对于使用工具的结果来看,我们需要这个现代化工具是: 可视化驱动。...可视化依赖针对于代码中的类、包等的依赖情况进行可视化,主要用于分析分层架构等。常用的工具有:PlantUML、Graphviz、D3.js、Echarts 等。 代码属性可视化。...架构守护 编写架构的守护规则,以对于系统的架构进行守护,用的工具有:ArchUnit、ArchGuard 等。...在参考了 ArchUnit 的语法之后,我们也设计了一个多语言的架构守护工具:Guarding。...针对于 MySQL 代码进行自动化分析,并从中构建中 UML,并生成其关系的:SQLing,Go 语言,使用 PingCap 的 SQL 解析器解析。

1.3K30

Guarding:开源的多语言架构守护工具

ArchUnit 的启发,借助于易于理解的 DSL,来编写守护规则。支持 Windows、macOS、GNU/Linux 系统。...::function.name contains(""); 从上面的示例里,你可以发现 : 如果你熟悉 ArchUnit 的话,就能很快的上手 Guarding 的编写。...我短暂的评估过采用 LSP (Language Server Protocol )的方式,但是使用 LSP 意味着:引入更多的语言相关的依赖。所以,依旧是不可行的路线。...包路径解析 值得一提的是包路径解析,所以我们的包解析方式参考的是 ArchUnit 的设计方式。...其次,我们采用的是 CLI 方式,因此可以在任何阶段中采用,: 在本地结合 Git Hook 进行代码预提交检查。 在持续集成阶段,配合流水线工作使用

76520

架构即代码:编码下一代企业(应用)架构体系

设计和实现一个领域特定语言并不难,《领域特定语言设计技巧》一文中所描述的过程,在这个上下文之下就是: 定义呈现模式。寻找适合于呈现架构的方式, UML 图、依赖图、时序图等。 提炼领域特定名词。...一系列的架构相关元素,架构风格:微内核等、架构分层:MVC 等。 设计关联关系与语法。如何以自然的方式来关联这些架构元素,关键词、解析占位符等。 实现语法解析。...但是,这个分层是不是诸如于 “Interface 层依赖于 application、domain、infrastructure 层” 等一系列的依赖关系?开发人员是否知道这些规则?这些都是问题。...诸如于,我们应该将分层中的依赖关系,显式地声明写出来: layered {prefixId("org.archguard")component("interface") dependentOn component...当我们尝试使用大数据的思路, MapReduce、Streaming Analysis 相关的模式来解决相关的问题,发现它是可以 work 的不错的 —— 毕竟都是数据分析。

52340

编码数据集生成框架 UnitGen 0.4.0:代码文档生成、测试代码生成

即由于不同语言的语法差异,文档位置、数据 + 行为实现方式,我们需要根据需要做一些差异化的实现。 基于 ArchGuard 的质量检查。...UnitGen 测试数据集生成 由于 AutoDev 支持的是整个测试文件的生成,因此在生成测试要考虑到测试框架和技术框对于项目的影响,所以还需要读取项目的依赖信息。...在实现上,我们需要分析出项目的依赖文件、依赖信息,并尝试给出主要的框架。...而正好我们在 Chapi 中实现了对应的 CG 静态分析,所以可以直接遍历 Function 的 FunctionCalls 就能实现上述的功能。...其它 在外部测试,我们使用了 ThoughtWorks 开源项目作为核心,并结合一些框架的官方 examples,诸如 Spring Data Examples, ArchUnit Examples,

15810

如何设计领域特定语言,实现终极业务抽象?

呈现模式 如下是常见的的领域特定语言的使用模式 [wiki_dsl]: 独立的工具, Makefile 在编译时或实时转换为宿主语言 嵌入式领域特定语言 …… 可以参见维基百科,我就不再去翻译了。...如下是我在设计 Guarding DSL ,从 ArchUnit 提取的一小部分关键信息: package: dependOn class: implement annotation...在设计领域特定语言,我们主要以实现领域中的用例作为目标: 使用 DSL 描述一个用例 先不考虑语法实现,实现大部分用例的 DSL 草稿版本 对齐不同用例 DSL 中的差异 考虑一些非常规的用例,添加额外的属性...在特定的领域里,都会使用特定的词汇来描述相关之间的关系。这个关系,便是我们设计语法的一个关键。 如在 Java 语言里,使用: implement、 extends 来表示两个类之间的关系。...这一部分的过程,和我们学习编译原理基本是一致的。不过呢,在编写领域特定语言的时候,我们一般会使用解析器生成器,而不是手写解析器。

1.3K52

通过NPM生态系统中的依赖树揭开脆弱性传播及其演化的神秘面纱

之前的工作已经调查了整个NPM生态系统的脆弱性影响,而他们的方法要么只是静态地考虑直接依赖性,或者基于依赖关系进行间接依赖的可达性分析,这可能会引入不准确的传递依赖关系,从而导致误报漏洞警告。...尽管一些现有的SCA工具(Snyk和Blackduck)支持对用户项目进行NPM依赖性分析,但大多数工具都是从实际安装中检索依赖树,而不是从静态推理中检索依赖树。...因此,尽管现有工作也调查了漏洞的影响,在没有静态和精确的依赖关系解决方案的情况下,大规模分析依赖关系中存在的漏洞传播的演变仍然是一个挑战,更不用说在防止漏洞动态引入依赖项方面获得实用的解决方案。...漏洞如何通过依赖关系树传播影响根包(root packages)? 漏洞传播如何在依赖树中发展?依赖关系树的变化如何影响漏洞传播的演变?...第三,我们无法区分包含缺失依赖项的安装,这可能会使基本事实不准确,我们只接受依赖项中成功安装的包作为验证中的基本事实。第四,由于计算成本过高,在分析漏洞传播,我们忽略了具有超过1k条漏洞路径的版本。

62220

Make

makefile定义了模块间的依赖关系,指定文件的编译顺序,以及编译所使用的命令。有了make和Makefile文件,整个项目的源程序可以自动编译,极大的提高了软件开发效率。...显式规则:一条显式规则指名了目标文件、目标文件的依赖关系、命令。有些规则没有命令,只是说明文件之间的依赖关系。 隐含规则:由make根据目标文件而自动推导出的规则。....SUFFIXES:该目标的依赖被认为是一个后缀列表,在检查后缀规则使用。 .SILENT:生成该目标文件的依赖文件所执行的命令都不被打印,如果其后无依赖文件,则所有的命令都不会被打印。...$%:当规则中的目标文件是一个静态库文件,$%就代表静态库的一个成员名。如果目标不是静态库文件,则该变量 值为空。 $:当规则是一个静态库文件,该变量表示静态库名。 $?:所有比目标文件新的依赖文件列表,以空格分隔。如果目标是静态库文件,该变量代表的是 库成员。

1.9K100

webpack实战——一切皆模块

本系列前几篇: •打包第一个应用•模块化与模块打包•资源输入与输出 一切皆模块 一个web工程通常会包含一系列的静态资源,并且这些资源一般会存在某种相互依赖关系。...但是对于webpack来说,这些静态资源却都是模块,我们可以像加载一个JS模块一样去加载它们,: // main.js import '@/reset.css' 如果经常使用vue\react等单页面框架去构建项目的一定会非常熟悉这种写法...,但如果没接触过的也一定会感觉这种写法比较新奇,甚至迷惑不解:从JS中加载CSS的意义何在呢?...可以画出依赖图便于理解: •先看一般情况下的流程: ? 一般情况 •接下来看使用webpack: ?...但在使用 webpack 的情况下,可以看到,button 模块被作为一个整体被引入进来,这样不仅可以直观且请清晰的看到依赖关系(JS和SCSS被作为一个整体引入到page/index.js),而且在进行组件的引入与删除

1.1K40

前端老手 10 年心得,JavaScriptTypeScript 项目保养实用指南

当我们的用户遵循“快乐路径(happy path)”,这些错误似乎无关紧要,因为软件似乎能够按照预期运行。所以,我们可能会使用@ts-ignore、any或类型断言来暂时忽略它们。...而是要使用这种代码块来处理外部系统的预期错误(输入 / 输出异常、校验、环境问题等)。在开发过程中,应使用静态代码分析和单元测试来捕获编程错误。 不要让带有警告和类型错误的代码进入生产环境。...警告也可能来自其他工具:依赖安装器(npm和yarn)、打包器(webpack)、代码处理器(babel、scss)和执行环境(CI 运行器)。不要忽视它们!...为了实现这一点,他们在配置静态代码分析工具( ESLint 和 TypeScript)采用比代码库的其他部分更严格的规则,并针对专门为该特性而创建的目录使用覆盖的方式启用更多的规则。...无论是哪种情况,开发人员都需要以下信息:问题是什么、问题的具体表现(错误信息)、如何重现问题(环境 + 过程),以及用户的初衷和期望是什么。 但是,如何在最糟糕的情况下获得这些数据呢?

14110

UML图的依赖、关联、聚合、组合关系(突击软考)

关系 解释 符号 依赖 A对象中使用了B对象,那么A对象就堆B对象产生了依赖。 关联 A对象使用了B对象作为,B对象也使用了A对象就是关联。...说明的是谁要使用系统,以及他们使用该系统可以做些什么。一个用例图包含了多个模型元素,系统、参与者和用例,并且显示了这些元素之间的各种关系泛化、关联和依赖。...2、类图     类图是描述系统中的类,以及各个类之间的关系静态视图。能够让我们在正确编写代码以前对系统有一个全面的认识。类图是一种模型类型,确切的说,是一种静态模型类型。...顺序图将显示的重点放在消息序列上,即强调消息是如何在对象之间被发送和接收的。 7、协作图     和序列图相似,显示对象间的动态合作关系。...如果强调时间和顺序,则使用序列图;如果强调上下级关系,则选择协作图;这两种图合称为交互图。 8、构件图 (组件图)     描述代码构件的物理结构以及各种构建之间的依赖关系

90510

TFT:一种可以解释时间序列预测结果的深度学习模型

然而,这些通常不考虑多层面预测中普遍存在的不同输入,或者假设所有外生输入 未来已知或忽略重要的静态协变量。...从观察到的和已知的变输入中学习长期和短期时间关系的时间处理。序列到序列采用层用于本地处理,因为它具有用于订购信息处理归纳偏置是有益的,而长期依赖使用新颖的可解释的多头关注块捕获。...例如,静态变量的最大权重是特定的商店和商品,而未来变量的最大权重是促销期和国定假日(如下所示)。 持久时间模式 可视化持久时间模式有助于理解给定数据集中存在的时间依赖关系。...上面显示了随时间变化的注意力权重模式,表明 TFT 如何在没有任何硬编码的情况下学习持久的时间模式。这种能力有助于与用户建立信任,因为输出确认了预期的已知模式。...我们使用阈值来表示重要事件,紫色突出显示。

3.3K20
领券