Skip to content

005-05: 测试基建总结

整体架构

Cinux 测试基础设施采用双模式架构,支持在宿主机和真实内核环境中运行测试:

展开代码 (共 31 行)收起代码
┌─────────────────────────────────────────────────────────────┐
│                      Cinux 测试架构                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────┐      ┌──────────────────────┐    │
│  │   Host 端测试       │      │   内核端测试         │    │
│  │   (test/unit/)      │      │   (kernel/mini/test/)│    │
│  ├─────────────────────┤      ├──────────────────────┤    │
│  │ • test_smoke.cpp    │      │ • main_test.cpp      │    │
│  │ • test_kprintf_...  │      │ • test_cpp_basic.cpp │    │
│  └──────────┬──────────┘      └──────────┬───────────┘    │
│             │                            │                  │
│             ▼                            ▼                  │
│  ┌─────────────────────┐      ┌──────────────────────┐    │
│  │  g++ / Linux        │      │  -ffreestanding      │    │
│  │  CINUX_HOST_TEST    │      │  QEMU 内核模式        │    │
│  └──────────┬──────────┘      └──────────┬───────────┘    │
│             │                            │                  │
│             └────────────┬───────────────┘                  │
│                          ▼                                  │
│             ┌────────────────────────────┐                  │
│             │  自研测试框架               │                  │
│             │  test_framework.h          │                  │
│             └────────────┬───────────────┘                  │
│                          ▼                                  │
│             ┌────────────────────────────┐                  │
│             │  CMake / CTest             │                  │
│             │  make test                 │                  │
│             └────────────────────────────┘                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

文件清单

测试框架

文件描述
test/framework/test_framework.h自研轻量测试框架

Host 测试

文件描述
test/CMakeLists.txtHost 测试构建配置
test/unit/test_smoke.cpp冒烟测试
test/unit/test_kprintf_format.cpp格式化函数测试

内核测试

文件描述
kernel/mini/test/CMakeLists.txt内核测试构建配置
kernel/mini/test/main_test.cpp内核测试入口
kernel/mini/test/test_cpp_basic.cppC++ 运行时测试

自动化

文件描述
scripts/run_all_tests.sh.in测试运行脚本模板
cmake/qemu.cmakeQEMU 测试配置

测试覆盖情况

已覆盖组件

组件测试文件覆盖率
测试框架本身test_smoke.cpp✓ 基础功能
格式化函数test_kprintf_format.cpp✓ 全部格式符
C++ 运行时test_cpp_basic.cpp✓ 基础特性
kprintf 输出main_test.cpp✓ 格式化验证

待覆盖组件

组件状态
物理内存管理 (PMM)
虚拟内存管理 (VMM)
中断处理 (IDT/IRQ)
键盘驱动
定时器
进程/线程

测试命令速查表

展开代码 (共 21 行)收起代码
bash
# === 构建配置 ===
cmake -DCMAKE_BUILD_TYPE=Debug -DCINUX_BUILD_TESTS=ON -B build
cd build

# === Host 测试 ===
make test_host              # 运行所有 Host 测试
make test_verbose           # 详细模式
make test_smoke_run         # 冒烟测试

# === 内核测试 ===
make run-kernel-test        # 自动退出
make run-kernel-test-interactive  # 交互式
make run-kernel-test-debug  # 调试模式

# === 统一测试 ===
make test                   # 运行所有测试(推荐)

# === CTest 直接调用 ===
ctest --output-on-failure   # 运行所有测试
ctest -R smoke              # 按名称过滤
ctest -L kprintf_format     # 按标签过滤

设计亮点

1. 双模式复用

同一套格式化代码 (format.cpp) 可在 Host 和内核环境中测试:

cpp
// Host 测试直接引用内核实现
#include "mini/lib/private/format.h"
TEST("kprintf: decimal positive") {
    char buffer[64];
    int len = format_decimal(42, buffer, sizeof(buffer));
    ASSERT_EQ(std::string(buffer), "42");
}

2. 自动退出机制

使用 QEMU 的 isa-debug-exit 设备实现自动化测试:

asm
outl %eax, $0xf4    # 退出码 = (value << 1) | 1

3. 平台抽象层

测试框架通过宏实现平台无关:

cpp
#ifdef CINUX_HOST_TEST
    #define _TEST_PRINT(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
    #define _TEST_PRINT(fmt, ...) serial_printf(fmt, ##__VA_ARGS__)
#endif

改进建议

短期改进

  1. 添加覆盖率工具:集成 gcov/lcov

    makefile
    add_compile_options(-fprofile-arcs -ftest-coverage)
    link_libraries(gcov)
  2. 添加 CI 配置:创建 .github/workflows/test.yml

    yaml
    name: Tests
    on: [push, pull_request]
    steps:
      - uses: actions/checkout@v3
      - run: cmake -DCINUX_BUILD_TESTS=ON -B build
      - run: make -C build test
  3. 增加测试断言

    • ASSERT_STREQ(s1, s2) - 字符串比较
    • ASSERT_NEAR(a, b, epsilon) - 浮点近似
    • ASSERT_IN_RANGE(val, min, max) - 范围检查

中期改进

  1. 测试夹具 (Fixture):支持测试前/后钩子
  2. 参数化测试:同一测试用例多组数据
  3. Mock 框架:模拟硬件依赖

长期改进

  1. 模糊测试:随机输入测试
  2. 性能测试:基准测试框架
  3. 压力测试:长时间稳定性测试

相关链接

035_multi_terminal-40-g5d72b8b · 5d72b8b · 2026-06-26