首页 > 其他分享 >在Bamboo上怎么使用iOS的单元测试

在Bamboo上怎么使用iOS的单元测试

时间:2024-09-26 18:22:54浏览次数:3  
标签:moduleName BQLoginModule 单元测试 iOS XcodeCoverage Bamboo txt Pods Example

本教程将使用北汽登录模块为例,一步一步和大家一起搭建单元测试用例,并在Bamboo上跑起来,最终测试结果和代码覆盖率会Bamboo上汇总。

模块名称:BQLoginModule,是通过iBiu创建的一个模块工程

在Bamboo上怎么使用iOS的单元测试_单元测试

一 建立单元测试Bundle

ProductName: BQLoginTests

在Bamboo上怎么使用iOS的单元测试_git_02

二 测试代码编写

1 配置文件同步

如果我们要在测试代码使用我们在Pod里的类,需要同步 Targets Support Files/Pods-BQLoginTests/Pods-BQLoginTests.debug.xcconfig 文件的内容到 Targets Support Files/Pods-BQLoginUITests/Pods-BQLoginUITests.debug.xcconfig,直接内容copy就成了,只是每次用iBiu安装过后都要做这个操作,后续使用脚本实现同步:

在Bamboo上怎么使用iOS的单元测试_xml_03



2 测试代码编写

具体的编写我这里就过多介绍了,网上教程一大篇,这里就不多说了,如果没有做性能测试,这里可以把自动生成的 testPerformanceExample 屏蔽掉。

在Bamboo上怎么使用iOS的单元测试_xml_04



三 运行单元测试

用 command+u,或者菜单(product->test)执行,就能获得结果

在Bamboo上怎么使用iOS的单元测试_git_05



结果在这里看:

在Bamboo上怎么使用iOS的单元测试_单元测试_06

完成以上操作,基本的单元测试就OK了

下面我们用命令行来跑下单元测试,首先进入工程目录:


cd BQLoginModule/Example


执行如下命令:


xcodebuild test -UseModernBuildSystem=NO -configuration=Debug -workspace './BQLoginModule.xcworkspace' -scheme "BQLoginModule_Example" -destination 'platform=iOS Simulator,name=iPhone 8,OS=13.2.2'



请大家注意将 workspace/scheme /模拟器信息 修改为自己工程对应信息

就可以看到结果


四 代码覆盖率

1 单元覆盖率


在XCode打开覆盖率统计,我们只打开我们的库做代码覆盖就成了,Xcode 12.4在如下地方:

在Bamboo上怎么使用iOS的单元测试_xml_07



在Pod里面BQLoginModule设置 BuildSettings 查找 "cov" ,把 以下2项都设置为YES;

在Bamboo上怎么使用iOS的单元测试_单元测试_08

然后我们跑下单元测试,就可以看到覆盖率结果了:

在Bamboo上怎么使用iOS的单元测试_单元测试_09

2 Bamboo报告

因为我们需要在Bamboo上汇总覆盖率报告,这里我们使用iBiu的一个高级特性:用 Podfile.custom 文件加载通用cocoapods的外网库来使用,具体见图:

在Bamboo上怎么使用iOS的单元测试_xml_10



这里我们引入2个库: OCMock(单元测试必备的Mock库) XcodeCoverage(覆盖率统计的库)

加入这个文件后,需要使用 iBou重新安装下组件

做如下设置:

在Bamboo上怎么使用iOS的单元测试_git_11

在Bamboo上怎么使用iOS的单元测试_单元测试_12



这个命令主要是生成XcodeCoverage的环境依赖 env.sh 我们打开文件看下,文件路径如下

在Bamboo上怎么使用iOS的单元测试_git_13



env.sh内容如下:

在Bamboo上怎么使用iOS的单元测试_xml_14

这里 OBJECT_FILE_DIR_normal 和 SRCROOT指向的是我们Example工程,我们是需要对Pods里的BQLoginModule里的代码做单元覆盖,这2个环境变量修改如下:

