测试基础设施
scripts/axbuild/src/test/ 是三套系统共享的 QEMU/板卡测试编排框架,分为两层:
- 发现与分组层(
test/qemu/):用例发现、build wrapper 分组、QEMU 启动控制、结果聚合和--list渲染。ArceOS、StarryOS、Axvisor 三者共享。 - 资产注入层(
test/case/):rootfs 副本、overlay 注入、rootfs 缓存、grouped runner 协议和六种 pipeline 类型。StarryOS 和 Axvisor 共享;ArceOS 使用自己的 feature-based runner(见 ArceOS 测试),不经过 rootfs 注入。
本文从源码角度描述这套共享框架的核心契约,作为 Std 白名单测试、内核测试 和各系统测试文档(ArceOS、StarryOS、Axvisor)的底层参考。
1. 设计原则
框架围绕一个核心原则展开:OS 只构建一次,逐 case 运行。具有相同 Build Config 的用例归入同一个 build group,组内共享一次内核/hypervisor 编译,随后每个 case 独立准备资产、启动 QEMU、匹配结果。这避免了 N 个用例触发 N 次内核编译。
2. 模块布局
源码按"发现 → 分组 → 资产 → 运行"分层,避免把目录扫描、构建编排和 QEMU 调用耦合在同一处。
| 代码位置 | 作用 |
|---|---|
scripts/axbuild/src/test/mod.rs | 模块根,声明 board/build/case/qemu/std/suite/timing/host_http 子模块 |
scripts/axbuild/src/test/suite.rs | suite/group 根目录解析:suite_root()、group_dir()、discover_group_names() |
scripts/axbuild/src/test/qemu/discovery.rs | QEMU 用例发现:discover_qemu_cases()、nearest_build_wrapper()、build wrapper 解析 |
scripts/axbuild/src/test/qemu/grouping.rs | build group 分组:group_cases_by_build_config()、prepare_case_build_groups() |
scripts/axbuild/src/test/qemu/config.rs | 用例 TOML 字段加载:test_commands、host_http_server、subcase 发现 |
scripts/axbuild/src/test/qemu/boot.rs | QEMU 启动控制:apply_smp_qemu_arg()、smp_from_qemu_arg()、apply_timeout_scale()、qemu_timeout_summary() |
scripts/axbuild/src/rootfs/qemu/ | QEMU rootfs drive 补丁与 RootfsWritePolicy 写入策略 |
scripts/axbuild/src/test/qemu/tree.rs | --list 输出的用例树渲染 |
scripts/axbuild/src/test/qemu/summary.rs | QemuTestSummary 结果聚合 |
scripts/axbuild/src/test/case/types.rs | 核心数据模型:TestQemuCase、CasePipeline、CaseAssetLayout、GroupedCaseRunnerConfig |
scripts/axbuild/src/test/case/assets.rs | 资产准备入口:prepare_case_assets()、resolve_case_pipeline()、rootfs 缓存 |
scripts/axbuild/src/test/case/hash.rs | rootfs 缓存键计算:case_asset_cache_key() |
scripts/axbuild/src/test/case/layout.rs | 每个 case 的工作目录布局:case_asset_layout() |
scripts/axbuild/src/test/case/grouped_runner.rs | grouped runner 脚本生成与 marker 协议 |
scripts/axbuild/src/test/case/cache.rs | rootfs 缓存镜像读写与有效性判断 |
scripts/axbuild/src/test/case/shell.rs | Shell pipeline 资产准备 |
scripts/axbuild/src/test/build/ | C/Python/Rust pipeline 的交叉编译编排(CMake、toolchain、wrappers) |
scripts/axbuild/src/test/host_http.rs | HostHttpServerGuard:测试期 host 侧 HTTP fixture |
scripts/axbuild/src/test/timing.rs | AXBUILD_TIMING: 阶段计时 |
scripts/axbuild/src/test/board.rs | 板级测试的共享发现与运行 |
scripts/axbuild/src/test/std.rs | host 端 std 白名单测试(独立流程,见 Std 白名单测试) |
3. Suite 与 group 发现
suite.rs 定义测试资产的根路径约定:
pub(crate) fn suite_root(workspace_root: &Path, os_name: &str) -> PathBuf {
workspace_root.join("test-suit").join(os_name)
}
os_name 分别是 arceos、starryos、axvisor。discover_group_names() 列出 test-suit/<os>/ 下的子目录作为可用 group;require_group_dir() 在 group 不存在时列出全部支持的 group 名。
三套系统的 group 组织方式不同,但都通过同一个 suite_root 入口发现:
| 系统 | group 布局 |
|---|---|
| ArceOS | rust/、c/ 是预定义 group,也支持自定义 group 目录 |
| StarryOS | test-suit/starryos/ 根目录直接平铺 build wrapper(如 qemu-smp1/) |
| Axvisor | normal/ 作为主测试组 |