在 Fuchsia 上运行 Rust 测试套件

本指南详细介绍了在模拟的 Fuchsia 映像上运行 Rust 编译器测试套件的过程。

前提条件

在 Fuchsia 上运行 Rust 测试套件之前,您需要为 Fuchsia 构建自定义 Rust 工具链。运行测试套件不需要构建 Fuchsia 映像。

运行 Rust 测试套件

  1. (可选)设置自定义临时目录:

    export TEST_TOOLCHAIN_TMP_DIR=TEMP_DIR
    

    如果未设置临时目录,则其将命名为 tmp~,并将在 rust_toolchain.py 旁边创建。如果您使用自定义临时目录,则需要在用于与同一测试环境交互的每个 shell 中将 TEST_TOOLCHAIN_TMP_DIR 设置为相同的路径。

    您可以在不同 shell 中将 TEST_TOOLCHAIN_TMP_DIR 设置为不同的值,以同时管理多个测试环境。

  2. 启动测试环境:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=RUST_SRC/src/ci/docker/scripts/fuchsia-test-runner.py
    python3 $TEST_TOOLCHAIN start \
      --rust $DEV_ROOT/rust/install/fuchsia-rust \
      --sdk $DEV_ROOT/sdk \
      --target x64_64|arm64-unknown-fuchsia
    
  3. 运行 Rust 测试套件:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=RUST_SRC/src/ci/docker/scripts/fuchsia-test-runner.py
    ( \
      source $DEV_ROOT/rust/fuchsia-env.sh && \
      $DEV_ROOT/rust/x.py \
        --config $DEV_ROOT/rust/fuchsia-config.toml \
        --stage=2 \
        test TEST_SUITE \
        --target x86_64|aarch64-unknown-fuchsia \
        --run=always \
        --jobs 1 \
        --test-args --target-rustcflags \
        --test-args -L \
        --test-args --target-rustcflags \
        --test-args $DEV_ROOT/sdk/arch/x64|a64/sysroot/lib \
        --test-args --target-rustcflags \
        --test-args -L \
        --test-args --target-rustcflags \
        --test-args $DEV_ROOT/sdk/arch/x64|a64/lib \
        --test-args --target-rustcflags \
        --test-args -Cpanic=abort \
        --test-args --target-rustcflags \
        --test-args -Zpanic_abort_tests \
        --test-args --remote-test-client  \
        --test-args $TEST_TOOLCHAIN \
    )
    

    测试结果将输出为标准输出。

  4. 停止测试环境:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=RUST_SRCsrc/ci/docker/scripts/fuchsia-test-runner.py
    python3 $TEST_TOOLCHAIN stop
    

调查测试失败情况

运行测试套件会生成许多日志和其他工件,以帮助调查失败的测试套件测试。如果使用 --verbose 标志启动了测试环境,则可以在 fuchsia-test-runner.py stop 期间将这些内容转储到标准输出。

路径 说明
emulator_log 来自正在运行的模拟器的日志。其中通常包含有关测试崩溃或启动失败的原因的详细信息。
ffx_daemon_log 来自正在运行的 ffx 守护程序的日志。
package_server_log 来自正在运行的 pm 服务器的日志。
test_env.json 测试环境的配置设置。这对于查找具体详细信息(例如正在使用的 libstdlibtest)或模拟器地址非常有用。
vdl_output 已发布设备的 proto。
ffx_isolate ffx 的隔离环境。您可以在此处找到 ffx 配置设置。
output 每个测试套件测试的 ffx test 的原始输出。每个测试目录都包含 ffx 收到的关于测试作业的所有详细信息。这对于在 emulator_log 中查找特定测试的相关部分非常有用。
packages 每个测试的软件包阶段。
rust-testing 代码库服务目录。
ssh 测试运行程序用于访问正在运行的模拟器的 SSH 密钥。它们可用于通过 ssh -i ssh/fuchsia_ed25519 EMULATOR_ADDRESS 登录模拟器。模拟器地址可以位于 test_env.json 中。

调试测试失败问题

  1. 读取测试中的标准输出和错误。此文件可以在测试的 output 目录中找到,并且会通过 compiletest 进行报告。
  2. 检查详细的模拟器日志。您可以在 emulator_log 中搜索与 output 目录的名称匹配的测试名称,找到这些测试。
  3. 使用 zxdb 调试测试。您可以通过运行以下命令轻松附加到测试:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=RUST_SRC/src/ci/docker/scripts/fuchsia-test-runner.py
    python3 $TEST_TOOLCHAIN debug \
      --rust-src RUST_SRC \
      --test TEST_PATH
    

    然后,设置任何相关断点,并使用以下命令运行测试:

    DEV_ROOT=DEV_ROOT
    TEST_TOOLCHAIN=RUST_SRC/src/ci/docker/scripts/fuchsia-test-runner.py
    ( \
      source $DEV_ROOT/rust/fuchsia-env.sh && \
      $DEV_ROOT/rust/x.py \
        --config $DEV_ROOT/rust/fuchsia-config.toml \
        --stage=2 \
        test TEST_SUITE \
        --target x86_64|aarch64-fuchsia \
        --run=always \
        --jobs 1 \
        --test-args --target-rustcflags \
        --test-args -L \
        --test-args --target-rustcflags \
        --test-args $DEV_ROOT/sdk/arch/x64|a64/sysroot/lib \
        --test-args --target-rustcflags \
        --test-args -L \
        --test-args --target-rustcflags \
        --test-args $DEV_ROOT/sdk/arch/x64|a64/lib \
        --test-args --target-rustcflags \
        --test-args -Cpanic=abort \
        --test-args --target-rustcflags \
        --test-args -Zpanic_abort_tests \
        --test-args --remote-test-client  \
        --test-args $TEST_TOOLCHAIN \
        --rustc-args -Cdebuginfo=2 \
        --rustc-args -Copt-level=0 \
        --rustc-args  -Cstrip=none \
    )
    

    zxdb 会捕获所有崩溃并在您定义的任何断点处中断。此命令与上面的命令相同,只是添加了用于调试的 -C debuginfo=2 -C opt-level=0 标志。

提示

如需加强迭代循环,您可以使用 -vv 参数运行 x.py test,让 compiletest 输出其运行的确切命令。您可以通过在运行测试前立即运行输出的 compiletest 调用来快速重新运行单个测试。