export OBJECT_FILE_DIR_normal ="/Users/cdwutao3/Library/Developer/Xcode/DerivedData/BQLoginModule-fvrzeicgcswucwfgjqweugauzxia/Build/Intermediates.noindex/Pods.build/Debug-iphonesimulator/BQLoginModule.build/Objects-normal"

export SRCROOT="/Users/cdwutao3/Desktop/ut/BQLoginModule/BQLoginModule/Classes"


然后在Pods/XcodeCoverage目录新建 xmlout目录,并运行命令:


./getcov -x -s -o xmlout


可以得到如下结果:

在Bamboo上怎么使用iOS的单元测试_单元测试_15

还可以查看哪些代码没被覆盖,和Bamboo结果对齐:

在Bamboo上怎么使用iOS的单元测试_xml_16

完成以上步骤,就完成了本地用命令号完成单元测试的所有步骤,下面我们接着来看要在Bamboo上输出报告需要怎么做。


五 Bamboo操作


1 创建应用

这里要确保对应库和依赖的库 ,给 xn_testdev_ci账号开权限

在Bamboo上怎么使用iOS的单元测试_xml_17

2 新建流水线


选择 “从零开始创建”

在Bamboo上怎么使用iOS的单元测试_git_18

3 配置流水线

基础信息里面的选择如下

在Bamboo上怎么使用iOS的单元测试_git_19

3 配置流水线

在Bamboo上怎么使用iOS的单元测试_git_20

需要用到以下四个原子:


“下载代码”--大家可先配置使用“下载代码-iBiu”这个原子,我用这个一直使用不成功,所以直接用“下载代码”来手动配置:

在Bamboo上怎么使用iOS的单元测试_git_21

在Bamboo上怎么使用iOS的单元测试_git_22


“自定义脚本”--因为现在iOS的单元测试还没有对应的原子操作,所有我们通过自己写脚本来完成:

在Bamboo上怎么使用iOS的单元测试_xml_23


“单元测试”--你没看错,就是用java的单元测试原子,我们输出的结果和这个原子匹配,所以选他就成了

在Bamboo上怎么使用iOS的单元测试_单元测试_24

在Bamboo上怎么使用iOS的单元测试_xml_25


“GCC代码覆盖率”

在Bamboo上怎么使用iOS的单元测试_单元测试_26

在Bamboo上怎么使用iOS的单元测试_git_27

其中“单元测试”和“代码覆盖率”的路径是可以修改的,这个可以根据自己的实际路径修改

4 自定义脚本

说明:

1 下载代码和配置iBiu都是自己的命令行来做的,但是需要开始配置下git用户信息

2 开始我用命令行写全部命令,但是Bamboo的命令行规则会导致一些的shell指令的失效,所以我采用把 shell命令 写到文件上传到git仓库,然后执行的方式来完成

3 结果转换会还会用到 ocunit2junit 和 xcpretty 这2个命令,如果这2个命令出错,请联系Bamboo同事协助安装下

4 大家在写shell命令时,不知道文件是否生成,可以多用 ls 来看目录下的文件

5 重点:

  • 为了手动安装iBiu配置,请将本机 ~/Library/Application Support/iBiu/BQLoginModule/下的2个文件 spec_sources 和 pod_setup 上传到git,我是copy到 Example/BQLoginModule/Resource目录下然后上传到git仓库,这个目录可以修改,然后修改对应shell 命令的目录就成了


  • iBiu建的git仓库默认会过滤一些内容,修改 BQLoginModule 工程目录下的 .gitignore 文件,需要上传xcworkspacedata内容

在Bamboo上怎么使用iOS的单元测试_单元测试_28

  • 代码覆盖率设置,XcodeCoverage的说明强调了不要用于AppStore的工程,为了避免线上事故,我们通过命令来设置,不直接在工程里设置:

在Bamboo上怎么使用iOS的单元测试_git_29


