在 (一) 初探 iOS 單元測試 一文中,咱們簡單提到了執行xcodebuild test能夠啓動工程的單元測試並輸出測試結果,但手動執行此類命令意義是不大的。咱們須要的是,把一些測試和lint等命令寫在腳本文件裏,在代碼提交、合併及打包等行爲實際發生前,自動執行腳本,以執行的結果決定是否打斷上述操做,必定程度上達到控制代碼質量的目的。 在多人協做開發中,咱們能夠在全部成員進行某些git操做(commit push merge rebase等)前進行代碼的驗證(Test、Lint等),防止邏輯錯誤或不合規範的代碼更新到遠端倉庫中。固然,若是團隊搭建了本身的git服務器,有Mac服務器,在server端進行git hooks是最好的解決方案,本地倉庫也不用進行額外配置。此外,咱們也能夠作一些Client Hooks,來達到一樣的效果。如下內容是筆者對git pre-push hook的一些實踐。git
前往本地倉庫,按下command+shift+.查看隱藏文件,目錄以下。咱們能夠看到.git/hooks路徑下有一些.sample的文件。 xcode
刪除pre-push.sample文件的後綴名,用編輯器打開,寫入:exit 1
複製代碼
保存退出,倉庫根目錄下,執行:bash
git push
複製代碼
能夠看到push失敗。下面咱們在pre-push寫入單元測試的命令,若是測試經過,pre-push程序正常退出,push成功;測試失敗,出錯並退出,push失敗。寫入:
workspace_name() {
workspace_file=`find . -maxdepth 2 -name *.xcworkspace -exec basename {} \;`
echo ${workspace_file%.xcworkspace}
}
check_result() {
if [ $? != 0 ]; then
echo "$1 failed!!"
echo "push will not execute"
echo "$?"
exit 1
else
echo "$1 passed."
echo "push will execute"
echo "$?"
fi
}
workspace=$(workspace_name)
xcodebuild -workspace Example/$workspace.xcworkspace -scheme $workspace-Example -destination 'platform=iOS Simulator,OS=11.0,name=iPhone 7' test
check_result "test"
複製代碼
例子是以pod lib create ...
建立的標準工做空間,從倉庫根目錄起以最大深度爲2尋找以.xcworkspace結尾的文件名,賦給workspace變量,最後test名爲worksapce.xcworkspace scheme爲worksapce-Example的工程,測試失敗,打印"push will not execute"
,exit 1
;反之打印push will execute
,exit 0
。 倉庫根目錄下執行:服務器
git push
複製代碼
最後輸出: app
如今咱們已經實現了一些咱們想要的效果,但如何讓團隊裏的每一個開發成員都收到pre-push hook的規範呢?咱們知道,.git文件夾並不會被push到遠程倉庫,每一個成員clone倉庫,.git文件夾是會初始化的。也就是說,正常狀況下,pre-push hook只對我的有效。但咱們能夠耍一些小手段,讓每一個成員倉庫.git/hooks路徑下都存在咱們寫好的pre-push文件,這樣其餘成員的倉庫也具有了git pre-push hook功能。編輯器
if [ ! -d "$../.git/hooks/pre-push" ]; then
cp ../pre-push ../.git/hooks/pre-push
exit 0
fi
複製代碼
首先,咱們寫好一個腳本,功能爲若是.git/hooks路徑下沒有pre-push文件,就複製一個進去。如圖中add-pre-push-hook.sh文件: post
那這個腳本在何時被執行呢?答案是放在咱們Target的Run Script下: 注意Run Script 和 add-pre-push-hook.sh 是在.xcodeproj的路徑下開始執行的。這樣,每當build,就會執行add-pre-push-hook.sh檢查.git/hooks文件夾下是否存在pre-push文件並嘗試複製進去。下次當開發成員嘗試push代碼時,便無形中受到了hook!!!這一切對不少工程的基礎庫的維護作代碼檢查仍是有必定實用價值的。git-scm.com/book/en/v2/… blog.ittybittyapps.com/blog/2013/0… blog.ricardofilipe.com/post/git-ho…單元測試