• <li id="gswm4"><xmp id="gswm4"><input id="gswm4"><em id="gswm4"></em></input>
  • <s id="gswm4"><em id="gswm4"></em></s>
    • <s id="gswm4"><em id="gswm4"></em></s>
      首頁 > 資訊 >

      在Bamboo上怎么使用iOS的單元測試|世界看熱訊

      作者:京東零售吳滔


      【資料圖】

      本教程將使用北汽登錄模塊為例,一步一步和大家一起搭建單元測試用例,并在Bamboo上跑起來,最終測試結(jié)果和代碼覆蓋率會Bamboo上匯總。

      模塊名稱:BQLoginModule,是通過iBiu創(chuàng)建的一個模塊工程

      一 建立單元測試Bundle

      ProductName: BQLoginTests

      二 測試代碼編寫1 配置文件同步

      如果我們要在測試代碼使用我們在Pod里的類,需要同步 Targets Support Files/Pods-BQLoginTests/Pods-BQLoginTests.debug.xcconfig 文件的內(nèi)容到 Targets Support Files/Pods-BQLoginUITests/Pods-BQLoginUITests.debug.xcconfig,直接內(nèi)容copy就成了,只是每次用iBiu安裝過后都要做這個操作,后續(xù)使用腳本實現(xiàn)同步:

      2 測試代碼編寫

      具體的編寫我這里就過多介紹了,網(wǎng)上教程一大篇,這里就不多說了,如果沒有做性能測試,這里可以把自動生成的 testPerformanceExample 屏蔽掉。

      三 運行單元測試

      用 command+u,或者菜單(product->test)執(zhí)行,就能獲得結(jié)果

      結(jié)果在這里看:

      完成以上操作,基本的單元測試就OK了

      下面我們用命令行來跑下單元測試,首先進入工程目錄:

      cd BQLoginModule/Example

      執(zhí)行如下命令:

      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 /模擬器信息 修改為自己工程對應(yīng)信息,就可以看到結(jié)果

      四 代碼覆蓋率1 單元覆蓋率

      在XCode打開覆蓋率統(tǒng)計,我們只打開我們的庫做代碼覆蓋就成了,Xcode 12.4在如下地方:

      在Pod里面BQLoginModule設(shè)置 BuildSettings 查找 "cov" ,把 以下2項都設(shè)置為YES;

      然后我們跑下單元測試,就可以看到覆蓋率結(jié)果了:

      2 Bamboo報告

      因為我們需要在Bamboo上匯總覆蓋率報告,這里我們使用iBiu的一個高級特性:用 Podfile.custom 文件加載通用cocoapods的外網(wǎng)庫來使用,具體見圖:

      這里我們引入2個庫: OCMock(單元測試必備的Mock庫) XcodeCoverage(覆蓋率統(tǒng)計的庫)

      加入這個文件后,需要使用 iBou重新安裝下組件

      做如下設(shè)置:

      這個命令主要是生成XcodeCoverage的環(huán)境依賴 env.sh 我們打開文件看下,文件路徑如下

      env.sh內(nèi)容如下:

      這里 OBJECT_FILE_DIR_normal 和 SRCROOT指向的是我們Example工程,我們是需要對Pods里的BQLoginModule里的代碼做單元覆蓋,這2個環(huán)境變量修改如下:

      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 

      可以得到如下結(jié)果:

      還可以查看哪些代碼沒被覆蓋,和Bamboo結(jié)果對齊:

      完成以上步驟,就完成了本地用命令號完成單元測試的所有步驟,下面我們接著來看要在Bamboo上輸出報告需要怎么做。

      五 Bamboo操作1 創(chuàng)建應(yīng)用

      這里要確保對應(yīng)庫和依賴的庫 ,給 xn_testdev_ci賬號開權(quán)限

      2 新建流水線

      選擇 “從零開始創(chuàng)建”

      3 配置流水線

      基礎(chǔ)信息里面的選擇如下

      需要用到以下四個原子:

      “下載代碼”--大家可先配置使用“下載代碼-iBiu”這個原子,我用這個一直使用不成功,所以直接用“下載代碼”來手動配置:

      “自定義腳本”--因為現(xiàn)在iOS的單元測試還沒有對應(yīng)的原子操作,所有我們通過自己寫腳本來完成:

      “單元測試”--你沒看錯,就是用java的單元測試原子,我們輸出的結(jié)果和這個原子匹配,所以選他就成了

      “GCC代碼覆蓋率”

      其中“單元測試”和“代碼覆蓋率”的路徑是可以修改的,這個可以根據(jù)自己的實際路徑修改

      4 自定義腳本

      說明:

      1 下載代碼和配置iBiu都是自己的命令行來做的,但是需要開始配置下git用戶信息

      2 開始我用命令行寫全部命令,但是Bamboo的命令行規(guī)則會導(dǎo)致一些的shell指令的失效,所以我采用把 shell命令 寫到文件上傳到git倉庫,然后執(zhí)行的方式來完成

      3 結(jié)果轉(zhuǎn)換會還會用到 ocunit2junit 和 xcpretty 這2個命令,如果這2個命令出錯,請聯(lián)系Bamboo同事協(xié)助安裝下

      4 大家在寫shell命令時,不知道文件是否生成,可以多用 ls 來看目錄下的文件

      5 重點:

      為了手動安裝iBiu配置,請將本機 ~/Library/Application Support/iBiu/BQLoginModule/下的2個文件 spec_sources 和 pod_setup 上傳到git,我是copy到 Example/BQLoginModule/Resource目錄下然后上傳到git倉庫,這個目錄可以修改,然后修改對應(yīng)shell 命令的目錄就成了iBiu建的git倉庫默認會過濾一些內(nèi)容,修改 BQLoginModule 工程目錄下的 .gitignore 文件,需要上傳xcworkspacedata內(nèi)容代碼覆蓋率設(shè)置,XcodeCoverage的說明強調(diào)了不要用于AppStore的工程,為了避免線上事故,我們通過命令來設(shè)置,不直接在工程里設(shè)置:

      所以修改xcode的構(gòu)建命令新加 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結(jié)果

      覆蓋率下載地址:

      六 腳本匯集1 本地腳本

      以BQLoginModule為例,最終本地腳本命令如下,大家可以重新找到本地目錄執(zhí)行查看效果:

      git clone --depth=1 https://git.jd.com/BQMobileshop/BQLoginModule.gitcd BQLoginModule/Examplepod updatepwdmoduleName="BQLoginModule"testName="BQLoginTests"biu -pod install ./lsls ./Podsrm -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.txtcat utlogfile.txt |grep ".xcresult" > utlogpath.txtlogStr=$(cat ./utlogpath.txt)logPath=${logStr:1}if [ -z "$logPath" ]; thenexit 1fised "s/${moduleName}.build\/Debug-iphonesimulator\/${moduleName}_Example.build/Pods.build\/Debug-iphonesimulator\/${moduleName}.build/g" ./Pods/XcodeCoverage/env.sh> cov_env1.txtsed "s/${moduleName}\/Example/${moduleName}\/${moduleName}\/Classes/g" ./cov_env1.txt > cov_env2.txtcp -f ./Pods/XcodeCoverage/env.sh ./Pods/XcodeCoverage/env_bak.shrm -f ./Pods/XcodeCoverage/env.shcp ./cov_env2.txt ./Pods/XcodeCoverage/env.shcat "./utlogfile.txt"|ocunit2junitls test-reportscp ./cov_env2.txt ./Pods/XcodeCoverage/env.shmkdir xmlout./Pods/XcodeCoverage/getcov -x -o xmloutls ./xmlout/lcovcat "./utlogfile.txt"|xcpretty -t -r html --output testresult/testresult.htmlls te
      2 Bamboo腳本

      Bamboo腳本分成2部分,一個是在Bamboo上執(zhí)行的腳本

      rm -fr "/Users/admin/Library/Application Support/iBiu/BQLoginModule"mkdir "/Users/admin/Library/Application Support/iBiu/BQLoginModule"rm -fr ./BQLoginModulegit clone --depth=1 https://git.jd.com/BQMobileshop/BQLoginModule.gitcd BQLoginModule/Examplecp "./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倉庫來執(zhí)行,大家做的時候注意修改變量名稱:

      pwdmoduleName="BQLoginModule"testName="BQLoginTests"ls ./Podsrm -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.txtcat utlogfile.txt |grep ".xcresult" > utlogpath.txtlogStr=$(cat ./utlogpath.txt)logPath=${logStr:1}if [ -z "$logPath" ]; thenexit 1fised "s/${moduleName}.build\/Debug-iphonesimulator\/${moduleName}_Example.build/Pods.build\/Debug-iphonesimulator\/${moduleName}.build/g" ./Pods/XcodeCoverage/env.sh> cov_env1.txtsed "s/${moduleName}\/Example/${moduleName}\/${moduleName}\/Classes/g" ./cov_env1.txt > cov_env2.txtcp -f ./Pods/XcodeCoverage/env.sh ./Pods/XcodeCoverage/env_bak.shrm -f ./Pods/XcodeCoverage/env.shcp ./cov_env2.txt ./Pods/XcodeCoverage/env.shcat "./utlogfile.txt"|ocunit2junitls test-reportscp ./cov_env2.txt ./Pods/XcodeCoverage/env.shmkdir xmlout./Pods/XcodeCoverage/getcov -x -o xmloutls ./xmlout/lcovcat "./utlogfile.txt"|xcpretty -t -r html --output testresult/testresult.htmlls 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里提示 “未設(shè)置原子執(zhí)行條件”

      因為Bamboo的Shell對字符拼接,變量的處理有限制,所以一部分shell命令最好放在文件執(zhí)行

      6 在本地測試時,Pods/XXXXModule的設(shè)置項在每次iBiu安裝后都會重置

      請注意手動修改,或者直接使用腳本運行

      7 在本地測試時,代碼覆蓋率只包含了一部分源碼文件,不是全部

      請清空 ~/Library/Developer/Xcode/DerivedData 目錄再測試一次

      8 在Bamboo上發(fā)現(xiàn)有些庫拉不下來

      請確保 對應(yīng) 庫給xn_testdev_ci開了權(quán)限

      9 覆蓋率文件生成不了

      請確保XXXTests的版本信息和主工程的XXXXModule_Example的版本信息一致

      關(guān)鍵詞:

      責任編輯:Rex_11

      推薦閱讀
      91亚洲精品色午夜麻豆,91美女在线视频,性欧美tube精品,久久99精品久久久久久野外
    • <li id="gswm4"><xmp id="gswm4"><input id="gswm4"><em id="gswm4"></em></input>
    • <s id="gswm4"><em id="gswm4"></em></s>
      • <s id="gswm4"><em id="gswm4"></em></s>
        主站蜘蛛池模板: 中文字幕日韩理论在线| 久久精品中文字幕大胸| 国产三级久久精品三级| 9久久免费国产精品特黄| 精品无码久久久久久久久水蜜桃| 日本高清不卡在线观看| 国产国产精品人在线观看| 久久精品成人欧美大片| 国产91小视频| 日本福利视频导航| 国产一区二区不卡老阿姨| 中文字幕日韩一区二区三区不卡| 老司机在线免费视频| 性做久久久久久免费观看| 免费黄色软件在线观看| jizzjlzzjlzz性欧美| 波多野结衣同性系列698| 国产自无码视频在线观看| 亚洲国产成人久久一区www| 日本h在线精品免费观看| 日韩av无码一区二区三区 | 国产伦理电影网| 久久久久久亚洲精品不卡| 美女把腿扒开让男人桶爽了| 婷婷五月综合激情| 亚洲精品成人网站在线观看| 51国产偷自视频区视频| 最近高清中文在线国语视频完整版| 国产成人不卡亚洲精品91| 中文有码在线观看| 王雨纯脱得一点不剩| 国产精品视频永久免费播放 | sao货水真多好浪好紧视频| 没带罩子让老师捏了一节课| 国产精品四虎在线观看免费| 九九免费精品视频在这里| 色欲麻豆国产福利精品| 好男人社区www在线观看| 亚洲日韩精品无码AV海量| 国产成人在线网址| 成人福利免费视频|