所以修改xcode的构建命令新加 GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES,命令如下:

xcodebuild -UseModernBuildSystem=NO -enableCodeCoverage=YES -configuration=Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES -workspace "./${moduleName}.xcworkspace" -scheme "${moduleName}_Example" -destination 'platform=iOS Simulator,name=iPhone 8,OS=13.2.2' test



5 Bamboo结果

在Bamboo上怎么使用iOS的单元测试_xml_30


覆盖率下载地址:

在Bamboo上怎么使用iOS的单元测试_git_31

六 脚本汇集

1 本地脚本

以BQLoginModule为例,最终本地脚本命令如下,大家可以重新找到本地目录执行查看效果:

git clone --depth=1 https://git.jd.com/BQMobileshop/BQLoginModule.git
cd BQLoginModule/Example
pod update


pwd
moduleName="BQLoginModule"
testName="BQLoginTests"


biu -pod install ./
ls
ls ./Pods
rm -f "./Pods/Target Support Files/Pods-${testName}/Pods-${testName}.debug.xcconfig"
cp -f "./Pods/Target Support Files/Pods-${moduleName}_Example/Pods-${moduleName}_Example.debug.xcconfig"  "./Pods/Target Support Files/Pods-${testName}/Pods-${testName}.debug.xcconfig"
cat "./Pods/Target Support Files/Pods-${testName}/Pods-${testName}.debug.xcconfig"


xcodebuild clean -workspace "./${moduleName}.xcworkspace" -scheme "${moduleName}_Example"


xcodebuild  -UseModernBuildSystem=NO -enableCodeCoverage=YES -configuration=Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES -workspace "./${moduleName}.xcworkspace" -scheme "${moduleName}_Example" -destination 'platform=iOS Simulator,name=iPhone 8,OS=13.2.2'  test  > utlogfile.txt
cat utlogfile.txt |grep ".xcresult" > utlogpath.txt
logStr=$(cat ./utlogpath.txt)
logPath=${logStr:1}
if [ -z "$logPath" ]; then
	exit 1
fi


sed "s/${moduleName}.build\/Debug-iphonesimulator\/${moduleName}_Example.build/Pods.build\/Debug-iphonesimulator\/${moduleName}.build/g" ./Pods/XcodeCoverage/env.sh> cov_env1.txt
sed "s/${moduleName}\/Example/${moduleName}\/${moduleName}\/Classes/g" ./cov_env1.txt > cov_env2.txt
cp -f ./Pods/XcodeCoverage/env.sh ./Pods/XcodeCoverage/env_bak.sh
rm -f ./Pods/XcodeCoverage/env.sh
cp ./cov_env2.txt ./Pods/XcodeCoverage/env.sh


cat "./utlogfile.txt"|ocunit2junit
ls test-reports


cp ./cov_env2.txt ./Pods/XcodeCoverage/env.sh
mkdir xmlout
./Pods/XcodeCoverage/getcov -x -o xmlout
ls ./xmlout/lcov


cat "./utlogfile.txt"|xcpretty -t -r html --output testresult/testresult.html
ls te

2 Bamboo脚本

Bamboo脚本分成2部分,一个是在Bamboo上执行的脚本

rm -fr "/Users/admin/Library/Application Support/iBiu/BQLoginModule"
mkdir "/Users/admin/Library/Application Support/iBiu/BQLoginModule"
rm -fr ./BQLoginModule
git clone --depth=1 https://git.jd.com/BQMobileshop/BQLoginModule.git
cd BQLoginModule/Example
cp "./BQLoginModule/Resource/spec_sources" "/Users/admin/Library/Application Support/iBiu/BQLoginModule"
cp "./BQLoginModule/Resource/pod_setup" "/Users/admin/Library/Application Support/iBiu/BQLoginModule"
ls "/Users/admin/Library/Application Support/iBiu/BQLoginModule"
biu -pod install ./


sh UT.sh


