前端精准测试调用链路分析

news2024/11/27 4:19:12

      精准测试在评估需求的测试范围时,需要评估一下代码的影响范围,这个范围有两部分:一是需求直接修改的代码;二是修改代码影响到的功能模块。代码影响到的功能一般是通过调用链路分析来实现的,java和kotlin代码可以由java-callgrap来分析出来调用链路,iOS 的OC和Swift可以使用clang来编译生成,前端貌似没有直接可用的工具。

一,技术调研

通过在网上进行不断的搜索和尝试,最终找到如下两个工具:

1,开源工具:dependency-cruiser

1.1 项目地址:GitHub - sverweij/dependency-cruiser: Validate and visualize dependencies. Your rules. JavaScript, TypeScript, CoffeeScript. ES6, CommonJS, AMD.

1.2 使用方法

(1)安装与初始化

在要生成调用关系的项目中,安装dependency-cruiser:

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

再初始化一下项目目录:

npx depcruise --init

(2)生成调用关系数据

  • 生成全项目文件间的调用关系图
src/API/api.ts → src/API/controller/commonCntroller/commonController.ts 

src/API/api.ts → src/API/controller/configurationController/Configuration.ts 

src/API/api.ts → src/API/controller/covController/covController.ts src/API/api.ts → 

src/API/controller/recommendController/recommendController.ts src/API/api.ts → 

src/API/controller/report/report.ts src/router/routes/caseRecommend.ts → 
src/views/CaseRecommend/CaseRecommend.vue 
src/router/routes/caseRecommend.ts → src/views/CaseRecommend/CaseRecommendList/CaseRecommendList.vue 

src/router/routes/caseRecommend.ts → src/views/CaseRecommend/mobileCaseRecommend/mobileCaseRecommend.vue 

src/router/routes/caseRecommend.ts → src/views/Layout/Layout.vue 

src/views/CaseRecommend/CaseRecommend.vue → src/views/CaseRecommend/CaseRecommendRecord/CaseRecommendRecord.vue 

src/views/CaseRecommend/CaseRecommend.vue → src/views/CaseRecommend/SelectSearchModel/SelectSearchModel.vue 

src/views/CaseRecommend/CaseRecommend.vue → node_modules/vue-property-decorator/lib/vue-property-decorator.umd.js 

src/views/CaseRecommend/CaseRecommendRecord/CaseRecommendRecord.vue → src/API/api.ts ......
  • 生成全项目页面间的调用关系文本文件
npx depcruise src --focus "^src" --output-type text >all_pageanlys.text

生成的内容为项目中各个文件间的调用关系,如下所示:

src/API/api.ts → src/API/controller/commonCntroller/commonController.ts 

src/API/api.ts → src/API/controller/configurationController/Configuration.ts 

src/API/api.ts → src/API/controller/covController/covController.ts src/API/api.ts → src/API/controller/recommendController/recommendController.ts 

src/API/api.ts → src/API/controller/report/report.ts 

src/router/routes/caseRecommend.ts → src/views/CaseRecommend/CaseRecommend.vue 

src/router/routes/caseRecommend.ts → src/views/CaseRecommend/CaseRecommendList/CaseRecommendList.vue 

src/router/routes/caseRecommend.ts → src/views/CaseRecommend/mobileCaseRecommend/mobileCaseRecommend.vue 

src/router/routes/caseRecommend.ts → src/views/Layout/Layout.vue 

src/views/CaseRecommend/CaseRecommend.vue → src/views/CaseRecommend/CaseRecommendRecord/CaseRecommendRecord.vue 

src/views/CaseRecommend/CaseRecommend.vue → src/views/CaseRecommend/SelectSearchModel/SelectSearchModel.vue 

src/views/CaseRecommend/CaseRecommend.vue → node_modules/vue-property-decorator/lib/vue-property-decorator.umd.js 

src/views/CaseRecommend/CaseRecommendRecord/CaseRecommendRecord.vue → src/API/api.ts ......
  • 生成指定目录的调用关系
npx depcruise src --focus "^src/views" --output-type text >all_pageanlys.text

2,开源项目:ts-dependency-graph

2.1 开源地址

 URL:GitHub - PSeitz/ts-dependency-graph: prints a dependency graph in dot format for your typescript/react project

安装工具:

npm i ts_dependency_graph -g

2.2 生成调用关系数据

ts_dependency_graph --start apps > all_pagetanlys.txt

生成的数据如下所示:

在文件中有调用关系信息:

apps/quick-process-plus-e2e/src/e2e/app.cy.ts" -> "apps/quick-process-plus-e2e/src/support/app.po.ts" [color = "#F74B5F"] 
"apps/quick-process-plus-e2e/src/support/e2e.ts" -> "apps/quick-process-plus-e2e/src/support/commands.ts" [color = "#8D9B0D"] 
"apps/quick-process-plus/src/components/pc/select/index.ts" -> "apps/quick-process-plus/src/components/pc/select/common-select.tsx" [color = "#8B13D9"] 

