如果您是 Android 平台开发新手,您可能会发现从头开始添加全新的 GTest 二进制文件(有时也称为“原生”测试)的完整示例很有用,它可以演示所涉及的典型工作流程。有关 C++ 的 GTest 框架的其他信息,请参阅 GTest 项目网站 以获取更多文档。
本指南使用 Hello World GTest 作为示例。我们建议您通读代码,对其有一个大致的了解,然后再继续。
确定源位置
通常,您的团队已经建立了代码签入位置和添加测试位置的既定模式。大多数团队拥有单个 git 代码库,或与其他团队共享一个代码库,但有一个专用子目录,其中包含组件源代码。
假设您的组件源的根位置在 <component source root>
,则大多数组件在其下都有 src
和 tests
文件夹,以及一些其他文件,例如 Android.mk
(或分解为其他 .bp
文件)。
由于您要添加一个全新的测试,您可能需要创建与您的组件 src
相邻的 tests
目录,并使用内容填充它。
在某些情况下,由于需要将不同的测试套件打包到单独的二进制文件中,您的团队可能在 tests
下有更深层次的目录结构。在这种情况下,您需要在 tests
下创建一个新的子目录。
为了说明,以下是具有单个 tests
文件夹的组件的典型目录结构
\
<component source root>
\-- Android.bp (component makefile)
\-- AndroidTest.xml (test config file)
\-- src (component source)
| \-- foo.cpp
| \-- ...
\-- tests (test source root)
\-- Android.bp (test makefile)
\-- src (test source)
\-- foo_test.cpp
\-- ...
以下是具有多个测试源目录的组件的典型目录结构
\
<component source root>
\-- Android.bp (component makefile)
\-- AndroidTest.xml (test config file)
\-- src (component source)
| \-- foo.cpp
| \-- ...
\-- tests (test source root)
\-- Android.bp (test makefile)
\-- testFoo (sub test source root)
| \-- Android.bp (sub test makefile)
| \-- src (sub test source)
| \-- test_foo.cpp
| \-- ...
\-- testBar
| \-- Android.bp
| \-- src
| \-- test_bar.cpp
| \-- ...
\-- ...
无论结构如何,您最终都会在 tests
目录或新创建的子目录中填充文件,这些文件类似于示例 Gerrit 更改中 native
目录中的文件。以下部分将详细解释每个文件。
源代码
有关示例,请参阅 Hello World GTest。
该示例的源代码在此处进行了注释
#include <gtest/gtest.h>
GTest 的头文件包含。通过在 makefile 中使用 BUILD_NATIVE_TEST
,可以自动解析包含文件依赖项。
#include <stdio.h>
TEST(HelloWorldTest, PrintHelloWorld) {
printf("Hello, World!");
}
GTests 使用 TEST
宏编写:第一个参数是测试用例名称,第二个参数是测试名称。与测试二进制文件名一起,它们在结果信息中心形成以下层次结构
<test binary 1>
| \-- <test case 1>
| | \-- <test 1>
| | \-- <test 2>
| | \-- ...
| \-- <test case 2>
| | \-- <test 1>
| | \-- ...
| \-- ...
<test binary 2>
|
...
有关使用 GTest 编写测试的更多信息,请参阅 GTest 文档
简单配置文件
每个新的测试模块都必须有一个配置文件,以使用模块元数据、编译时依赖项和打包说明来指导构建系统。在大多数情况下,基于 Soong 的 Blueprint 文件选项就足够了。有关详细信息,请参阅 简单测试配置。
复杂配置文件
要改用 Trade Federation,请为 Android 的测试框架 Trade Federation 编写一个测试配置文件。
测试配置可以指定特殊的设备设置选项和默认参数,以提供给测试类。
在本地构建和测试
对于最常见的用例,请使用 Atest。
对于需要更重度自定义的更复杂情况,请按照 检测说明 进行操作。