当前位置: 首页 > article >正文

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[@]}"
do
    cd "${PROJECT_ROOT}/test/${MODULE}"
    flutter test --coverage
    cp 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_report

echo "覆盖率报告已生成在 ${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' ];then
    echo "所有UT都run成功"
else
    echo "存在UT报错退出执行"
    exit 1
fi

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

#!/bin/bash

for file in *.txt; do
  mv "$file" "${file%.txt}.doc"
done

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

#!/bin/bash

SOURCE_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_DIR

echo "Backup completed: $BACKUP_FILE"

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

#!/bin/bash

HOST="google.com"

if ping -c 1 $HOST &> /dev/null; then
  echo "Network is up"
else
  echo "Network is down"
fi

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

#!/bin/bash

for file in *.txt; do
  sed -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' 命令的进程ID
   pubgetPids+=($!)

   # 打印消息,指示当前目录的依赖项更新开始
   echo "开始更新所有依赖$dir"
done

# 等待所有 'flutter pub upgrade' 命令完成
for pid in "${pubgetPids[@]}"; do
   wait $pid
done

# 打印消息,指示所有依赖项更新操作已完成
echo "所有依赖更新操作都执行完毕"

end

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


http://www.kler.cn/a/386970.html

相关文章:

  • 【循环神经网络】
  • 双十一云服务器抢购后,用SD-WAN连通多云网络
  • uniapp分享功能
  • 鸿蒙next版开发:ArkTS组件通用属性(Z序控制)
  • 3.2 软件需求:面对过程分析模型
  • 数据分析——学习框架
  • PostgreSQL 性能优化全方位指南:深度提升数据库效率
  • Flutter鸿蒙next 中的 Drawer 导航栏
  • 如何利用动态住宅IP突破亚马逊反爬虫验证码机制
  • [NewStarCTF 2023 公开赛道]逃1
  • 10. java基础知识(下)
  • mac上如何安装指定版本的python
  • 【手撕面试题】React(高频知识点二)
  • 数据科学与大数据技术专业学生的考研方向与适合专业探索
  • 【Linux-进程间通信】了解信号量 + 共享内存 + 消息队列的应用
  • MatrixOne 助力西安天能替换MySQL+MongoDB+ES打造一体化物联网平台
  • express项目中使用MySQL
  • 汽车共享服务管理:SpringBoot专业解决方案
  • SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”
  • linux rocky 9.4部署和管理docker harbor私有源
  • ctfshow-web入门-反序列化(web265-web270)
  • windows C#-标识符命名规则和约定
  • Linux的目录结构 | 命令的认识 | 相对路径 | 绝对路径 | 常用命令(一)
  • 健身业务自动化:SpringBoot管理系统指南
  • 【基于轻量型架构的WEB开发】课程 12.5 数据回写 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis
  • 数据结构基