脚本剩下部分写入 UT.sh,放在BQLoginModule/Example目录下, 然后上传到git仓库来执行,大家做的时候注意修改变量名称:

pwd
moduleName="BQLoginModule"
testName="BQLoginTests"


ls ./Pods
rm -f "./Pods/Target Support Files/Pods-${testName}/Pods-${testName}.debug.xcconfig"
cp -f "./Pods/Target Support Files/Pods-${moduleName}_Example/Pods-${moduleName}_Example.debug.xcconfig"  "./Pods/Target Support Files/Pods-${testName}/Pods-${testName}.debug.xcconfig"
cat "./Pods/Target Support Files/Pods-${testName}/Pods-${testName}.debug.xcconfig"


xcodebuild clean -workspace "./${moduleName}.xcworkspace" -scheme "${moduleName}_Example"


xcodebuild  -UseModernBuildSystem=NO -enableCodeCoverage=YES -configuration=Debug GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES -workspace "./${moduleName}.xcworkspace" -scheme "${moduleName}_Example" -destination 'platform=iOS Simulator,name=iPhone 8,OS=13.2.2'  test  > utlogfile.txt
cat utlogfile.txt |grep ".xcresult" > utlogpath.txt
logStr=$(cat ./utlogpath.txt)
logPath=${logStr:1}
if [ -z "$logPath" ]; then
	exit 1
fi


sed "s/${moduleName}.build\/Debug-iphonesimulator\/${moduleName}_Example.build/Pods.build\/Debug-iphonesimulator\/${moduleName}.build/g" ./Pods/XcodeCoverage/env.sh> cov_env1.txt
sed "s/${moduleName}\/Example/${moduleName}\/${moduleName}\/Classes/g" ./cov_env1.txt > cov_env2.txt
cp -f ./Pods/XcodeCoverage/env.sh ./Pods/XcodeCoverage/env_bak.sh
rm -f ./Pods/XcodeCoverage/env.sh
cp ./cov_env2.txt ./Pods/XcodeCoverage/env.sh


cat "./utlogfile.txt"|ocunit2junit
ls test-reports


cp ./cov_env2.txt ./Pods/XcodeCoverage/env.sh
mkdir xmlout
./Pods/XcodeCoverage/getcov -x -o xmlout
ls ./xmlout/lcov


cat "./utlogfile.txt"|xcpretty -t -r html --output testresult/testresult.html
ls test

七 错误速查

这里汇集了在写脚本时的一些错误,方便大家查看


1 不能在测试工程引用自己的代码

请参看 二--1 ”配置文件同步“ 解决


2 在Bamboo上的Pods文件夹,没有拉到iBiu的其他配置信息

请参看 五--4 ”自定义脚本“的重点 1 来解决


3 “No coverage data in result bundle”

请参看 五--4 ”自定义脚本”的重点 2 来解决


4 使用命令行跑单元测试时,一直提示不能找到模拟器

-destination 'platform=iOS Simulator,name=iPhone 8,OS=13.2.2' 改为 -destination 'id=xxxxxxxxxx' 这种格式,id为屏幕提示


5 Bamboo Shell里提示 “未设置原子执行条件”

因为Bamboo的Shell对字符拼接,变量的处理有限制,所以一部分shell命令最好放在文件执行


6 在本地测试时,Pods/XXXXModule的设置项在每次iBiu安装后都会重置

请注意手动修改,或者直接使用脚本运行


7 在本地测试时,代码覆盖率只包含了一部分源码文件,不是全部

请清空 ~/Library/Developer/Xcode/DerivedData 目录再测试一次


8 在Bamboo上发现有些库拉不下来

请确保 对应 库给xn_testdev_ci开了权限


9 覆盖率文件生成不了

请确保XXXTests的版本信息和主工程的XXXXModule_Example的版本信息一致


标签:moduleName,BQLoginModule,单元测试,iOS,XcodeCoverage,Bamboo,txt,Pods,Example
From: https://blog.51cto.com/u_15714439/12120686

