Atest 是一款命令行工具,用户可以使用它在本地构建、安装和运行 Android 测试,从而大大加快测试重新运行速度,而无需了解 Trade Federation 测试工具命令行选项。本页面介绍了如何使用 Atest 运行 Android 测试。
有关 Android 测试编写的常规信息,请参阅 Android 平台测试。
有关 Atest 整体结构的信息,请参阅 Atest 开发者指南。
有关通过 Atest 在 TEST_MAPPING 文件中运行测试的信息,请参阅在 TEST_MAPPING 文件中运行测试。
要向 Atest 添加功能,请按照 Atest 开发者工作流进行操作。
设置您的环境
要设置您的 Atest 环境,请按照设置环境、选择目标和构建代码中的说明操作。
基本用法
Atest 命令采用以下形式
atest test-to-run [optional-arguments]
可选参数
下表列出了最常用的参数。完整列表可通过 atest --help
获取。
选项 | 长选项 | 描述 |
---|---|---|
-b |
--build |
构建测试目标。(默认) |
-i |
--install |
在设备上安装测试工件 (APK)。(默认) |
-t |
--test |
运行测试。(默认) |
-s |
--serial |
在指定的设备上运行测试。一次可以测试一个设备。 |
-d |
--disable-teardown |
禁用测试拆卸和清理。 |
|
--dry-run |
试运行 Atest,而无需实际构建、安装或运行测试。 |
-m |
--rebuild-module-info |
强制重建 module-info.json 文件。 |
-w |
--wait-for-debugger |
等待调试器完成,然后再执行。 |
-v |
--verbose |
显示 DEBUG 级别日志记录。 |
|
--iterations |
循环运行测试,直到达到最大迭代次数。(默认为 10) |
|
--rerun-until-failure [COUNT=10] |
重新运行所有测试,直到发生故障或达到最大迭代次数。(默认为 10) |
|
--retry-any-failure [COUNT=10] |
重新运行失败的测试,直到通过或达到最大迭代次数。(默认为 10) |
|
--start-avd |
自动创建 AVD 并在虚拟设备上运行测试。 |
|
--acloud-create |
使用 acloud 命令创建 AVD。 |
|
--[CUSTOM_ARGS] |
为测试运行程序指定自定义参数。 |
-a |
--all-abi |
为所有可用的设备架构运行测试。 |
|
--host |
完全在主机上运行测试,无需设备。 注意:运行需要设备的宿主测试时使用 --host 将会失败。 |
|
--history |
按时间顺序显示测试结果。 |
|
--latest-result |
打印最新的测试结果。 |
有关 -b
、-i
和 -t
的详细信息,请参阅指定步骤:构建、安装或运行部分。
指定测试
要运行测试,请使用以下标识符之一指定一个或多个测试
- 模块名称
- 模块:类
- 类名称
- Tradefed 集成测试
- 文件路径
- 软件包名称
使用空格分隔对多个测试的引用,例如:
atest test-identifier-1 test-identifier-2
模块名称
要运行整个测试模块,请使用其模块名称。按照测试的 Android.mk
或 Android.bp
文件中 LOCAL_MODULE
或 LOCAL_PACKAGE_NAME
变量中显示的名称输入该名称。
示例
atest FrameworksServicesTests
atest CtsVideoTestCases
模块:类
要在模块中运行单个类,请使用 模块:类。模块与 模块名称 中描述的相同。类是 .java
文件中测试类的名称,可以是完全限定的类名或基本名称。
示例
atest CtsVideoTestCases:VideoEncoderDecoderTest
atest FrameworksServicesTests:ScreenDecorWindowTests
atest FrameworksServicesTests:com.android.server.wm.ScreenDecorWindowTests
类名称
要在不显式声明模块名称的情况下运行单个类,请使用类名。
示例
atest ScreenDecorWindowTests
atest VideoEncoderDecoderTest
Tradefed 集成测试
要运行直接集成到 TradeFed(非模块)中的测试,请输入其名称,该名称显示在 tradefed.sh list configs
命令的输出中。例如
要运行 reboot.xml
测试
atest example/reboot
atest native-benchmark
文件路径
Atest 支持通过输入测试文件或目录的路径(如适用)来运行基于模块的测试和基于集成的测试。它还支持通过指定类 Java 文件的路径来运行单个类。相对路径和绝对路径均受支持。
运行模块
以下示例展示了使用文件路径运行 CtsVideoTestCases
模块的两种方法。
从 Android repo-root
运行
atest cts/tests/video
从 Android repo-root/cts/tests/video
运行
atest .
运行测试类
以下示例展示了如何使用文件路径在 CtsVideoTestCases
模块中运行特定类。
从 Android repo-root
atest cts/tests/video/src/android/video/cts/VideoEncoderDecoderTest.java
运行集成测试
以下示例展示了如何从 Android repo-root
使用文件路径运行集成测试
atest tools/tradefederation/contrib/res/config/example/reboot.xml
软件包名称
Atest 支持按软件包名称搜索测试。
示例
atest com.android.server.wm
atest com.android.uibench.janktests
指定步骤:构建、安装或运行
使用 -b
、-i
和 -t
选项来指定要运行的步骤。如果您未指定选项,则所有步骤都将运行。
- 仅构建目标:
atest -b 要运行的测试
- 仅运行测试:
atest -t 要运行的测试
- 安装 apk 并运行测试:
atest -it 要运行的测试
- 构建并运行,但不安装:
atest -bt 要运行的测试
Atest 可以强制测试跳过清理或拆卸步骤。许多测试(例如 CTS)在测试运行后清理设备,因此尝试使用 -t
重新运行测试将失败,除非使用 --disable-teardown
参数。在 -t
之前使用 -d
可跳过测试清理步骤并迭代测试。
atest -d test-to-run
atest -t test-to-run
运行特定方法
Atest 支持在测试类中运行特定方法。虽然需要构建整个模块,但这减少了运行测试所需的时间。要运行特定方法,请使用任何受支持的方式(模块:类、文件路径等)标识类,并附加方法名称
atest reference-to-class#method1
指定多个方法时,请用逗号分隔它们
atest reference-to-class#method1,method2,method3
示例
atest com.android.server.wm.ScreenDecorWindowTests#testMultipleDecors
atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval
以下两个示例展示了运行单个方法 testFlagChange
的首选方法。这些示例优于仅使用类名,因为指定模块或 Java 文件位置允许 Atest 更快地找到测试。
使用模块:类
atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange
从 Android repo-root
atest frameworks/base/services/tests/wmtests/src/com/android/server/wm/ScreenDecorWindowTests.java#testFlagChange
可以从不同的类和模块运行多个方法
atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval ScreenDecorWindowTests#testMultipleDecors
运行多个类
要运行多个类,请像运行多个测试一样,用空格分隔它们。Atest 可以高效地构建和运行类,因此指定模块中的类子集可以提高性能,而无需运行整个模块。
要在同一模块中运行两个类
atest FrameworksServicesTests:ScreenDecorWindowTests FrameworksServicesTests:DimmerTests
要在不同模块中运行两个类
atest FrameworksServicesTests:ScreenDecorWindowTests CtsVideoTestCases:VideoEncoderDecoderTest
运行 GTest 二进制文件
Atest 可以运行 GTest 二进制文件。使用 -a
为所有可用的设备架构运行这些测试,在本例中为 armeabi-v7a
(ARM 32 位) 和 arm64-v8a
(ARM 64 位)。
示例输入测试
atest -a libinput_tests inputflinger_tests
要选择要运行的特定 GTest 二进制文件,请使用冒号 (:) 指定测试名称,并使用井号 (#) 进一步指定单个方法。
例如,对于以下测试定义
TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents)
运行以下命令以指定整个测试
atest inputflinger_tests:InputDispatcherTest
或使用以下命令运行单个测试
atest inputflinger_tests:InputDispatcherTest#InjectInputEvent_ValidatesKeyEvents
在 TEST_MAPPING 中运行测试
Atest 可以在 TEST_MAPPING
文件中运行测试。
隐式运行预提交测试
在当前目录和父目录的 TEST_MAPPING
文件中运行预提交测试
atest
在 /path/to/project 及其父目录的 TEST_MAPPING
文件中运行预提交测试
atest --test-mapping /path/to/project
运行指定的测试组
可用的测试组包括:presubmit
(默认)、postsubmit
、mainline-presubmit
和 all
。
在当前目录和父目录的 TEST_MAPPING 文件中运行提交后测试
atest :postsubmit
从 TEST_MAPPING 文件中的所有组运行测试
atest :all
在 /path/to/project 及其父目录的 TEST_MAPPING 文件中运行提交后测试
atest --test-mapping /path/to/project:postsubmit
在 /path/to/project 及其父目录的 TEST_MAPPING 文件中运行主线测试
atest --test-mapping /path/to/project:mainline-presubmit
在子目录中运行测试
默认情况下,Atest 仅在 TEST_MAPPING 文件中向上搜索测试(从当前目录或给定目录到其父目录)。如果您还想在子目录中的 TEST_MAPPING 文件中运行测试,请使用 --include-subdirs
强制 Atest 也包含这些测试
atest --include-subdirs /path/to/project
迭代运行测试
通过传递 --iterations
参数来迭代运行测试。无论测试通过还是失败,Atest 都会重复测试,直到达到最大迭代次数。
示例
默认情况下,Atest 迭代 10 次。迭代次数必须为正整数。
atest test-to-run --iterations
atest test-to-run --iterations 5
以下方法可以更轻松地检测不稳定的测试
方法 1:运行所有测试,直到发生故障或达到最大迭代次数。
- 当发生故障或迭代达到第 10 轮(默认)时停止。
atest test-to-run --rerun-until-failure
- 当发生故障或迭代达到第 100 轮时停止。
atest test-to-run --rerun-until-failure 100
方法 2:仅运行失败的测试,直到通过或达到最大迭代次数。
- 假设
要运行的测试
有多个测试用例,其中一个测试失败。仅运行失败的测试 10 次(默认)或直到测试通过。atest test-to-run --retry-any-failure
- 当失败的测试通过或达到第 100 轮时停止运行。
atest test-to-run --retry-any-failure 100
在 AVD 上运行测试
Atest 能够在新创建的 AVD 上运行测试。运行 acloud create
以创建 AVD 和构建工件,然后使用以下示例运行测试。
启动 AVD 并在其上运行测试
acloud create --local-instance --local-image && atest test-to-run
在测试运行中启动 AVD
atest test-to-run --acloud-create "--local-instance --local-image"
有关更多信息,请运行 acloud create --help
。
将选项传递给模块
Atest 能够将选项传递给测试模块。要将 TradeFed 命令行选项添加到测试运行中,请使用以下结构并确保您的自定义参数遵循 Tradefed 命令行选项格式。
atest test-to-run -- [CUSTOM_ARGS]
将测试模块选项传递给测试配置文件中定义的目标准备器或测试运行程序
atest test-to-run -- --module-arg module-name:option-name:option-value
atest GtsPermissionTestCases -- --module-arg GtsPermissionTestCases:ignore-business-logic-failure:true
将选项传递给运行程序类型或类
atest test-to-run -- --test-arg test-class:option-name:option-value
atest CtsVideoTestCases -- --test-arg com.android.tradefed.testtype.JarHosttest:collect-tests-only:true
有关仅限测试的选项的更多信息,请参阅 将选项传递给模块。