Flutter UT太多导致跑覆盖率报错

文章目录

    • 前言
    • 单个test可以过但是一起不行
    • UT能跑过但是覆盖率失败
    • 一些简单常用小脚本
    • end

前言

在Flutter项目中,跑单元测试或者单元测试覆盖率时,多多少少会遇到一些稀奇古怪的问题,比如单个能跑过,一起就跑不过,单元测试能跑过但是单元测试的覆盖率无法跑过,测试卡住等问题,以下分享下自己写单元测试的一些经验

单个test可以过但是一起不行

这个场景其实是在测试中最常见的,一般就是test之间项目影响,解决该类问题一般:

  • 在test之间添加group ,这样可以很好的做到测试之间的隔离
  • 可以在每个测试的 setUp 方法中初始化状态,或使用 tearDown 方法重置状态,这个可以很好的做到测试之间隔离
  • 对于一些异步操作可以使用 expectLatercompletes 等工具来处理异步测试

UT能跑过但是覆盖率失败

这个问题比较刁钻自己也在GitHub上看到大家给flutter官方留言了,目前并没有什么好的解决方案。对于大量跑单元测试覆盖率,会出现这种情况,正好我们项目的单元测试数量巨大,最后自己想到的解决方案是:

借助脚本,将项目代码分成多个模块去跑UT,并生成对应的覆盖率文件
然后将多个覆盖率文件合并,得到最终的项目UT 覆盖率,脚本代码如下:

#!/bin/bash# 定义项目根目录和覆盖率文件目录
PROJECT_ROOT=$(pwd)
COVERAGE_DIR="${PROJECT_ROOT}/coverage"# 创建覆盖率文件目录
mkdir -p "${COVERAGE_DIR}"# 定义模块目录数组
MODULES=("module1" "module2" "module3")# 循环运行每个模块的测试并生成覆盖率文件
for MODULE in "${MODULES[@]}"
docd "${PROJECT_ROOT}/test/${MODULE}"flutter test --coveragecp coverage/lcov.info "${COVERAGE_DIR}/${MODULE}.lcov.info"
done# 合并覆盖率文件
cd "${COVERAGE_DIR}"
lcov -a module1.lcov.info -a module2.lcov.info -a module3.lcov.info -o merged.lcov.info# 生成 HTML 覆盖率报告
genhtml merged.lcov.info -o coverage_reportecho "覆盖率报告已生成在 ${COVERAGE_DIR}/coverage_report"

脚本执行

chmod +x coverage.sh
./coverage.sh

以上脚本便可以解决,UT文件太多,跑失败的问题。

一些简单常用小脚本

copy文件到另一个路径

cp ".git/hooks/aaaa" ".git/hooks/bbb"

判断flutter unit test 是否全部运行成功

# 执行flutter text,并将日志写入flutter_test.txt 中
flutter test | tee flutter_test.txt# 如果有失败则退出并文案提示
FIND_FILE="./flutter_test.txt"
FIND_STR="All tests passed"
if [ `grep -c "$FIND_STR" $FIND_FILE` -ne '0' ];thenecho "所有UT都run成功"
elseecho "存在UT报错退出执行"exit 1
fi

批量重命名文件
这个脚本可以将指定目录下的所有 .txt 文件重命名为 .doc 扩展名

#!/bin/bashfor file in *.txt; domv "$file" "${file%.txt}.doc"
done

文件备份
将指定文件夹压缩并备份到一个指定目录

#!/bin/bashSOURCE_DIR="/path/to/source"
BACKUP_DIR="/path/to/backup"
BACKUP_FILE="$BACKUP_DIR/backup-$(date +%Y%m%d).tar.gz"tar -czf $BACKUP_FILE $SOURCE_DIRecho "Backup completed: $BACKUP_FILE"

检查网络连接
这个脚本通过 ping 测试来检查网络连接状态。

#!/bin/bashHOST="google.com"if ping -c 1 $HOST &> /dev/null; thenecho "Network is up"
elseecho "Network is down"
fi

批量替换文件内容
这个脚本在指定目录下的所有 .txt 文件中替换文本,将oldtext替换成功newtext

