运行测试 (Atest)

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.mkAndroid.bp 文件中 LOCAL_MODULELOCAL_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

要运行 native-benchmark.xml 测试

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(默认)、postsubmitmainline-presubmitall

在当前目录和父目录的 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

有关仅限测试的选项的更多信息,请参阅 将选项传递给模块