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

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

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

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

在test之间添加group ,这样可以很好的做到测试之间的隔离
可以在每个测试的 setUp 方法中初始化状态,或使用 tearDown 方法重置状态,这个可以很好的做到测试之间隔离
对于一些异步操作可以使用 expectLater 和 completes 等工具来处理异步测试
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"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
脚本执行

chmod +x coverage.sh
./coverage.sh

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

一些简单常用小脚本
copy文件到另一个路径

cp ".git/hooks/aaaa" ".git/hooks/bbb"
1
判断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
1
2
3
4
5
6
7
8
9
10
11
12
批量重命名文件
这个脚本可以将指定目录下的所有 .txt 文件重命名为 .doc 扩展名

!/bin/bash

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

1
2
3
4
5
6
文件备份
将指定文件夹压缩并备份到一个指定目录

!/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"

1
2
3
4
5
6
7
8
9
10
检查网络连接
这个脚本通过 ping 测试来检查网络连接状态。

!/bin/bash

HOST="google.com"

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

1
2
3
4
5
6
7
8
9
10
批量替换文件内容
这个脚本在指定目录下的所有 .txt 文件中替换文本,将oldtext替换成功newtext

!/bin/bash

for file in *.txt; do
sed -i 's/oldtext/newtext/g' "$file"
done

1
2
3
4
5
6
批量更新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 "所有依赖更新操作都执行完毕"

相关文章
|
3月前
|
缓存 Dart 开发工具
解决Flutter报错The method ‘File.create‘ has fewer named arguments than those of overridden method
解决Flutter报错The method ‘File.create‘ has fewer named arguments than those of overridden method
60 3
|
3月前
Flutter更改主题颜色报错:type ‘Color‘ is not a subtype of type ‘MaterialColor‘
Flutter更改主题颜色报错:type ‘Color‘ is not a subtype of type ‘MaterialColor‘
37 4
|
3月前
|
开发工具 iOS开发
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
134 2
|
3月前
解决Flutter报错The named parameter |method ‘xxxx‘ isn‘t defined.
解决Flutter报错The named parameter |method ‘xxxx‘ isn‘t defined.
121 3
|
3月前
|
Dart
Flutter使用Scaffold报错。
Flutter使用Scaffold报错。
43 3
|
3月前
|
iOS开发
解决Flutter运行IOS报错:Podfile is out of date
解决Flutter运行IOS报错:Podfile is out of date
69 1
|
3月前
解决Flutter报错boxconstraints has non-normalized height/width constraints
解决Flutter报错boxconstraints has non-normalized height/width constraints
41 0
|
3月前
|
Android开发
解决Android、Flutter编译时Gradle报错:javax.net.ssl.SSLException: Connection reset
解决Android、Flutter编译时Gradle报错:javax.net.ssl.SSLException: Connection reset
323 0
|
API Android开发
Flutter导入第三方包后报错The number of method references in a .dex file cannot exceed 64K
Flutter导入第三方包后报错The number of method references in a .dex file cannot exceed 64K
Flutter的setState的使用注意事项以及报错The method ‘setState‘ isn‘t defined for the type
Flutter的setState的使用注意事项以及报错The method ‘setState‘ isn‘t defined for the type