文章目錄
.NET 專案在 Git commit 前自動執行 Unit Test
身為一個優秀的工程師對於提升專案品質都有一定的堅持,但對於 Unit Test 所帶來的效益,相信大家應該都會給予正面評價。而專案測試的 code coverage 則是由所有專案團隊成員共同保持的,除了團隊的內部規範之外,似乎沒有其他強制手段來要求新增功能需要有對應的測試,但至少可以做到讓既有的測試保障依然存在
這個時候我們就可以透過 Git hook,加入 pre-commit 的 event 讓程式碼在 commit 前至少通過既有測試,維持基本的程式碼品質,如果無法通過既有的測試就不允許 commit,如此一來就有基本強制手段來避免程式改壞,就來看看可以怎麼做吧
加上 Git Hook
之前文章 Windows 環境下為 Git Repository 加上 Git Hook,對於 Git Hook 有簡單介紹可以參考
在專案的
.git\hooks資料夾將pre-commit.samplerename 為pre-commit(去掉附檔名)
將
pre-commit調整為執行測試語法#!/bin/sh OUTPUT=$("C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" "..\ShoppingCart\ShoppingCart\bin\Debug\ShoppingCart.dll") if [ $? -ne 0 ]; then echo "Unit Test Failed" echo "${OUTPUT}" exit 1 fi#!/bin/sh指定 script 語法,
#!/bin/bash也行OUTPUT=$(command)將測試指令寫在
$()中,並將結果指令給OUTPUT,執行測試的程式位置(vstest.console.exe) 每台電腦不一定相同if [ $? -ne 0 ]; then如果測試正確執行
$?會是0,$? -ne 0表示測試結果是failedecho "Unit Test Failed"在畫面上輸出
"Unit Test Failed"echo "${OUTPUT}"將測試結果輸出
exit 1結束程式,表示無法進行 commit
fiif 的結尾
與其他團隊成員共用
上述的設定只適用於 local repository,因為在 .git folder 下的所有內容都不會加入版控,如果想將 git hook 與其他團隊成員共用,就需要加上下列設定
將
hooks資料夾從.git中移至專案根目錄
將 git hooks 的路徑從
.git\hooks指向專案根目錄的hooksgit config core.hooksPath hooks可能需要調整 git hook 內容
確認測試目標的 dll 路徑
實際效果
未通過測試,無法 commit

通過測試,順利 commit

心得
透過 Git hook 加上 pre-commit 執行單元測試,可以讓新 commit 的內容不會造成已經存在的 unit test fail,但說實話這樣的做法只能算是治標,最好的方式還是應該從源頭開始讓所有團隊成員養成寫測試的習慣,讓所有人可以體會到測試的好處,自然而然大家就會自動自發的寫測試了
參考資訊
文章作者 Yowko Tsai
上次更新 2021-11-02
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。
