整合測試

由於 ffx 主要為開發人員設計,因此會檢查目前的環境設定,並在背景啟動精靈,協調與 Fuchsia 裝置的通訊。這會導致編寫使用 ffx 的自動化測試更加複雜,因為設定和 Daemon 應隔離,以免測試之間產生副作用,或受到全域環境干擾。

為解決這個問題,ffx 可在隔離環境中執行,以便在整合測試中使用。

手動設定隔離

為達成這項隔離作業,ffx 支援使用隔離目錄。這項功能會為 ffx 指定新的獨立執行環境,包括使用者層級的設定。這個目錄也會建立 ascendd 插座,也就是與 ffx Daemon 的連線。

所有使用隔離區的 ffx 呼叫都必須在 ffx 指令列上指定,並加上 --isolate-dir 選項。您也可以設定 __FFX_ISOLATE_DIR__ 環境變數來指定這項設定。

以下是虛擬 Shell 指令碼,詳細說明設定步驟和指令,確保 ffx 是密封的:

# Write all configuration and state to the isolate directory, using mktemp or
# something similar.
export FFX_ISOLATE_DIR = ...

# Disable analytics:
ffx config set ffx.analytics.disabled true
# Don't discover devices via mDNS:
ffx config set discovery.mdns.enabled false
# Don't discover fastboot devices connected via USB:
ffx config set fastboot.usb.disabled true
# Require manual process management for the daemon:
# If interacting with a device:
ffx target add "$FUCHSIA_DEVICE_ADDR"
export FUCHSIA_NODENAME="$FUCHSIA_DEVICE_ADDR"

測試完成後,測試作者必須清理隔離目錄。

樹狀結構內 Rust 分離程式庫

在 Fuchsia 來源樹狀結構中,使用 Rust 程式設計語言的開發人員應在測試中使用 //src/developer/ffx/lib/isolate,建立並與隔離目錄互動。

隔離區程式庫會自動遵循上述手動設定指南,並在捨棄時清除隔離區目錄。

初始化測試的全域環境

為避免從主機環境初始化全域內容,測試需要建立測試環境來初始化全域資料。捨棄回傳值時,系統會清除環境,因此環境必須在測試生命週期內處於範圍內。

let test_env = ffx_config::test_init().await?;

建立隔離區

視 ffx 運作的環境而定,建立新 Isolate 的方法有兩種。如要測試在樹狀結構內測試中執行,並依賴建構輸出目錄結構,請使用 Isolate::new_in_test()。如要測試 ffx 子工具或 SDK,請使用 Isolate::new_in_sdk()。如果測試會與外部佈建的裝置互動,也應傳遞 SSH 私密金鑰的路徑。如果測試正在初始化裝置或啟動模擬器,系統會視需要產生 SSH 金鑰,但建立隔離區後,您必須設定金鑰的儲存路徑。

當隔離區遭捨棄時,系統會清除隔離區目錄,因此隔離區必須在整個測試期間存在。

範例 Isolate::new_in_test()

  let test_case_name = "my test";
  let ssh_path = std::env::var("FUCHSIA_SSH_KEY").unwrap().into();
  let test_env = ffx_config::test_init().await
      .expect("Setting up test environment");
  // This takes advantage of knowing that Rust tests are down one level from the
  // build output root directory.
  let build_root =
        std::env::current_exe().unwrap().canonicalize().unwrap().parent().unwrap().to_owned();
  let isolate = ffx_isolate::Isolate::new_in_test(test_case_name,
                                                  build_root,
                                                  ssh_path,
                                                  &test_env.context).await
            .expect("create isolate");

Example Isolate::new_in_sdk()

  let test_case_name = "my test";
  let ssh_path = std::env::var("FUCHSIA_SSH_KEY").unwrap().into();
  let test_env = ffx_config::test_init().await
      .expect("Setting up test environment");
  let isolate = ffx_isolate::Isolate::new_with_sdk(test_case_name, ssh_path, &test_env.context)
            .await
            .expect("create isolate");

執行 ffx 指令

如要在隔離區的環境中執行指令,請使用 Isolate::ffx() 方法。 這個包裝函式會將正確的選項新增至 ffx 指令列,以使用隔離目錄。

let output = isolate.ffx(&["target", "list"]).await?;

隔離區內的設定

如要設定獨立空間內 ffx 的值和預設值,請使用 ffx config 指令列:

let args = ["config", "set", "ssh.pub", &path_to_ssh_authorized_keys.to_string_lossy()];
let output = isolate.ffx(&args).await?;

記錄檔

使用隔離區時,ffx 的記錄檔路徑會在建立隔離區時設定。 測試架構通常會為需要做為測試輸出內容存取的檔案,設定 __FUCHSIA_TEST_OUTDIR__ 環境變數。如果已設定,記錄目錄會在 __FUCHSIA_TEST_OUTDIR__ 的子目錄中建立。使用 log_dir() 即可存取記錄目錄的路徑。

let log_dir = isolate.log_dir();

預設目標

部分測試架構可能會為測試分配裝置。隔離區會讀取 __FUCHSIA_DEVICE_ADDR__ 環境變數,並在設定中設為預設目標。

mdns

Analytics 設定

隔離區會透過設定停用資料分析收集功能。