测试流程
AxVisor 的测试流程基于 axci 仓库提供的统一测试脚本和 GitHub Actions 工作流。测试分为自动测试(CI)和本地测试两种方式。
统一测试脚本(axci)
axci 仓库是整个测试流程的核心,提供了所有测试相关的脚本和工作流配置。
仓库地址:https://github.com/arceos-hypervisor/axci
axci 仓库结构
axci/
├── .github/
│ └── workflows/ # GitHub Actions 工作流
│ ├── check.yml # 代码质量检查
│ ├── test.yml # 集成测试
│ ├── deploy.yml # 文档部署
│ ├── release.yml # 版本发布
│ └── verify-tag.yml # 标签验证
├── check.sh # 本地代码质量检查脚本
├── tests.sh # 本地集成测试脚本
└── README.md # 使用文档
提供的测试工具
| 类型 | 工具 | 用途 |
|---|---|---|
| CI 工作流 | .github/workflows/*.yml | GitHub Actions 自动化测试 |
| 本地脚本 | check.sh | 代码质量检查(fmt、clippy、build、doc) |
| 本地脚本 | tests.sh | 本地集成测试(QEMU + Board) |
使用方式
axci 中的测试工具不直接使用,而是在各组件仓库中被调用:
- 自动测试:通过 GitHub Actions 的
workflow_call机制引用 - 本地测试:通过组件仓库的
scripts/check.sh和scripts/test.sh调用
自动测试(CI)
自动测试通过 GitHub Actions 实现,在代码提交、创建 Pull Request 或推送标签时自动触发。
重要说明:CI 测试使用完整自建的本地集成测试环境, 包括所有测试设备(QEMU 虚拟机和物理开发板),能够执行完整的测试矩阵。
CI 工作流配置
axci 共享工作流
axci 仓库提供了 5 个核心工作流:
| 工作流 | 功能 | 触发方式 |
|---|---|---|
| check.yml | 代码质量检查(fmt、clippy、build、doc) | push、pull_request |
| test.yml | 集成测试(QEMU + Board) | push、pull_request、workflow_dispatch |
| verify-tag.yml | 验证版本标签(分支、版本一致性) | 被其他工作流调用 |
| deploy.yml | 部署文档到 GitHub Pages | push tag v*.. |
| release.yml | 创建 Release 并发布到 crates.io | push tag v*.. |
工作流执行流程:
组件仓库 CI 配置
以 arm_vcpu 为例,展示如何使用 axci 的共享工作流。
1. Check 工作流配置 (arm_vcpu/.github/workflows/check.yml)
# Quality Check Workflow
# References shared workflow from axci
name: Check
on:
push:
branches: ['**']
tags-ignore: ['**']
pull_request:
workflow_dispatch:
jobs:
check:
uses: arceos-hypervisor/axci/.github/workflows/check.yml@main
这个配置会在以下情况触发:
- 推送到任何分支(排除标签)
- 创建 Pull Request
- 手动触发
2. Test 工作流配置 (arm_vcpu/.github/workflows/test.yml)
# Integration Test Workflow
# References shared workflow from axci
name: Test
on:
push:
branches:
- '**'
tags-ignore:
- '**'
pull_request:
workflow_dispatch:
jobs:
test:
uses: arceos-hypervisor/axci/.github/workflows/test.yml@main
这个配置会在代码提交时自动运行集成测试,测试会在 self-hosted runner 上执行。
3. Release 和 Deploy 工作流配置
# Release Workflow
name: Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-pre.[0-9]+'
jobs:
release:
uses: arceos-hypervisor/axci/.github/workflows/release.yml@main
with:
verify_branch: true
verify_version: true
secrets:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
# Deploy Workflow
name: Deploy
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
jobs:
deploy:
uses: arceos-hypervisor/axci/.github/workflows/deploy.yml@main
with:
verify_branch: true
verify_version: true
自定义工作流参数
axci 的工作流支持自定义参数。例如,可以指定编译目标、Rust 组件、测试目标等。详细参数配置请参考 axci 仓库文档。
集成测试执行流程
集成测试的核心是 test.yml 工作流,它采用矩阵策略并行执行多个测试任务。
详细步骤说明:
1. Filter test targets(过滤测试目标)
根据 test_targets 输入参数决定是否执行测试:
all:运行所有测试axvisor:仅运行 axvisor 测试starry:仅运行 starry 测试- 也可以指定具体的测试目标,如
axvisor-qemu-aarch64-arceos
2. Checkout component(检出组件)
将被测组件代码检出到 component/ 目录。
3. Checkout test target(检出测试目标)
检出测试目标仓库到相应目录:
- Axvisor:
https://github.com/arceos-hypervisor/axvisor - Starry:
https://github.com/Starry-OS/StarryOS
4. Get component crate name(获取 crate 名称)
从组件的 Cargo.toml 中自动检测 crate 名称,或使用输入参数。
5. Apply patch to Cargo.toml(应用补丁)
通过 [patch.crates-io] 覆盖测试目标对组件的依赖:
[patch.crates-io]
arm_vcpu = { path = "../component" }
这样,测试目标在构建时会使用本地检出的组件代码,而不是 crates.io 上的版本。
6. Install dependencies(安装依赖)
安装测试所需的工具,如 ostool。
7. Run tests(运行测试)
根据测试类型执行不同的测试命令:
-
QEMU 测试:
cargo xtask qemu \
--build-config configs/board/qemu-aarch64.toml \
--qemu-config .github/workflows/qemu-aarch64.toml \
--vmconfigs configs/vms/arceos-aarch64-qemu-smp1.toml -
Board 测试:
cargo xtask uboot \
--build-config configs/board/phytiumpi.toml \
--uboot-config .github/workflows/uboot.toml \
--vmconfigs configs/vms/arceos-aarch64-e2000-smp1.toml \
--bin-dir /home/runner/tftp