前言:QEMU系统测试非常完整,除了外部的gdb代码调试,还有自带的单元测试,功能测试,CI集成测试等全面覆盖。这里gdb代码调试就不再赘述,网上一大堆。test文档可见qemu/docs/devel/testing.rst。
测试开始前先进行编译qemu
./configure --target-list=arm-softmmu && make
整体命令 make check
help命令 make check-help
一.单元测试
无需启动qemu,直接运行测试代码,获取调试信息。
make check-unit
之后会在tests目录下生成可执行文件,直接执行即可,无需启动qemu。
如果想自己写单元测试可以打开
qemu/tests/Makefile.include
加入测试目标check-unit-y +=
指定关联关系tests/foo-test$(EXESUF):
测试代码路径qemu/tests/unit/meson.build将自己的测试名加入tests数组里就行了。
二.功能测试
功能测试主要是qtest使用socket与qemu通信获取qemu的信息,和glib测试原理相同。
make check-qtest V=1
也可以自己添加测试单元
加入测试目标check-unit-y +=
指定关联关系tests/qom-test$(EXESUF):
测试代码路径qemu/tests/unit/meson.build将自己的测试名加入tests数组里就行了。
qtest每次start都会创建两个socket用于与qemu通信,分别是qtest,qmp
g_test_int初始化glib测试框架
qtest_init/qtest_start启动qemu
qtest_add_func添加执行单个用例
g_test_run运行用例
qtest_qmp发送qmp命令给到qemu运行指定操作
qtest:执行命令
功能测试需要启动qemu,然后启动相应的qtest程序
#QTEST_LOG=1 QTEST_QEMU_BINARY=arm-softmmu/qemu-system-arm QTEST_QEMU_IMG=qemu-img tests/test-name -m=quick -k --tap < /dev/null | ./scripts/tap-driver.pl --test-name="test-name"
对应的qemu
"exec %s " "-qtest unix:%s " "-qtest-log %s " "-chardev socket,path=%s, id=char0 " "-mon chardev=char0, mode=control " "-display none " "%s" " -accel qtest", qemu_binary,socket_path, getenv("QTEST_LOG")?"/dev/fd/1" : "dev/null",qmp_socket_path, extra_args?:" "
qemu_binary是QTEST_QEMU_BINARY指定的程序,-mon指定qmp