#!/bin/bashfor file in *.txt; dosed -i 's/oldtext/newtext/g' "$file"
done

批量更新Flutter项目的全部yaml 文件依赖
对于一些flutter项目中会有很多子模块,这个脚本会实现同时更新module下的所有子模块依赖

#!/bin/bash# 查找所有的 'pubspec.yaml' 文件,排除 'example' 目录中的文件
YAMLDIR=$(find . -path "*/example/*"  -prune -o -name 'pubspec.yaml' -print)# 用于存储 'flutter pub upgrade' 命令的进程ID的数组
pubgetPids=()# 遍历找到的每个 'pubspec.yaml' 文件
for yaml in $YAMLDIR
do# 获取当前 'pubspec.yaml' 文件的目录dir=$(dirname $yaml)# 切换到该目录并在后台运行 'flutter pub upgrade' 命令eval "cd $dir; flutter pub upgrade"&# 存储 'flutter pub upgrade' 命令的进程IDpubgetPids+=($!)# 打印消息,指示当前目录的依赖项更新开始echo "开始更新所有依赖$dir"
done# 等待所有 'flutter pub upgrade' 命令完成
for pid in "${pubgetPids[@]}"; dowait $pid
done# 打印消息,指示所有依赖项更新操作已完成
echo "所有依赖更新操作都执行完毕"

end

日常开发中其实借助脚本工作效率会高很多,对于一些重复或者经常使用的方法可以尝试通过脚本来做,这样会事半功倍。

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

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

相关文章

如何查看局域网内的浏览记录?总结五种方法,按步操作!一学就会!「管理小白须知」

如何查看局域网内的浏览记录? 你是否也曾为如何有效监控局域网内的浏览记录而苦恼? 监控局域网内电脑的浏览记录是确保员工工作效率、维护网络安全以及规范上网行为的重要手段。 别担心,今天我们就来聊聊这个话题,为你揭秘五种简…

5本地方法接口本地方法栈

什么是本地方法? 简单地讲,一个 Native Method 是一个 Java 调用非 Java 代码的接囗 在定义一个 native method 时,并不提供实现体(有些像定义一个 Java interface),因为其实现体是由非 java 语言在外面实…

飞书 富文本(Markdown)

飞书机器人webhook支持Markdown格式,包括表格 表格 |Syntax | Description |\n|-------- | -------- |\n|Header | Title |\n|Paragraph | Text |参考 富文本(Markdown)

Django Admin

Django Admin模块是Django框架提供的一个功能强大且易于使用的后台管理工具,它允许开发者通过Web界面来管理网站的后台数据和功能。 主要功能和特点 自动生成管理界面:Django Admin模块可以根据模型类(Model)自动创建表单和列表视…

金华迪加现场大屏互动系统 mobile.do.php 任意文件上传漏洞复现

0x01 产品描述: ‌ 金华迪加现场大屏互动系统‌是由金华迪加网络科技有限公司开发的一款专注于增强活动现场互动性的系统。该系统设计用于提供高质量的现场互动体验,支持各种大型活动,如企业年会、产品发布会、展览展示等。其主要功能包…

中小企业项目管理软件选择指南:最适合你的工具是什么?

选择适合小团队的项目管理工具时,关键是要根据团队规模、工作流程、预算和功能需求来决定。对于小团队,通常需要简洁、易用、低成本的工具,同时能支持任务分配、进度跟踪、文件共享等基本功能。以下是一些适合小团队使用的免费和开源项目管理…

【C++】C++的单例模式、跟踪内存分配的简单方法

二十四、C的单例模式、跟踪内存分配的简单方法 1、C的单例模式 本小标题不是讨论C的语言特性,而是一种设计模式,用于确保一个类在任何情况下都只有一个实例,并提供一个全局访问点来获取这个实例。即C的单例模式。这种模式常用于资源管理&…

VMware的三种网卡模式

VMware的三种网卡模式 1 桥接模式 虚拟机当作一台物理机,直接连接你物理机所连接的路由器 物理机的网段与虚拟机的网段是一致的,并且该网络下的其他主机可以访问你的虚拟机 2 NAT模式 相当于在你的物理机里接了一个路由器,路由器下游接的是虚拟机 物理机的网段与虚拟机的网段是…

