作者:京東零售 吳滔
本教程將使用北汽登錄模塊為例,一步一步和大家一起搭建單元測驗用例,并在Bamboo上跑起來,最終測驗結果和代碼覆寫率會Bamboo上匯總,
模塊名稱:BQLoginModule,是通過iBiu創建的一個模塊工程
一 建立單元測驗Bundle
ProductName: BQLoginTests
二 測驗代碼撰寫
1 組態檔同步
如果我們要在測驗代碼使用我們在Pod里的類,需要同步 Targets Support Files/Pods-BQLoginTests/Pods-BQLoginTests.debug.xcconfig 檔案的內容到 Targets Support Files/Pods-BQLoginUITests/Pods-BQLoginUITests.debug.xcconfig,直接內容copy就成了,只是每次用iBiu安裝過后都要做這個操作,后續使用腳本實作同步:
2 測驗代碼撰寫
具體的撰寫我這里就過多介紹了,網上教程一大篇,這里就不多說了,如果沒有做性能測驗,這里可以把自動生成的 testPerformanceExample 屏蔽掉,
三 運行單元測驗
用 command+u,或者選單(product->test)執行,就能獲得結果
結果在這里看:
完成以上操作,基本的單元測驗就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在如下地方:
在Pod里面BQLoginModule設定 BuildSettings 查找 "cov" ,把 以下2項都設定為YES;
然后我們跑下單元測驗,就可以看到覆寫率結果了:
2 Bamboo報告
因為我們需要在Bamboo上匯總覆寫率報告,這里我們使用iBiu的一個高級特性:用 Podfile.custom 檔案加載通用cocoapods的外網庫來使用,具體見圖:
這里我們引入2個庫: OCMock(單元測驗必備的Mock庫) XcodeCoverage(覆寫率統計的庫)
加入這個檔案后,需要使用 iBou重新安裝下組件
做如下設定:
這個命令主要是生成XcodeCoverage的環境依賴 env.sh 我們打開檔案看下,檔案路徑如下
env.sh內容如下:
這里 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結果對齊:
完成以上步驟,就完成了本地用命令號完成單元測驗的所有步驟,下面我們接著來看要在Bamboo上輸出報告需要怎么做,
五 Bamboo操作
1 創建應用
這里要確保對應庫和依賴的庫 ,給 xn_testdev_ci賬號開權限
2 新建流水線
選擇 “從零開始創建”
3 配置流水線
基礎資訊里面的選擇如下
需要用到以下四個原子:
“下載代碼”--大家可先配置使用“下載代碼-iBiu”這個原子,我用這個一直使用不成功,所以直接用“下載代碼”來手動配置:
“自定義腳本”--因為現在iOS的單元測驗還沒有對應的原子操作,所有我們通過自己寫腳本來完成:
“單元測驗”--你沒看錯,就是用java的單元測驗原子,我們輸出的結果和這個原子匹配,所以選他就成了
“GCC代碼覆寫率”
其中“單元測驗”和“代碼覆寫率”的路徑是可以修改的,這個可以根據自己的實際路徑修改
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內容
- 代碼覆寫率設定,XcodeCoverage的說明強調了不要用于AppStore的工程,為了避免線上事故,我們通過命令來設定,不直接在工程里設定:
所以修改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結果
覆寫率下載地址:
六 腳本匯集
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的版本資訊一致
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552228.html
標籤:其他
上一篇:Django SQL注入漏洞分析(CVE-2022-28346)
下一篇:返回列表
