VTS 仪表盘提供用户后端和用户界面 (UI),用于查看来自 VTS 持续集成系统的测试结果。它通过测试驱动开发并借助测试状态通知等工具,帮助开发者在开发周期内定位和预防回归区域(包括测试监控和分类支持)。
VTS 仪表盘 UI 支持 VTS 基础架构提供的功能(例如原生代码覆盖率),并提供持续的性能监控,以支持开发优化且特性良好的性能工具。
要求
使用 VTS 仪表盘需要以下服务
- Apache Maven,用于构建和部署
- Google Cloud App Engine,用于 Web 服务托管
- Google Cloud Datastore,用于存储
- Google Stackdriver,用于监控
查看测试覆盖率依赖于源代码服务器(例如 Gerrit)的 REST API,这使 Web 服务能够根据现有的访问控制列表获取原始源代码。
架构
VTS 仪表盘使用以下架构

测试状态结果通过 REST 接口持续上传到 Cloud Datastore 数据库。VTS 运行程序会自动处理结果,并使用 Protobuf 格式对其进行序列化。
Web Servlet 构成用户访问数据的主要入口点,用于交付和处理来自 Datastore 数据库的数据。Servlet 包括:用于交付所有测试的主 Servlet、用于管理用户收藏夹的偏好设置 Servlet、用于填充测试表的结果 Servlet、用于准备性能分析数据的图表 Servlet 以及用于准备客户端覆盖率数据的覆盖率 Servlet。
每个测试模块都有自己的 Datastore 祖先树,并且测试结果都使用测试开始时间的 Unix 时间戳进行索引。数据库中的覆盖率数据与测试结果一起存储为计数向量(即,针对原始源文件中的每一行)和用于从源代码服务器获取源代码的标识信息。
通知服务使用任务队列运行,识别测试用例状态更改并通知订阅者。有状态的信息存储在状态表中,以跟踪数据新鲜度和现有故障。这使通知服务能够提供有关各个测试用例失败和修复的丰富信息。
代码结构
VTS 仪表盘的基本组件包括以 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/
包含 Datastore 实体的 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 和实用程序的 UI 测试。src/main/webapp/
包含与 UI 相关的文件 (JSP、CSS、XML)js/
。包含 Web 页面使用的 Javascript 文件。WEB-INF/
。包含配置和 UI 文件。jsp/
。包含每个 Web 页面的 JSP 文件。
appengine-web.xml
在其中将环境变量加载到变量中的设置文件。web.xml
在其中定义 Servlet 映射和安全约束的设置文件。cron.xml
定义计划任务(即通知服务)的设置文件。
设置仪表盘
要设置 VTS 仪表盘
- 创建一个 Google Cloud App Engine 项目,并通过安装以下各项来设置部署主机
- Java 8
- Google App Engine SDK
- Maven
- 在 Google Cloud API 管理器中生成 OAuth 2.0 客户端 ID。
- 创建一个服务帐号并创建一个密钥文件。
- 将电子邮件地址添加到 App Engine Email API 授权发件人列表。
- 设置 Google Analytics(分析)帐号。
- 在仪表盘
pom.xml
中指定环境变量- 使用 OAuth 2.0 ID(来自步骤 2)设置客户端 ID。
- 使用密钥文件(来自步骤 3)中包含的标识符设置服务客户端 ID。
- 指定警报的发件人电子邮件地址(来自步骤 4)。
- 指定将所有电子邮件发送到的电子邮件域名。
- 指定 Gerrit REST 服务器的地址。
- 指定用于 Gerrit REST 服务器的 OAuth 2.0 范围。
- 指定 Google Analytics(分析)ID(来自步骤 5)。
- 构建和部署项目。
- 在终端中,运行
mvn clean appengine:update
。
安全注意事项
可靠的覆盖率信息需要访问原始源代码。但是,某些代码可能很敏感,并且访问它的额外网关可能会允许利用现有的访问控制列表。
为了避免这种威胁,仪表盘没有随覆盖率信息一起提供源代码,而是直接处理覆盖率向量(即,映射到源文件中各行的执行计数向量)。除了覆盖率向量之外,仪表盘还会收到 Git 项目名称和路径,以便客户端可以从外部源代码 API 获取代码。客户端浏览器收到此信息,并在 Javascript 中使用跨域资源共享 (CORS) 来查询源代码服务器以获取原始源代码;生成的代码与覆盖率向量相结合以生成显示。
这种直接方法不会扩大攻击面,因为仪表盘使用用户的 Cookie 向外部服务进行身份验证(这意味着无法直接访问源代码的用户无法利用仪表盘来查看敏感信息)。