webhook是一種web回調或者http的push API, 能夠向其它應用提供實時信息。在Gitlab的 Integrations 裏 提供了豐富的gitlab 事件回調方法trigger配置,在遠程服務器實現webhook,便可捕獲gitlab事件,好比‘Push hook’,‘Issue Hook’,‘Merge Request Hook’,‘Pipeline Hook’,‘Job Hook’等等; html
每一種回調事件,能夠獲取對應事件的詳細信息,如EventPushHook的數據結構:git
type EventPushHookStruct struct {
ObjectKind string `json:"object_kind"`
Before string `json:"before"`
After string `json:"after"`
Ref string `json:"ref"`
CheckoutSha string `json:"checkout_sha"`
UserID int `json:"user_id"`
UserName string `json:"user_name"`
UserUsername string `json:"user_username"`
UserEmail string `json:"user_email"`
UserAvatar string `json:"user_avatar"`
ProjectID int `json:"project_id"`
Project struct {
...
} `json:"project"`
Repository struct {
...
} `json:"repository"`
Commits []struct {
...
} `json:"commits"`
TotalCommitsCount int `json:"total_commits_count"`
} 複製代碼
由於單元測試屬於gitlab的pipeline事件,捕獲Gitlab pipeline回調事件,便可提取類型爲unittest的job數據,將pipelineid,jobid,name,coverage,commiter,commitevent等數據入庫;可是這一步還拿不到詳細的單元測試數據,好比測試用例數和成功失敗用例數; 流程圖示:web
.gitlab-ci.yml容許用戶建立無數多個任務,這些任務能夠是並行執行的,也能夠是串聯執行; 一個任務是由一列參數定義的,來決定任務的工做內容和行爲.在變動項目代碼後會觸發持續集成流程,在.gitlab-ci.yml中配置單元測試任務:json
stages:
- build
- unittest
- deploy
- cleanup
build_job:
stage: build
script:
- make build
test_job:
stage: unittest
script:
- make test 複製代碼
stages定義了pipeline執行的前後順序,一般的順序是構建、編譯、單測、發佈,也能夠在腳本中作一些清理和初始化工做;api
爲了獲取Golang項目的全部用例數,咱們能夠在腳本增長這些內容:bash
- go test -v ./... -list "Test[^(]+" -args -config=../../config/config-test.toml|grep Test
go test ./...會到項目目錄下遍歷查找全部的測試用例,這裏要注意go test有一個特性,在list出全部用例的時候他會預執行用例,若是目錄下的第一個用例預執行失敗好比panic了,他會放棄這個目錄查找下一個目錄。也就是說後面的一些成功用例可能會被統計漏掉。因此在執行go test list時不能有panic錯誤發生。
在列出全部的用例後,咱們能夠將用例寫到文件併發送的遠程服務器將用例保存: 複製代碼
- go test -v ./... -list "Test[^(]+" -args -config=../../config/config-te
st.toml|grep Test > cases && curl -s -X POST -F pipid=$CI_PIPELINE_ID -F jobid=$CI_JOB_ID -F "appname=FastRank-go" -F "file=@./cases" http://testfactory.com/api/ut/uploadcases/api/ut/uploadcases 複製代碼
是遠程服務器的一個http文件處理接口,能將用例根據本次CI_PIPELINE_ID和CI_JOB_ID存儲起來; 服務器
保存好本次pipeline的單測用例後,接下來要執行用例並統計用例的成功失敗率;數據結構
- go test -v ./... -args -config=../../config/config-test.toml|grep -E '^\--- FAIL|^\--- PASS' > result
&& cat result- curl -s -X POST -F pipid=$CI_PIPELINE_ID -F jobid=$CI_JOB_ID -F "appname=FastRank-go" -F "file=@./result" http://testfactory.com/api/ut/updatecases 複製代碼
由於使用原生的go test,在統計成功 用例只需過濾「--- PASS」關鍵字就能夠,將結果寫到文件,併發送遠程服務器;併發
也許有小夥伴問這裏爲何不將curl寫到 go test的後面,這裏是由於Gitlab CI的job有一個特性,若是job中的某個命令失敗了,那麼他會認爲這個job失敗,剩下的命令就不會再執行。因此當go test遇到失敗的用例時,爲了保證咱們能 統計到失敗的用例,在 go test 後再 &&一個 可有可無的命令,保證整個job不會失效; app
一樣的,在遠程服務器實現api/ut/updatecases文件處理接口,將上一步統計的用例更新狀態,並統計個數和成功率;
再次執行go test統計項目的覆蓋率並生成詳細覆蓋率報告:
- go test -v -cover ./... -coverprofile=cover.data -args -config=../../config/config-test.toml
- go tool cover -func=cover.data -o stdout
- go tool cover -html=cover.data -o report.html 複製代碼
這一組命令你們應該比較熟悉了,生成覆蓋率數據文件,並轉成html報告;
最後將覆蓋率報告文件存到遠程服務器:
- curl -s -X POST -F pipid=$CI_PIPELINE_ID -F jobid=$CI_JOB_ID -F "appname=FastRank-go"
-F "file=@./report.html" http://testfactory.com/api/ut/uploadfile 複製代碼
在管理單元測試持續集成過程當中,Gitlab API提供了不少接口能夠實時查詢任務和項目的相關信息,咱們只需使用Gitlab token調用標準接口便可;
好比獲取項目下全部的job、全部的pipeline,retryjob,項目branch等等;
經過前面收集的單元測試用例和job信息,最終能夠生成單次pipelinie的單元測試報告;
集成用例數據後,測試/開發人員經過Event Server(Testfactory)能清晰查看分析每次單元測試執行狀況:
一、單測持續集成列表
二、覆蓋率詳細報告
三、單測報告