跳到主要内容

StarryOS 测试

StarryOS 的测试体系围绕 normal/stress 双分组五种 pipeline 类型(Plain/C/Shell/Python/Grouped)展开。与 ArceOS 不同,StarryOS 编译的是完整的操作系统内核(而非单个 app),因此同一构建组内的所有用例共享同一个 StarryOS 内核镜像。StarryOS 测试还需要 rootfs 支持——测试命令在 rootfs 的用户空间中执行,内核负责提供系统调用和进程管理。

命令

StarryOS 提供 QEMU 和板级两个测试入口,通过 --stress 快捷方式可切换至压力测试组:

# QEMU 测试
cargo xtask starry test qemu --arch <arch> [--test-group <group>] [--stress] [--test-case <case>]
# 板级测试
cargo xtask starry test board [--test-group <group>] [--test-case <case>] [--board <name>] [--board-type <type>] [--server <host>] [--port <port>]

QEMU 测试和板级测试使用不同的命令入口。--stress--test-group stress 的快捷方式,方便运行压力测试组。

板级测试中 --board--board-type 是两个不同用途的参数:

  • --board <name>:按板卡名称过滤 test-suit 中的测试用例(如 orangepi-5-plus
  • --board-type <type>(或 -b):指定物理板卡类型,用于 ostool-server 部署目标选择

两者可以组合使用:--board 控制运行哪些测试用例,--board-type 控制部署到哪块物理板卡。

分组

StarryOS 测试用例按功能分为 normal 和 stress 两个组:

分组路径选择方式
normaltest-suit/starryos/normal/默认
stresstest-suit/starryos/stress/--stress--test-group stress

normal 组包含功能测试(如 smoke、syscall、affinity),stress 组包含压力测试(如并发、长时间运行)。两组的目录结构相同,只是内容不同。默认运行 normal 组,因为 stress 组的测试通常耗时较长。

用例类型

StarryOS 支持全部五种 pipeline 类型,取决于用例目录中是否包含 c/sh/python/ 子目录或 test_commands

  • Plain:仅 qemu-{arch}.toml(如 smokeaffinity
  • C:含 c/ 子目录,CMake 交叉编译(如 bugfixtest-mremap
  • Shell:含 sh/ 子目录(如 busybox
  • Python:含 python/ 子目录(如 python-hello
  • Groupedqemu-{arch}.toml 中使用 test_commands(如 bugfix

QEMU 执行流程

完整的 QEMU 测试流程从 CLI 参数解析开始,经过用例发现、rootfs 准备、资产注入、分组构建到逐 case 运行和结果汇总:

序列图展示了完整的 StarryOS QEMU 测试流程。关键步骤说明:

  1. 参数解析resolve_qemu_test_group_name() 根据 --stress--test-group 参数确定测试组名(normalstress),parse_test_target() 解析目标架构。
  2. 用例发现discover_qemu_cases() 执行 DFS 扫描,返回所有匹配的 StarryQemuCase
  3. rootfs 准备ensure managed rootfs 确保目标架构的 Alpine Linux rootfs 镜像已下载并缓存。
  4. 资产准备prepare_qemu_cases() 为每个用例判定 pipeline 类型、计算缓存键、准备 per-case rootfs。
  5. 分组构建:按 build config 分组后,每组只调用一次 AppContext::build() 编译 StarryOS 内核。
  6. 逐 case 运行:内层循环中,每个用例独立准备资产、运行 QEMU、通过正则判定结果。
  7. 结果汇总finalize_qemu_case_run() 收集所有用例的通过/失败状态,输出结构化报告。

结果报告

StarryOS 测试完成后输出结构化报告:

starry normal qemu summary:
passed (3):
qemu-smp1/smoke (1.23s)
qemu-smp1/syscall (2.45s)
qemu-smp4/affinity (3.67s)
failed (1):
qemu-smp1/bugfix (5.89s)
total: 13.24s

报告按通过和失败分类列出每个用例的 display_name 和耗时,最后给出总耗时。这种格式便于快速定位失败的用例,同时评估整体测试性能。

Board 执行流程

板级测试复用与 QEMU 测试相同的构建和发现基础设施,差异仅在于运行目标为物理板卡:

  1. test-suit/starryos/<group>/ 递归发现 board-*.toml
  2. 每个 board config 关联到最近的 build wrapper
  3. 按 case / board 过滤
  4. 逐组构建 → 加载 board run config → AppContext::board() 运行

StarryOS 板级测试的流程与 QEMU 测试类似,但运行目标从 QEMU 虚拟机切换为物理板卡。每个 board 配置文件通过 nearest_build_wrapper() 向上查找最近的构建配置,复用已有的 build wrapper 定义。AppContext::board() 将编译好的 StarryOS 内核通过 ostool-server 部署到目标板卡,等待串口输出并进行结果判定。