集成测试

由于 ffx 主要是为开发者设计的,因此它会检查当前环境 用于配置,并在后台启动守护程序以协调通信 支持 Fuchsia 设备。这使得编写自动化测试来使用 ffx,因为应隔离配置和守护程序,以避免发生端 测试之间的各种影响,或来自全局环境的干扰。

为了解决此问题,ffx 可以在隔离的环境中运行,以便在 集成测试

手动隔离设置

为了实现这种隔离,ffx 支持使用隔离目录。此功能 为 ffx 指定新的隔离环境(包括用户级别) 配置。ascendd 套接字(即与 ffx 守护程序的连接) 其他目录。

使用隔离的所有 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:
ffx config set daemon.autostart false

# If needed, start daemon:
# ffx outputs log files under $FUCHSIA_TEST_OUTDIR/ffx_logs by default.
LOG_DIR = "$FUCHSIA_TEST_OUTDIR/ffx_logs"
# Redirect stdout and stderr to the log file
ffx daemon start > "$LOG_DIR/ffx.daemon.log" 2> "$LOG_DIR/ffx.daemon.log" &

# If interacting with a device:
ffx config target.default "$FUCHSIA_DEVICE_ADDR"
ffx target add "$FUCHSIA_DEVICE_ADDR"

测试完成后,测试作者需要清理 Espresso 目录。正在删除 该目录会关闭守护程序;推荐使用 ffx daemon stop,但不作强制要求。杀戮 不推荐使用守护进程,因为它可能会在日志文件中遗漏信息。

树内 Rust 隔离库

在 Fuchsia 源代码树中,使用 Rust 编程语言的开发者应使用 //src/developer/ffx/lib/isolate 在测试中构建和互动 分别创建隔离目录

隔离库会自动按照上面的手动设置指南进行清理, 拖放隔离目录

初始化测试的全局上下文

为避免从承载环境初始化全局上下文,测试需要创建 用于初始化全局数据的测试环境。从外部开始, 返回值,因此必须在测试生命周期内始终保持有效状态。

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

创建隔离

您可以通过两种方法创建新的隔离,具体取决于环境 FFX 运作方式。对于作为树内测试的一部分运行的测试 依赖于 build 输出目录结构,请使用 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");

示例 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::start_daemon() 方法手动启动 ffx 守护程序。非 所有命令都依赖于守护程序,有些命令(如 ffx config set)可能需要 在启动守护程序之前运行。

let _ = isolate.start_daemon().await?;

注意:直接运行 ffx daemon start 不会启动可正常运行的守护程序。

运行 ffx 命令

如需在隔离的上下文中运行命令,请使用 Isolate::ffx() 方法。 此封装容器会将正确的选项添加到 ffx 命令行中,以使用隔离目录。

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

隔离内的配置

您可以使用 ffx config 在隔离中配置 ffx 的值和默认值。 命令行:

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__ 环境变量,并将其设置为 配置。

Google Analytics 配置

隔离会停用通过配置收集分析数据的功能。