Skip to the content.

qemu 如何做测试的

基本尝试

看来 unit test 也是链接所有的东西

🧀  l tests/unit/test-aio
Permissions Size User     Date Modified Name
.rwxr-xr-x   11M martins3  6 Jan 21:58   tests/unit/test-aio
🧀  make check-help
Regression testing targets:
 make check                    Run block, qapi-schema, unit, softfloat, qtest and decodetree tests
 make bench                    Run speed tests

Individual test suites:
 make check-qtest-TARGET       Run qtest tests for given target
 make check-qtest              Run qtest tests
 make check-functional         Run python-based functional tests
 make check-functional-TARGET  Run functional tests for a given target
 make check-unit               Run qobject tests
 make check-qapi-schema        Run QAPI schema tests
 make check-tracetool          Run tracetool generator tests
 make check-block              Run block tests
 make check-tcg                Run TCG tests
 make check-softfloat          Run FPU emulation tests

 make check-report.junit.xml   Generates an aggregated XML test report
 make check-venv               Creates a Python venv for tests
 make check-clean              Clean the tests and related data

The following are useful for CI builds
 make check-build              Build most test binaries


The variable SPEED can be set to control the gtester speed setting.
Default options are -k and (for make V=1) --verbose; they can be
changed with variable GTESTER_OPTIONS.

[!NOTE] 参考神奇海螺的意见,有待验证

总结

可以用被修改代码的边界判断应该添加什么测试

一个比较理想的设备修复通常是:

小型 qtest 精确复现 bug + functional test 验证真实 guest 场景(必要时)

前者负责快速、稳定、精确地防止回归;后者负责确认完整系统组合确实工作。

• QEMU 的测试可以理解成一套“分层验证体系”:越靠下越快、越精确,越靠上越接近真实虚拟机,但更慢、变量也更多。

测试类型 驱动对象 主要验证 ━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Unit test 直接调用 C 函数 数据结构、算法、公共组件 ─────────────────────── ──────────────────────────────────── ────────────────────────────────────── qtest 启动 QEMU,但通常不运行 guest CPU PCI/virtio/中断/DMA 等设备模型 ─────────────────────── ──────────────────────────────────── ────────────────────────────────────── Functional test 启动完整虚拟机和 guest payload 启动、固件、设备、整机功能 ─────────────────────── ──────────────────────────────────── ────────────────────────────────────── qemu-iotests QEMU block layer、qemu-img、NBD 等 qcow2、快照、块任务、错误路径 ─────────────────────── ──────────────────────────────────── ────────────────────────────────────── check-tcg 在目标架构执行小程序 指令翻译、异常、系统调用 ─────────────────────── ──────────────────────────────────── ────────────────────────────────────── Schema/generator test 输入与参考输出对比 QAPI、decodetree、tracetool 等生成器

  make check-help
  make check
  make check-unit
  make check-qtest
  make check-functional
  make check-block
  make check-tcg

当前源码里的入口可见 tests/Makefile.include:3,总说明在 docs/devel/testing/main.rst:1。

qtest

./qtest.md 中分析

Unit test

单元测试会编译成普通的宿主机测试程序,把部分 QEMU object 链接进去,然后直接调用接口: 源码通常在 tests/unit,由 GLib 的 g_test 框架组织。

类似这种

  result = function_under_test(input);
  g_assert_cmpint(result, ==, expected);

Functional test:启动真实的虚拟机测试

说明见 docs/devel/testing/functional.rst

Functional test 通常是 Python 测试,使用 QemuSystemTest 启动完整 QEMU,加载 kernel、initrd、固件或磁盘镜像,然后通过:

判断测试是否成功。

例如:

启动 ARM 开发板模型 → 加载 Linux kernel → 等待串口出现登录提示 → 执行或观察某项功能 → 检查输出

它能覆盖 qtest 覆盖不到的组合:

CPU + firmware + machine + device + guest kernel

代价是启动慢、可能需要下载测试镜像,而且更容易受到超时、网络和 guest 行为影响。

入口是:

make check-functional make check-functional-x86_64

领域专用

qemu-iotests:块层的专门测试

测试

  ./check -qcow2
  ./check -raw
  ./check -qcow2 001 030 153

check-tcg:验证 CPU 翻译执行

TCG 测试与 qtest 恰好相反:

基本过程:

交叉编译一个目标架构的小程序 → 用 qemu-aarch64 或 qemu-system-aarch64 执行 → 检查寄存器、内存、异常或程序退出结果

它可以验证:

通常需要目标架构的交叉编译器:

make check-tcg make run-tcg-tests-aarch64-linux-user

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。