"apps/quick-process-plus/src/components/pc/select/index.ts" -> "apps/quick-process-plus/src/components/pc/select/people-select.tsx" [color = "#8B13D9"] 

"apps/quick-process-plus/src/components/pc/select/index.ts" -> "apps/quick-process-plus/src/components/pc/select/dept-select.tsx" [color = "#8B13D9"] 

"apps/quick-process-plus/src/components/pc/select/people-select.tsx" -> "apps/quick-process-plus/src/components/pc/select/common-select.tsx" [color = "#A5F9DE"] 

"apps/quick-process-plus/src/components/pc/select/dept-select.tsx" -> "apps/quick-process-plus/src/components/pc/select/common-select.tsx" [color = "#44A823"] 

"apps/quick-process-plus/src/models/apiManage.ts" -> "apps/quick-process-plus/src/types/apiManage.ts" [color = "#6305F5"] "apps/quick-process-

plus/src/models/app.ts" -> "apps/quick-process-plus/src/models/index.ts" [color = "#42F55F"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-

plus/src/models/user.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/tenant.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-

plus/src/models/auth.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/metadata.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-

process-plus/src/models/app.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/form.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/view.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/flow.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/corporation.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/page.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/formRender.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/formDesign.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/formComponent.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/process.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/target.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/global.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/formula.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/apiManage.ts" [color = "#D4502A"] "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/processManagement.ts" [color = "#D4502A"]

需要使用python文件进行过滤,去掉后面的color信息,最终得到:

"apps/quick-process-plus/src/models/app.ts" -> "apps/quick-process-plus/src/models/index.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/user.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/tenant.ts"
 "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/auth.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/metadata.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/app.ts"
 "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/form.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/view.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/flow.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/corporation.ts"
 "apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/page.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/formRender.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/formDesign.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/formComponent.ts" 
"apps/quick-process-plus/src/models/index.ts" -> "apps/quick-process-plus/src/models/process.ts"

再利用ccg生成调用关系数据。

二,调用关系技术方案

通过上面的两个基础工具,我们可以生成Vue和React项目文件间的调用关系,这个文件是脚本文件和页面问题,没有样式文件,在这些数据基础上,再对文件进行过滤和整理,就能生成符合要求的调用关系数据。

1,调用链路生成方案

整体方案如下:

  • 通过工具生成调用关系数据,过滤相应的文件,如果是页面文件间的调用关系,说明是组件和页面的关系,直接存储;
  • 如果是脚本文件,可以分析脚本文件被调用的页面文件,找出其调用的脚本文件中的函数以及调用行号,生成:脚本文件:函数-->页面文件:[开始行号,结束行号]的调用关系;
  • 如果是样式文件,分析样式文件的被调用页面文件,分析页面文件调用样式文件中的样式函数的行号,生成:样式文件:函数-->页面文件:[开始行号,结束行号]的调用关系;
  • 将上面三种调用关系数据入到CCG中生成调用关系数,并存储到文件中以便后续查询;
  • 根据diff文件,改动的行号等信息,查询CCG文件,生成调用关系数据,存储到数据表中。

主要功能实现介绍:

  • 生成调用关系数据在FEAgent上,下载相应的项目代码,安装工具生成调用关系数据;
  • CCG通过调用FEAgent上的接口,下载调用关系数据,解压数据并生成树型调用关系,保存到pickle文件中;
  • CCG提借查询调用关系的接口,供精准测试平台调用生成调用链路。

2,现存的问题

由于时间原因,上面的调用关系方案,只很简单地实现了文件间的调用关系,存储页面文件间的调用关系,脚本文件与页同文件间的调用关系,而且没有细化到函数级别;主要原因在于:

  • 没有细化脚本文件到页面文件间的,函数与行号的对应关系,这个没有工具直接实现,需要编码进行过滤;
  • 没有生成样式文件到页面文件间的调用关系,因为同级目录下的调用关系可以生成,跨目录的同名文件无法扫描出调用关系;
  • 没有过滤样式文件到页面文件间的函数调用与行号间的关系,功能暂时没有开发。
  • 过滤过细的调用关系,可以在后续推荐中做的更加精细,但也存在着文件过多的时候,性能较慢的问题。
  • 后面看领导的重视程度,再安排细化工作。

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

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

相关文章

小白必看,靠这几步写一份简单的产品说明书!

我们都知道,无论是新产品发布,还是老产品的推广,产品说明书都扮演着至关重要的角色。产品说明书可以帮助用户正确、高效地使用产品,也是传递企业发展理念、展示企业形象的有效途径。但作为一个小白,怎样才能写一份简单…

JSONObject在Android Main方法中无法实例化问题

