Categories
程式開發

Timon 覆蓋率工具在知乎測試實踐中的應用


背景

結合代碼設計測試用例能夠有效提高測試精準度,為此我們研發了一種可以實時收集代碼覆蓋率的工具 Timon。 Timon 與公司容器化構建系統 ZAE 打通;支持 Java、 Python 和 Golang 三種語言的覆蓋率統計;能夠產出全量和增量代碼覆蓋率報告;支持合併覆蓋率數據;可以在接口測試和集成測試等場景使用。 Timon 工具支持 90% 以上自動化接口用例的覆蓋率統計;使用 Timon 輔助功能測試的 QA,增量代碼覆蓋率平均達到 80% 以上。在以下的內容中,文章將介紹工具的原理和使用實踐。

測試覆蓋率工具選擇

我們選擇的測試覆蓋率工具包括 Jacoco、Coverage.py 和 go test 命令。各工具的詳細介紹可以在官網中查看,文章不再贅述。表 2.1 對比了三種工具。其中 Jacoco 使用 On-the-fly 的模式插樁已滿足使用需求。 Coverage.py 和 go test 需要殺掉應用進程才能獲取報告。 go test 需要在編譯階段進行插樁。

Timon 覆蓋率工具在知乎測試實踐中的應用 1

表 2.1 工具對比

原理和模塊設計

在編譯階段, 我們對代碼進行插樁。部署階段,Timon 客戶端被部署到容器當中。開啟應用時,ZAE 將自動修改應用啟動命令,以啟動 Timon 客戶端。 Timon 工具包括兩個大的模塊: 客戶端和服務端。客戶端又有三個子模塊,分別對應三種語言。主要職責是上傳容器信息、監聽端口、請求配置文件、生成覆蓋率原始數據文件、 上傳代碼 diff 信息等。服務端的主要功能包括增量代碼覆蓋率計算、生成配置文件、歷史數據管理、報告展示界面等。詳細的模塊列表可以查看系統模塊圖 ( 圖3.1 )。下面將介紹工具重點功能的實現方法。

Timon 覆蓋率工具在知乎測試實踐中的應用 2

圖 3.1 系統模塊

1、編譯階段插樁

Golang 應用需要在編譯階段進行代碼插樁才可以統計覆蓋率數據。開發在 CI 配置文件中加入如下配置後,ZAE 平台自動完成插樁過程。配置文件包含的信息包括項目源碼、目標文件以及各服務入口的路徑。 ZAE 在檢測到插樁配置後,首先將 Timon 客戶端提供的 test 文件放到服務入口所在的目錄中,然後在生成的 Jenkinsfile 中插入編譯命令。 Python 和 Java 語言的項目不需要在編譯階段插樁。

Timon 覆蓋率工具在知乎測試實踐中的應用 3

2、部署階段初始化

Timon 客戶端在啟動的時候,會進行上傳容器信息、監聽端口、請求配置文件等操作。圖 3.2 展示了客戶端的初始化過程。

Timon 覆蓋率工具在知乎測試實踐中的應用 4

圖 3.2 Timon 客戶端初始化過程

Timon 客戶端啟動之後的主要任務是監聽覆蓋率報告請求、容器銷毀信息並上傳覆蓋率報告。因為代碼更新後,測試聯調環境會自動部署新版本的代碼並銷毀當前容器,所以 Timon 客戶端需要在容器銷毀前上傳覆蓋率數據。 Java 語言覆蓋率檢測工具採用的方案是每 10 分鐘上傳一次覆蓋率數據。但是Go 和Python 語言的覆蓋率檢測工具需要重啟應用才能上傳,為了不讓服務進程頻繁重啟,我們採用了另一種方案:Timon 客戶端監聽系統發給容器的銷毀信號,收到信號後客戶端上傳覆蓋率數據。除此之外用戶請求生成覆蓋率報告時,Timon 客戶端也會實時上傳覆蓋率報告。

3、上傳覆蓋率數據

