由于 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 配置
隔离会停用通过配置收集分析数据的功能。