使用 atest 测试平台代码

Android Studio for Platform (ASfP) 与 atest 和 Soong 测试模块集成,因此您可以在 Linux 主机、已连接的设备或 Cuttlefish 虚拟设备上通过 IDE 运行和调试平台测试。

前提条件

  • 打开一个使用 AOSP 代码库和 lunch 目标配置的 ASfP 项目。
  • 对于设备测试,请连接实体设备或启动运行匹配 build 的 Cuttlefish 虚拟设备。

运行和调试测试

您可以在 ASfP 中的多个位置启动平台测试和调试会话:

  • Android.bp 测试目标:打开 Android.bp 文件,然后点击任意测试模块(*_test 或 *_test_host)旁边的边线中的运行:
    • 运行:适用于所有 Soong 测试模块类型(android_test、java_test_host、cc_test、rust_test、python_test、sh_test 和 android_robolectric_test)。
    • 调试:适用于 android_test 模块(使用 atest --wait-for-debugger 附加到 Java 调试器)以及 C++ 或 Rust 测试模块(cc_test、cc_test_host、rust_test 和 rust_test_host,在 ASfP 的内置 LLDB 调试器下启动)。
  • 源文件边线图标:点击源代码中测试类或 @Test 方法旁边的运行,以运行或调试该特定测试。
  • 右键点击上下文菜单:右键点击测试文件、类、方法或 Android.bp 模块,然后选择 Run 或 Debug。
  • 内置 Agent(Android Studio 中的 AI):在 Agent 工具窗口中,内置 Agent 可以运行 atest 目标,以验证修改代码后的更改。
  • 集成式终端:打开 View > 工具窗口 > Terminal,直接运行 atest 命令。

智能测试配置和调试

当您从装订线或上下文菜单启动测试时,ASfP 会使用您的 Android.bp 模块图创建并配置 Soong Test 运行配置。

调试 android_test Java 和 Kotlin 目标平台

点击 Android.bp 中 android_test 模块旁边的边线图标,或 Java/Kotlin JUnit 类或 @Test 方法旁边 的边线图标,然后选择 Debug '<TestName>'。从源文件边线中,ASfP 会选择最近的srcs包含该文件的 android_test 模块,并将配置命名为 <module>、<module>:<SimpleClass> 或 <module>:<SimpleClass>#<method>。

ASfP 会使用 --wait-for-debugger 运行 atest,从模块的 AndroidManifest.xml 中读取目标 package 属性,等待连接设备上的相应进程,然后附加 Java 调试器。

通过编辑器边线调试 android_test 方法

在 LLDB 下调试 cc_test 和 rust_test 目标

如需调试 C++ 或 Rust 测试模块(cc_test、cc_test_host、rust_test 或 rust_test_host),请点击 Android.bp 边栏图标,然后选择 Debug '<TestName>'。ASfP 会在其内置的 LLDB 调试器下启动已编译的测试二进制文件,而不是通过 atest 运行该文件。

配置 Soong 测试运行配置

打开 Run > Edit Configurations,然后选择 Soong Test 配置以自定义测试的构建、部署和启动方式:

  • 模块自动补全和 Android.bp 导航:模块字段会根据项目中的已编入索引的 Soong 测试模块自动补全。点击相应字段旁边的 Go to Android.bp,即可跳转到 Android.bp 中的模块声明。
  • 在设备或主机(包括 host_supported: true)上运行:ASfP 会评估模块规则及其传递性 defaults 链(host_supported、device_supported、enabled、target.android.enabled 和 target.host.enabled):
    • 双目标测试(cc_test 和 rust_test,带 host_supported: true):设备和主机单选按钮均可用(默认选择设备)。设备和主机各自维护自己的独立 LLDB 调试器模板。在设备和主机之间切换运行于,可在远程设备 lldb-server 配置和本地主机二进制配置之间切换,同时保留在每个目标平台上所做的自定义设置。
    • 单目标平台测试:如果 C++ 或 Rust 测试仅针对一个环境(例如仅限设备的 cc_test 或仅限主机的 cc_test_host 或 rust_test_host)进行构建,ASfP 会选择受支持的目标平台,并停用不受支持的单选按钮,同时显示说明性提示:“<module> (<ruleType>) doesn't build for the host or device.”
  • 发布前任务(构建原生测试模块并使用 atest 进行部署):每个 Soong 测试配置默认包含两个发布前任务:
    • 构建原生测试模块:在启动 LLDB 之前构建 <module>-target(适用于设备)或 <module>-host(适用于主机)。
    • 使用 atest 进行部署:在设备上调试时,运行 atest <module> --collect-tests-only --disable-teardown -it -s <serial> -- --abi <abi>,以便 Tradefed 在 LLDB 启动二进制文件之前推送测试依赖项并执行目标准备器。将指针悬停在使用 atest 芯片进行部署上,即可预览确切的 atest 命令。为了在依赖项已位于设备上时更快地进行迭代,请移除使用 atest 进行部署,以便 ASfP 直接推送测试二进制文件。如果您选择 Run on: Host,ASfP 会自动跳过 Deploy with atest。
  • 修改选项和调试器(LLDB 选项卡片):使用修改选项添加可选的配置字段:
    • 程序实参(仅限 操作系统、C++ 和 Rust 测试):调试时,在 --gtest_filter 或 libtest 过滤条件之后直接传递给 cc_test 或 rust_test 二进制文件的额外实参。
    • atest 实参(测试):运行测试或使用 Deploy with atest 准备设备时传递给 atest 的额外标志。
    • 调试器(仅限 C++ 和 Rust 测试):当模块为 cc_test* 或 rust_test* 目标时显示。切换 LLDB 选项卡片(例如 Stop on entry、Cache symbols across sessions、Load symbols on demand 或 With Rust visualizers [适用于 Rust 测试]),点击 Reset to defaults 可重置有效的设备或主机模板,或通过修改选项 > 调试器添加符号目录、初始化、预运行、运行后或退出命令以及启动 JSON (DAP 设置)。

显示“启动前任务”“设备或主机目标”和“LLDB 选项”的 Soong 测试运行配置

查看测试结果

测试作业进度、通过或失败状态、堆栈轨迹和设备日志会实时显示在 ASfP 的 Run 或 Debug 工具窗口中。

测试提示

  • 运行目标测试:在编辑器边线中测试单个方法,而无需运行整个测试套件。
  • 使用 Cuttlefish 快照:在 Cuttlefish 虚拟设备上运行设备测试时,使用快照在每次运行之间恢复干净的设备状态。
  • 检查 Soong build 日志:如果测试在运行之前未能成功编译,请检查 Soong 工具窗口中的编译器诊断信息。