持續集成-結合Gitlab API監控Golang單元測試質量

1、捕獲Gitlab 事件

 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

 2、配置Gitlab CI

 .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 複製代碼

 3、調用Gitlab API 

在管理單元測試持續集成過程當中,Gitlab API提供了不少接口能夠實時查詢任務和項目的相關信息,咱們只需使用Gitlab token調用標準接口便可;


 好比獲取項目下全部的job、全部的pipeline,retryjob,項目branch等等;

經過前面收集的單元測試用例和job信息,最終能夠生成單次pipelinie的單元測試報告;


 4、集成數據

集成用例數據後,測試/開發人員經過Event Server(Testfactory)能清晰查看分析每次單元測試執行狀況: 

 一、單測持續集成列表 

 二、覆蓋率詳細報告 

 三、單測報告        

相關文章
相關標籤/搜索