相关文章

  • 在Bamboo上怎么使用iOS的单元测试
                sed"s/${moduleName}/Example/${moduleName}/${moduleName}/Classes/g"./cov_env1.txt>cov_env2.txt  cp-f./Pods/XcodeCoverage/env.sh./Pods/XcodeCoverage/env_bak.sh  rm-f./Pods/XcodeCoverage/env.s......
  • Junit单元测试实例
    1.在IDEA中打开File->New->Project。  2.在左侧的菜单栏中选择Java,Name是项目名称,Location是项目的位置,JDK根据个人项目的情况选择。  3.下载对应的Mockito插件,我下载的插件是MockitoPostfixCompletion。 4.配置Maven设置 5.选中项目......
  • VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版
    VMwareESXi8.0U3bmacOSUnlocker&OEMBIOS2.7标准版和厂商定制版ESXi8.0U3标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)定制版、Huawei(华为)OEM定制版请访问原文链接:https:/......
  • RAG、单元测试等一大波新功能,上线JetBrains IDEs的CodeGeeX插件!
    CodeGeeX第三代模型发布后,多项基于第三代模型能力的新功能今天也同步上线JetBrainsIDEs全家桶。用户可以在IDEA、PyCharm等JetBrains系的IDE中,搜索下载CodeGeeXv2.5.0版本,深度使用最新功能。 一、新模型加持的代码补全和智能问答 以IDEA为例,在v2.5.0版本的CodeGeeX插件中,用户可......
  • TestNG进行单元测试
    1.确定测试目标在白盒测试中,目标是测试代码的内部结构、逻辑路径、分支等。你需要明确哪些类和方法是需要测试的,并决定哪些逻辑路径是关键的。2.编写单元测试单元测试是白盒测试的一种常见形式。在编写TestNG测试时,你可以直接调用方法并检查它们的行为。测试用例应该覆盖代......
  • ehviewer安卓和IOS怎样安装?(已解决)
    ehviewer是一款非常流行的办公软件套件,它提供了类似Microsoftehviewer的功能,包括文字处理(ehviewerWriter)、电子表格(ehviewerSpreadsheet)和演示文稿(ehviewerPresentation)。以下是安装和配置ehviewerOffice的详细步骤及技巧,适用于Windows操作系统。对于其他操作系统(如......
  • 零基础学Axios
    Axios官网:Axios官网 想用Axios前需要在项目中安装axios,安装方式如下:下列是axios请去方式,本文主要讲解post和get请求,其他请求和这两种请求方法相同。1get请求1.1不带请求参数前端后端 1.2带请求参数 前端写法一(推荐)写法二:但是这种写法在遇到特殊字符,需要......
  • iOS 18 電筒新功能:可以移除鎖屏捷徑!Pro 款獨享聚光、柔光模式?
    手電筒功能在iPhone上面存在已久,除了能為大家帶來一點光明之外,還有時候會因為誤觸而造成尷尬局面(當事人不自知居多了)。來到iOS18,Apple一口氣對這個低調實用小工具帶來多項改革!一是把原本固定的鎖屏小工具加入自定化,讓大家可以把左右兩個快捷鍵換成更想用的app,或者乾脆移......
  • XMLHttpRequest、Fetch、Axios和AJAX的关系
    一、基于http协议用于前后端通信的工具1、XMLHttpRequest(原生JS对象)XMLHttpRequest(XHR)是原生JavaScript对象。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL,获取数据。特性:浏览器广泛支持功能丰富:可以跟踪请求的状态、支持进度事件、文件上传、同步......
  • uniapp uni-push2.0,iOS、Android的在线离线的推送
    本次是后端服务的苹果和安卓手机FCM的推送说明:ios在线的时间可以监听到服务端推送的数据ios离线是监听不到推送的数据,只能在消息栏点击后才能监听到数据android在线可以监听到服务端数据android离线同样不能监听到,点击打开后可监听android(FCM)离线需要连接外网才可收到消息......