办公类提示词(上)——工作计划、工作总结、讲话稿等

什么是提示词? 提示词的英文是Prompt,是你与人工智能(AI)进行交流的方式。简单来说,提示词就是你给AI的一段文字或问题,AI根据这段文字或问题来生成回应或完成任务。 举个例子:假设你在使用一…

plt中subplot综合实战

目录 背景介绍实战 背景介绍 下面是一份贸易数据(Prod_Trade.xlsx),需要多角度针对2012年数据进行报表分析,需使用subplot分格展示。Prod_Trade的数据结构包括 Date,Order_Class,Sales Transport,Trans_Cost, Region ,Category, …

Matlab 基于声学超表面的深亚波长厚度完美吸收体

传统吸声器的结构厚度与工作波长相当,这在低频范围的实际应用中造成了很大的障碍。我们提出了一种基于超表面的完美吸收器,能够在极低频区域实现声波的全吸收。该超表面具有深亚波长厚度,特征尺寸为k223,由穿孔板和卷曲共面气室组…

linux之网络子系统- 内核接收数据包以及相关实际问题

一、相关实际问题 RingBuffer是什么,为什么会丢包网络相关的硬中断、软中断是什么Linux里的ksoftirqd内核线程是干什么的为什么网卡开启多队列能提升网络性能tcpdump是如何工作的iptable/netfilter是在哪一层实现的tcpdump能否抓到被iptable封禁的包网络接收过程中…

QML项目实战:自定义CheckBox

目录 一.添加模块 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.4 import QtGraphicalEffects 1.15 二.自定义CheckBox 1.CheckBox设置 2.勾选框设置 3.标签部分 4. 状态变化处理 5.文本设置 三.效果 1.当enabled为true 2.当enabled为true 3.当…

centos7快速安装sqlserver2019

1、centos7节点安装sqlserver 1.1 下载官网的yum源 curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2019.repo1.2 yum安装sqlserver yum install -y mssql-server1.3 启动sqlserver服务,并配置密码、版…

PMP--入栏需看

文章目录 报名英文报名中文报名 备考第一步第二步 基础实践冲刺题库一模二模三模冲刺必刷分类常考易错 报名 英文报名 PMP–报名 中文报名 备考 第一步 PMP–学习计划 第二步 PMP–备考书籍说明 基础 PMP–知识卡片 PMP–敏捷Scrum PMP–计算–图示 PMP–计算–挣值分…

西门子PLC使用标签与威伦触摸屏通信

plc侧 创建项目,选择plc,并进行相关配置。创建db块db1,创建以下变量。 取消优化块的访问,不然会出错。在Main的OB块中输入以下程序。 将程序写入到plc中,至此,plc方面配置完成。 触摸屏侧 创建项目&…

前端vue3若依框架pnpm run dev启动报错

今天前端vue3若依框架pnpm run dev启动报错信息: > ruoyi3.8.8 dev D:\AYunShe\2024-11-6【无锡出门证】\wuxi-exit-permit-web > vite error when starting dev server: Error: listen EACCES: permission denied 0.0.0.0:80 at Server.setupListenHand…

基本查询【MySQL】

文章目录 基本查询插入时是否更新替换查询指定列查询查询字段为表达式为查询结果指定别名结果去重where条件NULL 的查询 结果排序筛选分页结果UpdateDelete截断表聚合函数分组(group by)having && where 基本查询 建表 mysql> create table Student (-> id int…

Spring:Bean(创建方式,抽象继承,工厂Bean,生命周期)

1,Bean的创建 1.1,调用构造器创建Bean 调用Bean类的无参构造函数来创造对象,因此要求提供无参构造函数。在这种情况下class元素是必须的,值就是Bean对象的实现类。 如果采用设值注入,Spring容器将使用默认的构造器来创…

Docker:镜像构建 DockerFile

Docker:镜像构建 DockerFile 镜像构建docker build DockerfileFROMCOPYENVWORKDIRADDRUNCMDENTRYPOINTUSERARGVOLUME 镜像构建 在Docker官方提供的镜像中,大部分都是基础镜像,他们只提供某个简单的功能,如果想要一个功能更加丰富…