精准测试-Vue前端调用链影响变更分析之一

Vue前端调用链影响变更分析之一

一、背景

去年做了Java的后端调用链影响评估,但是随着项目迭代越来越快,评估影响也越来越难以满足用户需求,主要有以下几个原因:

1、项目迭代越来越快,有些项目接口都不测试了,接口影响评估被忽略了,用户更期望接口影响了哪些页面

2、老板更关注页面的交互,测试重心偏向前端的交互

3、前端外放Bug相对于后端Bug多太多了,测试选择性忽略后端的评估影响

快手在MTSC精准测试分享会提过,前端(客户端)的精准测试相较于后端而言,具有更广泛的受益,更值得去研究。从当前的经验来说,前端的精准测试确实更具有性价比。

二、工具调研

公司前端项目主要基于Vue框架进行开发。查阅大量资料后,对于Vue项目,dependency-cruiser这款工具获更被广泛推荐。

1、 工具介绍:

git地址

特性介绍:

1、可以根据自己的规则去匹配生成调用链

2、可以生成调用链图片

3、可以自定义输出生成的结果,比如json,text等

4、支持命令行规划

特性介绍:

1、自定义规则生成调用链:允许用户根据自定义规则,灵活匹配并生成调用链。

2、可视化调用链图片输出:提供直观易懂的调用链图片展示,便于快速理解和分析项目中的依赖关系。

3、多样化输出格式:支持将生成的调用链结果以多种格式输出,包括json、text等,方便用户根据需要进行数据处理和展示。

4、命令行操作支持:提供命令行规划功能,用户可以通过命令行轻松执行调用链的生成和分析操作,也方便后续工具集成。

2、工具使用

切换到项目代码路径下,安装

npm install --save-dev dependency-cruiser
# or
yarn add -D dependency-cruiser
pnpm add -D dependency-cruiser

注意:nodejs版本需要大于等于20

生成配置

npx depcruise --init

生成页面的调用链

npx depcruise src --focus "^src" --output-type text >vue_depency.text

生成结果如下:

src/App.vue → @/composables/useVersionUpdate
src/App.vue → node_modules/ant-design-vue/lib/index.js
src/App.vue → node_modules/ant-design-vue/es/locale/zh_CN.js
src/api/baseConfig.js → @/xhr/index
src/api/clientManagement.js → @/xhr/index
src/api/common.js → @/xhr/index
src/api/cooperateInfo.js → @/xhr/index
src/api/financeProfit.js → @/xhr/index
src/api/financeRules.js → @/xhr/index

查某个组件的调用关系

cat vue_depency.text | grep editGmv.vue
src/screens/newStart/index.vue → @/screens/start/components/detail/editGmv.vue
src/screens/start/components/detail/editGmv.vue → @/api
src/screens/start/components/detail/editGmv.vue → node_modules/ant-design-vue/lib/index.js
src/screens/start/components/detail/editGmv.vue → node_modules/vue/dist/vue.d.mts
src/screens/start/components/detail/top.vue → src/screens/start/components/detail/editGmv.vue

从上面的图可以看到edit编辑组件被index、top组件调用了。->调用

可以加个参数过滤--exclude,node_modules模块的调用关系

npx depcruise src --focus "^src" --exclude node_modules --output-type text >vue_depency.text

三、工具落地集成方案(待后续补充)

1、跟后端一样,构建数据模型,通过neo4j图数据建立全局关系数据库,这样就可以通过模块查询影响的变更模块。

变更影响较为简单的实现

2、通过git diff 变更代码分析出变更文件,直接查询图数据库返回变更的影响模块范围,这个范围就很大。

变更影响较为复杂的实现

3、通过git diff 析出文件具体哪些行号变更,结合AST生成语法树,分析模块的语法数结构,结合变更行号,分析影响到了具体的某个组件。

4、分析样式变更影响范围

5、端到端的影响变更,后端接口可以分析影响变更的接口,通过接口反查页面调用情况,从而分析出接口的影响到的页面。

当然3、4、5下面两种情况实现起来比较复杂,目前还没有好的工具可以解决,期望实现的大佬可以指教下

大概的方案实现如下:

1、全局关系数据库的构建

与后端相似,先构建了数据模型,并利用neo4j图数据库建立了全局关系数据库,通过查询就可以快速识别并定位到变更所影响的模块。

2、变更影响的简单实现

利用git diff分析变更代码,从而识别出发生变更的文件。通过直接查询图数据库,能够迅速获取这些变更文件所影响的模块范围。这种方法较为简单,也容易落地,但所返回的影响模块范围较为宽泛。

3、变更影响的复杂实现

3.1、为了更精确地分析变更影响,需要进一步通过git diff细化到具体变更的行号。结合抽象语法树(AST)生成技术,分析模块的语法数结构,并结合变更行号,精确到具体影响了哪些组件。

3.2、补充样式变更影响范围分析。

3.3、端到端的影响变更,分析后端接口变更对前端页面的影响。通过接口反查页面调用情况,分析出接口变更所影响的页面,从而提供更全面的前后端变更影响分析。

当然,目前第三点的实现,有较大的技术挑战,尚未有成熟的工具能够完美解决,期望有实现的大佬可以分享分享

相关推荐
许野平6 个月前
Rust 程序设计:三层架构的“全局数据”的“依赖注入”设计方法
java·架构·rust·di·依赖注入·injection·dependency