iOS自动化测试&CI解决方案:XCTest + shell + Command Line Testing

一、前期准备

-测试工程:xxx.xcworkspace
-测试框架/工具:XCTest
-运行方式:Command Line Testing(xcodebuild)
-脚本语言:shell
-测试结果(.xcresult文件)解析工具:UnitTestParser

二、流水线CI思路

1.上游产出编译产物(.framework或ipa包)
2.取产物,替换测试工程中的.framework(此步仅针对.framework产物进行测试,当然也可能取ipa等产物,具体取什么形式的产物以具体需求而定)
3.clean 测试工程(确保避免历史结果对本次测试造成的影响)
4.利用Xcode命令行工具编写脚本,自动化编译和测试你的工程xxx.xcworkspace
5.解析.xcresult文件,输出.txt文件
6.解析结果上传,平台展示

三、案例实现

image.png

从图中可以看出,一条完整的流水线,从编译产出到测试准出,需要经过一系列的检测(例如:代码规范检查、全量/增量静态代码扫描、代码隐私合规检查、安全漏洞扫描、自动化测试、冒烟测试、手工测试等)最终达到发布交付的状态。当然作为本篇文章的重点,主要是讨论自动化回归是如何搭建部署的。基于步骤二的思路:
1.首先我们便需要取得上游产出的.framework产物,具体获取方式各个公司、个人不尽相同,这块不予详述,作为本篇示例,暂且把从上游获取得到的产物命名为a.framework;
2.获取到测试所用的a.framework产物后,替换本地xxx.xcworkspace测试工程中所需要的产物,确保测试工程、测试工程中的自动化case能编译运行成功;

# 解压并替换frameworks文件夹下的.framework
tar -zxvf  output.tar.gz
# 此处需要用到一些基础命令用于.framework文件替换,形如:
cd ./
rm -rf 
tar -zxvf  *_Frameworks.zip
cp -R 

# echo xcworkspace编译
# xcodebuild -scheme xxx -workspace xxx.xcworkspace build

3.当第二步成功之后,说明最重要的前提工作已准备就绪,接下来就需要通过xcodebuild命令行的方式来运行测试用例了,为了避免每次运行脚本得到的结果不受上次影响,此处需要clean一下工程

echo clean 工程
cd xxx.xcworkspace工程主目录下
xcodebuild clean

4.利用xcodebuild test命令执行xxx.xcworkspace中的测试用例

echo "Automating Testing:command line testing"
xcodebuild test -workspace xxx.xcworkspace -scheme xxx -destination 'platform=iOS Simulator,name=iPhone 11'

5.步骤4运行成功后,将会在用户的以下路径(形如:/Users/用户名/Library/Developer/Xcode/DerivedData/)下生成DerivedData文件夹(它是Xcode存储各种中间构建结果、生成索引等的位置),并且在该文件夹下的子目录下(形如xxx-azphkrctisoykofiyhatciemjflq/Logs/Test/)存放了步骤4运行后的测试结果.xcresult文件;至此,知道.xcresult的具体位置后,接下来要做的就是解析它,拿到运行的总case数,成功的case数,失败的case数等信息;

echo "/Users/用户名/Library/Developer/Xcode/DerivedData/ 下的历史testing文件"
rm -rf /Users/用户名/Library/Developer/Xcode/DerivedData/*

echo "解析xctest文件,输出result.txt文件"
cp -a /Users/用户名/Library/Developer/Xcode/DerivedData/xxx-azphkrctisoykofiyhatciemjflq/Logs/Test/Test-xxx-*.xcresult/ ./result.xcresult
ruby ./UnitTestParser-master/unitTestInfo.rb --xcresult-path=result.xcresult --output-file=result.txt

6.得到解析后的.txt文件,形如:


iOS自动化测试&CI解决方案:XCTest + shell + Command Line Testing_第1张图片
image.png

后可以将文件里的各项数据摘出来,上传到相关平台进行dashboard展示;

CASES=`sed -n 1p result.txt`

FAIL_CASES=`sed -n 2p result.txt`

SUCC_CASES=$((CASES - FAIL_CASES))

SUCC_RATE=$((SUCC_CASES * 100 / CASES))

echo $CASES
echo $FAIL_CASES
echo $SUCC_CASES
echo $SUCC_RATE

# 输出字段值并重定向到AGILE_OUT(清空原有文件)
echo 'AGILE_TEST_DATA={"CASES":'$CASES',"EXECUTED_CASES":'$CASES',"UNEXECUTED_CASES":0,"SUCC_CASES":'$SUCC_CASES',"FAIL_CASES":'$FAIL_CASES',"PASS_PERCENT":'$SUCC_RATE'}'>$WORKSPACE/AGILE_OUT

# 此处是为了质量卡位:当有自动化case失败后,需要停止整个流水线的执行,分析原因,改正后下次触发再运行,进而达到质量卡位的作用
((FAIL_CASES==0))
exit $?

形如:


image.png

至此,可以直观看到每次运行结果,一目了然。

一个简单的iOS自动化测试&CI 解决方案便完成了,每次分享一点点,感谢阅读:) :)

你可能感兴趣的:(iOS自动化测试&CI解决方案:XCTest + shell + Command Line Testing)