VTS 儀表板提供使用者後端和使用者介面 (UI),用於查看 VTS 持續整合系統的測試結果。它透過測試狀態通知等工具支援測試驅動開發,以幫助開發人員在開發週期中定位和防止回歸區域(包括測試監控和分類支援)。
VTS 儀表板 UI 支援 VTS 基礎架構提供的功能(例如本機程式碼覆蓋率),並提供持續的效能監控,以支援開發最佳化且特性良好的效能工具。
要求
使用 VTS 儀表板需要以下服務:
- Apache Maven ,用於建置和部署
- Google Cloud App Engine ,用於網路服務託管
- Google Cloud Datastore ,用於存儲
- Google Stackdriver ,用於監控
查看測試覆蓋率依賴於原始程式碼伺服器(例如 Gerrit)的 REST API,這使得 Web 服務能夠根據現有的存取控制清單取得原始原始程式碼。
建築學
VTS 儀表板使用下列架構:
測試狀態結果透過 REST 介面持續上傳到 Cloud Datastore 資料庫。 VTS 運行程式會自動處理結果並使用 Protobuf 格式將其序列化。
Web servlet 構成使用者的主要存取點,傳遞和處理來自資料儲存資料庫的資料。這些servlet 包括:用於交付所有測試的主servlet、用於管理使用者收藏夾的首選項servlet、用於填充測試表的結果servlet、用於準備分析資料的圖形servlet 以及用於為客戶端準備覆蓋率數據的覆蓋率servlet 。
每個測試模組都有自己的資料儲存祖先樹,測試結果使用測試開始時間的 Unix 時間戳進行索引。資料庫中的覆蓋率資料與測試結果一起儲存為計數向量(即原始來源檔案中的每一行)和標識資訊以從原始程式碼伺服器取得原始程式碼。
通知服務使用任務佇列運行,識別測試案例狀態變更並通知訂閱者。狀態資訊儲存在狀態表中,以追蹤資料新鮮度和現有故障。這允許通知服務提供有關各個測試案例失敗和修復的豐富資訊。
程式碼結構
VTS Dashboard 的基本元件包括用 Java 實作的 servlet、前端 JSP、CSS 樣式表和設定檔。以下列表詳細說明了這些元件的位置和描述(所有相對於test/vts/web/dashboard
的路徑):
-
pom.xml
定義環境變數和依賴項的設定檔。 -
src/main/java/com/android/vts/api/
包含用於透過 REST 與資料互動的端點。 -
src/main/java/com/android/vts/entity/
包含資料儲存區實體的 Java 模型。 -
src/main/java/com/android/vts/proto/
包含 Protobuf 的 Java 文件,包括VtsReportMessage.java
,它是用於描述 VTS 測試結果的 Protobuf 類型的 Java 實作。 -
src/main/java/com/android/vts/servlet/
包含 servlet 的 Java 檔案。 -
src/main/java/com/android/vts/util/
包含 servlet 使用的實用函數和類別的 Java 檔案。 -
src/test/java/com/android/vts/
包含 servlet 和 utils 的 UI 測試。 -
src/main/webapp/
包含與 UI 相關的檔案(JSP、CSS、XML):-
js/
.包含網頁使用的 Javascript 檔案。 -
WEB-INF/
.包含配置和 UI 檔案。 -
jsp/
.包含每個網頁的 JSP 檔案。
-
-
appengine-web.xml
將環境變數載入到變數中的設定檔。 -
web.xml
定義 servlet 映射和安全約束的設定檔。 -
cron.xml
定義計劃任務(即通知服務)的設定檔。
設定儀表板
設定 VTS 儀表板:
- 建立 Google Cloud App Engine 專案並透過安裝設定部署主機:
- 爪哇8
- 谷歌應用引擎SDK
- 梅文
- 在 Google Cloud API 管理器中產生 OAuth 2.0 用戶端 ID。
- 建立服務帳戶並建立金鑰檔案。
- 將電子郵件地址新增至 App Engine 電子郵件 API 授權寄件者清單。
- 設定 Google Analytics 帳戶。
- 在 Dashboard
pom.xml
中指定環境變數:- 使用 OAuth 2.0 ID 設定客戶端 ID(來自步驟 2)。
- 使用金鑰檔案中包含的識別碼設定服務客戶端 ID(來自步驟 3)。
- 指定警報的寄件者電子郵件地址(來自步驟 4)。
- 指定所有電子郵件將傳送到的電子郵件網域。
- 指定 Gerrit REST 伺服器的位址。
- 指定用於 Gerrit REST 伺服器的 OAuth 2.0 範圍。
- 指定 Google Analytics ID(來自第 5 步)。
- 建置並部署專案。
- 在終端機中,執行
mvn clean appengine:update
。
安全考慮
可靠的覆蓋範圍資訊需要存取原始原始碼。然而,某些代碼可能是敏感的,並且它的附加網關可能允許利用現有的存取控制清單。
為了避免這種威脅,儀表板不會直接提供覆蓋資訊的原始程式碼,而是直接處理覆蓋向量(即映射到原始檔案中的行的執行計數向量)。除了覆蓋向量之外,儀表板還接收 Git 專案名稱和路徑,以便用戶端可以從外部原始碼 API 取得程式碼。用戶端瀏覽器收到此資訊後,使用Javascript中的跨網域資源共用(CORS)向原始碼伺服器查詢原始原始碼;產生的程式碼與覆蓋向量結合以產生顯示。
這種直接方法不會擴大攻擊面,因為儀表板使用使用者的 cookie 向外部服務進行身份驗證(這意味著無法直接存取原始程式碼的使用者無法利用儀表板查看敏感資訊)。