在 Fuchsia 執行 Rust 測試套件

本指南將詳細說明在 模擬的 Fuchsia 圖片。

必要條件

在 Fuchsia 中執行 Rust 測試套件前,您需要具備 建構適用於 Fuchsia 的自訂 Rust 工具鍊。建立 Fuchsia 圖片時, 執行測試套件所需的基礎架構

執行 Rust 測試套件

  1. (選用) 設定自訂暫存目錄:

    export TEST_TOOLCHAIN_TMP_DIR=TEMP_DIR
    

    如未設定臨時目錄,則會命名為 tmp~,且將會 已在 rust_toolchain.py 旁邊建立。如果您使用自訂暫存目錄, 您需要在每個殼層中將 TEST_TOOLCHAIN_TMP_DIR 設為相同路徑 您會透過這些 API 與相同的測試環境互動。

    您可以在不同殼層中將 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
    

調查測試失敗情形

執行測試套件會產生許多記錄檔和其他構件, 我們正在調查失敗的測試套件測試這些類型可轉儲為標準輸出內容 在 fuchsia-test-runner.py stop 期間,如果使用 --verbose 標記啟動 測試環境

路徑 說明
emulator_log 執行中模擬器的記錄。通常內含測試當機或無法啟動的詳細原因。
ffx_daemon_log 執行中 ffx Daemon 的記錄。
package_server_log 執行中 pm 伺服器的記錄。
test_env.json 測試環境的配置設定。如要找出特定詳細資料,例如目前使用的 libstdlibtest,或模擬器的位址,這項功能就能派上用場。
vdl_output 已發布的裝置原型。
ffx_isolate ffx 的隔離環境。你可以在這裡找到 ffx 配置設定。
output 每個測試套件測試 ffx test 的原始輸出內容。每個測試目錄都包含測試執行的所有詳細資料 (ffx)。如要在 emulator_log 中找出特定測試的相關區段,這些程式碼就能派上用場。
packages 每項測試的套件階段。
rust-testing 存放區服務目錄。
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 叫用,快速重新執行單一測試 會在測試執行前立即顯示