在 Fuchsia 上运行 Rust 测试套件

本指南详细介绍了在 模拟 Fuchsia 图像。

前提条件

在 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-build $DEV_ROOT/rust/build/fuchsia-rust \
      --sdk $DEV_ROOT/sdk \
      --target x86_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 调用来快速重新运行单个测试 。