一個用戶從請求當前部署版本覆蓋率報告到獲得報告的時序圖見圖 3.3。假設某個測試環境當中只有一個應用,這個應用有三個容器提供服務,Timon 服務器等待容器一和二上傳原始數據後,向容器三發送原始數據集合,最後容器三合併數據後,生成html 格式的全量代碼覆蓋率報告。如果測試環境有多個應用,那麼時序圖當中的過程是並行進行的。在容器銷毀前,保存覆蓋率原始數據的方案也是類似的。

Timon 覆蓋率工具在知乎測試實踐中的應用 5

圖 3.3 客戶端與服務器端交互時序圖

4、計算覆蓋率數據

統計覆蓋率的方式有分支覆蓋率和可執行代碼覆蓋率等。在實踐中通常通過可執行代碼來計算覆蓋率,Timon 也是如此。增量代碼覆蓋率的計算需要代碼與主分支的 diff 數據和全量代碼覆蓋率報告。分子是增量代碼且已經覆蓋的執行代碼行數,其中會去除測試文件等非業務代碼文件。分母是增量代碼部分執行代碼的行數。為了能夠幫助使用者及時找到增量代碼,我們對第三方工俱生成的報告做了一些修改。比如 Java 的增量代碼覆蓋率報告中只顯示有增量代碼的文件,在瀏覽器直接搜索 「新增代碼」 即可跳轉到增量代碼位置。 Golang 和 Python 語言的覆蓋率報告也有類似的功能。

Timon 覆蓋率工具在知乎測試實踐中的應用 6

圖 3.4 增量代碼覆蓋率報告 Java版

如果是計算MR整體的增量代碼覆蓋率,那麼還需要合併多個 Commit 的覆蓋率數據。假設有 Commit A、Commit B、Commit C 三個版本的覆蓋率報告,Commit C 是最後一次提交,Commit C 有增量代碼的文件是 c。下面介紹一下合併過程。

  • 找到 Commit A 文件 c 中被執行的代碼內容
  • 在 Commit C 中尋找相同的代碼內容
  • 在 Commit C 的覆蓋率報告中標註該行被執行
  • 重複以上三個過程,其他 Commit 代碼與 Commit C 的代碼比對

合併後生成的覆蓋率報告能夠輔助 QA 分析,未覆蓋的部分是因為測試用例遺漏,還是測試環境無法覆蓋,又或者冗餘代碼等其他問題。

用戶使用流程

我們做到了零成本接入,用戶在測試聯調環境加入應用時,打開 「啟動覆蓋率檢測環境」按鈕即可。用戶可以在工具的前端界面查看報告,也可以在 MR 中添加評論獲取覆蓋率數據報表。用戶使用流程圖( 圖2.1 ) 展示了使用覆蓋率報告分析測試用例的流程 。如果使用自動化腳本進行測試,單版本的的代碼覆蓋率報告可以幫助分析。如果是手工測試,由於代碼持續更新,MR 整體的增量代碼覆蓋率報告能夠幫助查找遺漏的測試用例。

Timon 覆蓋率工具在知乎測試實踐中的應用 7

圖 4.1 用戶使用流程圖

Timon 覆蓋率工具在知乎測試實踐中的應用 8

圖 4.2 前端請求覆蓋率報告

Timon 覆蓋率工具在知乎測試實踐中的應用 9

圖 4.3 MR 評論請求覆蓋率報告

業務實踐

在 Timon 工具出現之前,黑盒測試無從保證覆蓋所有邏輯和異常情況;跟進自動化測試腳本的開發進度,一般是比較用例完成百分比;自動化測試用例的質量評估也大多靠測試經驗。 Timon 幫助測試人員快速找到遺漏測試場景,提高了工作效率,且推動測試人員更加關注代碼本身。 Timon 也為評估自動化測試用例提供了新的方法。除此以外,我們在實踐過程中發現覆蓋率工具也能夠幫助測試人員發現其他問題,比如開發提交了非需求相關的代碼,手工測試環境當中無法製造某些異常情況等。 Timon 工具是知乎質量保障體系的一個模塊,為精準測試舔磚加瓦。 QA 因為使用 Timon 工具改變了測試習慣。我們將持續尋找 Timon 覆蓋率工具在產研體系中的最佳實踐,同時與其他質量保障平台聯動,發揮它的最大價值。

本文轉載自知乎技術專欄。

原文鏈接

https://zhuanlan.zhihu.com/p/102744098