目录 前言一、Main(非安卓环境)方法下运行二、安卓坏境下运行三、why? 前言 原生的json,即org.json.JSONObject; 在Android Studio中的Main方法里运行报错,但在安卓程序运行过程正常 一、Main(非安卓环境)方法下运行 static void test() {try {// 创建一个 JSON …

动态类型是什么?——跟老吕学Python编程

动态类型是什么?——跟老吕学Python编程 前言动态编程语言动态编程语言特点:动态编程语言的优点:动态编程语言的缺点: 静态编程语言静态编程语言特点:静态编程语言的优点:静态编程语言的缺点: 总…

【Vue3】什么是路由?Vue中的路由基本切换~

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

Linux操作系统-07-Linux安装应用

一、使用rpm安装应用(不推荐) 先下载到本地,以.rpm文件名结尾,下载完成后,再安装 rpm -qa | grep mysql #查询当前系统是否有下载过mysql包 先上传mysql的rpm安装包到linux的opt目录 安装 rpm -ivh …

云游戏发行是什么?云游戏发行的演进历程

云游戏发行是一系列基于云游戏技术的游戏发行策略或行为,融合云试玩、云微端、可玩广告、跨端移植等技术,从而在传统游戏发行生态的基础上实现更为卓越的发行效果。 云游戏发行出现的原因 近年来,游戏市场出现负增长。其原因一方面在于游戏版…

删除数据表

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 删除数据表属于数据库对象的操作 drop table 表名称; 删除 emp30 表 SQL> drop table emp30;表已删除。 上面这个语句运行后,就会把数据表 emp30 删除 在…

AV1:编码块划分

​AV1是AOM于2018年发布的一代视频编码标准,相比于VP9其编码效率提升30%,相对于H.26X系列标准,AV1完全免去专利费可以自由使用。 AV1和其他视频编码标准类似,也采用基于块的编码架构。当编码器读进一帧图像,首先将其划…

Vue 3中的provide和inject:跨组件通信的新方式

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【linux】冯诺依曼体系与操作系统的理解

本篇文章是进程的预备知识,但也不仅仅是进程的预备知识, 也可以更好地帮助我们理解整个计算机体系。 目录 冯诺依曼体系结构:进一步理解操作系统: 冯诺依曼体系结构: 关于这张图先进行一下必要的解释: 输…

【清晰易懂】@Mapper注解和BaseMapper爱恨情仇

此问题的提出在于自己没有弄明白一个问题,就是Mapper注解有时候可以不加,有时候又需要加。 先说结论:Mapper注解和BaseMapper类在项目中起着相同的作用,都是为了实现数据库基本简单的CRUD,省去在xml文件中再去写&#…

java八股文复习----java集合,CAS---2024/03/12

1.java常见的集合类 2.List,Set,Map的区别 3.上述三个集合有哪些常用的方法 4.List,Set,Map哪几个是线程安全的? 5.ArrayList和LinkedList的区别 6.ArrayList和Vector的区别 7.ArrayList的扩容机制 8.HashMap集合 8.1数据结构 8.2哈希冲突的解决办法有哪…

Conmi遇到的坑——禅道的PCDN

好家伙,悄悄在后台吃了七十多G流量,我把你当兄弟宣传,你把我当PCDN吸。 还纳闷今天创建个VUE项目怎么提示D盘没空间,明明留了几十G,好家伙,一下子全吸干了。 删了两个,还有一个(已…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第二周:神经网络的编程基础 (Basics of Neural Network programming)2.5 导数(Derivatives) 第一门课:神经网络和深度学习 (Neural Networks an…

PNG图片合成,带手机外观设置,可自定义金额等

PNG图片合成,带手机外观设置,可自定义金额等 软件界面成品显示免责声明 软件界面 成品显示 免责声明 若因使用代码与官方造成不必要的纠纷,本人盖不负责,存粹技术爱好,若侵犯贵公司的权益,请告知&#xff…

美团2025春招第一次笔试题

第四题 题目描述 塔子哥拿到了一个大小为的数组,她希望删除一个区间后,使得剩余所有元素的乘积未尾至少有k个0。塔子哥想知道,一共有多少种不同的删除方案? 输入描述 第一行输入两个正整数 n,k 第二行输入n个正整数 a_i,代表…

教你用两种方式遍历循环python中的字典

开发中经常会用到对于字典、列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式。 注意: python2和python3中,下面两种方法都是通用的。 1. 只对键的…

电机特性学习

电机特性 电机堵转: 电机堵转的原理 玻璃升降器: 工作电压 升降器在 9V~16V 电压下应运行平稳,不允许有异音和卡滞现象。 工作电流 升降器的工作电流不大于 12A,堵转电流不大于 28A。 堵转 力 升降器 堵转 力应 不小于 212N。 玻璃升降器结构 电动车窗…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的日常场景下的人脸检测系统(附完整资源+PySide6界面+训练代码)

摘要:开发用于日常环境中的人脸识别系统对增强安全监测和提供定制化服务极为关键。本篇文章详细描述了运用深度学习技术开发人脸识别系统的全过程,并附上了完整的代码。该系统搭建在强大的YOLOv8算法之上,并通过与YOLOv7、YOLOv6、YOLOv5的性…

【数据结构】初识二叉搜索树(Binary Search Tree)

文章目录 1. 二叉搜索树的概念2. 二叉搜索树的操作1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树,它可能是一棵空树,也可能是具有以下性质的二叉树: 若它的左子树不为空&am…