(二)kityMinder如何快速展示所有未执行/未通过的用例

2023-11-06 12:20

本文主要是介绍(二)kityMinder如何快速展示所有未执行/未通过的用例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文章系列将会记录在做kityminder二次开发过程中,遇到的问题以及解决方法

有同事反馈在测试用例的任务执行过程中,有的时候会遗漏掉几个用例没有执行,但是找了半天就是找不到在哪里。所以希望能够有一个功能支持快速的过滤(收缩)不需要的用例,保留需要的用例内容。

思考

这个时候考虑的就是类似于脑图展开的功能,能够快速的展开一级菜单/二级菜单,所以我们需要做的就是当用户点击仅未执行用例时,将其他成功,失败等的用例进行收起,仅展开未执行的用例即可,类似于下图:

在这里插入图片描述

上图我们就是点击了上面的阻塞,就会将其他节点收起,只展开阻塞部分的用例内容。

那整体的流程应该是怎么样的呢? 因为考虑到这个是一个协同编辑情况,所以最好的方式就是直接通过服务端计算出从当前的脑图数据到过滤后的脑图数据的diff , 然后将patch 的数据分发给各个端即可。

所以我们的流程大致如下:

在这里插入图片描述

这个逻辑理论上看上去 其实很ok,没啥问题,并且在本地环境测试了下也是一切良好。

结果上线以后就翻车了,在数据量比较大的时候,一旦进行数据过滤时前端就会load上很久,而且数据量越大,整个浏览器就会相当于卡死的状态。

通过排查发现,后台在计算diff这块的耗时基本可以忽略不计了,所以问题所在的地方其实就是patch的逻辑上了,我们需要去看下 patch

applyPatch 的逻辑中涉及到了 minder.layout(); 这其实是一个很重的动作,然而我们patches数据对象是是非常大的,这种导致了 applyPatch 就会非常的久了。

正在一筹莫展之时,突然想起其实我们本身脑图里面也有同时收起/展开节点的功能。 如下图:

所以立马去了解了下本身这块的逻辑的实现。

/*** @command ExpandToLevel* @description 展开脑图到指定的层级* @param {number} level 指定展开到的层级,最少值为 1。* @state*   0: 一直可用*/
var ExpandToLevelCommand = kity.createClass('ExpandToLevelCommand', {base: Command,execute: function (km, level) {km.getRoot().traverse(function (node) {if (node.getLevel() < level) node.expand();if (node.getLevel() == level && !node.isLeaf()) node.collapse();});km.refresh(100);},enableReadOnly: true
});

这里我们就恍然大悟了,涉及到这块的逻辑,其实都是在前端自己本身处理,然后直接到minder中,这里并没有用到patch的逻辑。

解决

所以下来的操作也就比较简单了,就是把原本属于后台的逻辑改到由脑图的前端去完成这块的逻辑处理。

我们自定义了一个minder的过滤节点命令来做这块的逻辑。 这里就直接贴了代码了。

expand.js

var FilterNodeCommand = kity.createClass("FilterNodeCommand", {base: Command,execute: function (km, progress) {// // 更新节点的展开状态function updateNodeExpandState(node, state) {if (!(state === STATE_EXPAND && typeof (node.getData(EXPAND_STATE_DATA)) === 'undefined')) {node.setData(EXPAND_STATE_DATA, state);}}// /**//  * 扩展节点//  * @param {*} node //  */function expandNode(node) {updateNodeExpandState(node, STATE_EXPAND);for (var i =0; i<node.getChildren().length; i++) {expandNode(node.getChildren()[i]);}}// /**//  * 是否需要展开//  * @param {*} node //  * @param {*} progress //  * @returns //  */function isNeedExpand(node, progress) {var data = node.getData();if (typeof (data[PROGRESS_DATA]) === 'undefined') {if (node.getChildren().length === 0) {return progress == DEFAULT_VALUE;} else {var isNeedExpandFlag = false;for (var i =0; i<node.getChildren().length; i++) {if (isNeedExpand(node.getChildren()[i], progress)) {updateNodeExpandState(node.getChildren()[i], STATE_EXPAND);if (!isNeedExpandFlag) {isNeedExpandFlag = true;}}}if (isNeedExpandFlag) {return true;} else {updateNodeExpandState(node, STATE_COLLAPSE);}}} else if (data[PROGRESS_DATA] === progress) {expandNode(node);return true;} else {updateNodeExpandState(node, STATE_COLLAPSE);return false;}}var rootNode = km.getRoot();isNeedExpand(rootNode, progress);// 根节点一定要设置为展开的状态rootNode.setData(EXPAND_STATE_DATA, STATE_EXPAND);km.refresh(100);},enableReadOnly: true
})

这篇关于(二)kityMinder如何快速展示所有未执行/未通过的用例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/356592

相关文章

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使