本文章主要介绍mugen入门的一些经验,包括如何配置与执行特定测试用例(mugen官网有更加详细的介绍)、出错用例可能的一些分类、如何解决、在什么场景下需要提交issue/pr,方便OERV的各位佬们快速地入门mugen。
配置首先需要bash dep_install.sh
安装mugen的依赖,然后通过bash mugen.sh -c --ip $ip --password $passwd --user $user --port $port
配置mugen环境,其中ip是测试机的ip地址,user是用户名(默认为root),password是密码,port是端口(默认为22)。
在完成配置后,即可开始执行。一般常用的命令包括:
bash mugen.sh -f testsuit -x
bash mugen.sh -f testsuit -r testcase -x
前者执行测试套testsuit下的所有测试用例,后者仅执行testsuit下的testcase用例。-x
选项用于将日志文件输出到log/testsuit/testcase
下。
值得注意的是,log
文件夹是我们出错时必须看的,同时也是我们修复测试用例的依靠之一,在出错时最好仔细地查看log
,很可能一些重要的信息就隐藏在log
不起眼的地方。
这一节主要基于我修复过的mugen执行失败用例而做的总结,很可能出现测试用例并不在这些分类中、有其他修复思路等情况,欢迎各位佬们提出宝贵的经验qwq
这一类错误在新版本,比如RISCV 24.03
、x86 24.03
中比较常见,主要是由于对应的rpm包还没构建出来。在log
中,会显示unable to find a match
,比如下图,找不到nvml
的rpm包。
可能解决方案:需要引入rpm包。
往src-openeuler的对应仓库中提交引入rpm包的issue,包括OS版本信息。
这一类错误主要是因为测试用例基于旧的包版本,跟新的包版本存在一定的差异,包括:
- 不再支持参数选项,或者选项更改了名字,或者传入的参数发生变化。比如,在旧版本下,显示版本信息是
-v
,但是新版本下,显示版本信息是-V
。 - 不再支持命令,可能是该命令被移除,也有可能是整合到其他命令中了。比如,pylint的测试用例中,原有的命令
epylint
已经被整合到pylint
命令中。 - 输出差异,在执行操作后,新旧版本的输出存在不同。比较特殊的例子是抓取版本信息的用例,可能会因为更新后版本信息不同而存在差异。最好通过
$(rpm -qa xxxx) | awk -F- '{print $xxx}'
抓取版本信息,然后再检查版本。 - API改变,多见于.c、.cpp、.java等源码文件所使用的API接口发生了改变,需要查看官方文档,再修改对应的接口。
- 文件位置发生改变,大多数情况下是配置文件的地址迁移到其他目录下,需要查看官方文档,找到新的地址。也有可能是不同系统下的文件在不同路径,例如
x86
与riscv64
可能不一样,需要根据系统,找到对应文件。 - ……
可能的解决方案:由于软件更新带来的错误没有什么通用的解决方案,一般是通过查看log,然后再google、查看官方文档,来进行对应的修复。
修复后向mugen仓库提交pr。
这一类错误主要是因为测试用例需要编译一些文件,但是缺乏相应的编译器,比如gcc、gcc-c++、java。此外,还有可能缺乏其他命令,比如tar、unzip等。如下图所示,这一类错误在log
上会显示command not found
。
可能的解决方案:可以通过Google等方式,找到对应的软件包并进行安装。值得注意的是,如果是软件包应该具备的命令找不到,那可以试着安装devel版本的软件包,有时候可能解决问题;否则,可能是不存在该命令了,也可能是命令被整合到其他地方。
修复后向mugen仓库提交pr。
这一类错误大多数是因为需要grep的内容发生了改变,导致抓取不到对应的信息,包括但不限于中英文、大小写、软件输出差异、抓取到多行数据、抓取到转义字符(比如‘\n’)等。比如下图所示,如果仅抓取中文,则在英文环境下可能出错;如果仅抓取英文,则在中文环境下可能出错。
可能的解决方案:把grep语句注释掉,然后查看原本会输出什么内容,再根据情况修改grep的内容。比如,针对大小写,可以用grep -i
忽略大小写;针对中英文环境不同,可以加入对两种环境的grep。注意,需要保证抓取的内容是有意义的。此外如果命令本身出错,此时抓取是没有意义的。
修复后向mugen仓库提交pr。
这一类错误主要是因为缺少对应的设备,例如下图所示,缺少tpm硬件,因而无法执行对应的操作。这一类错误比较少见。
解决方案:这一类错误不太好解决。这类错误一般出现在QEMU中,主要是因为启动脚本没有传入对应的选项,导致缺少对应的设备。可以在Google中搜索qemu+对应的设备,查看如何模拟。比如,通过以下命令添加tpm设备:
-chardev socket,id=chrtpm,path=/tmp/emulated_tpm/swtpm-sock \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis-device,tpmdev=tpm0 \
这一类的解决方案属于手动测试,不提交issue与pr。
这一类错误主要是在test_execution, test_restart, test_reload
的时候出现找不到对应服务的情况,例如下图所示,找不到digest lists的服务。
解决方案:我目前遇到的这一类错误都是因为对应的服务要么被删除(例如setup-ima-digest-lists.service被删除了),要么对应的服务被重命名了(例如mailman.service现在被称为mailman3.service)。一般是查看google、软件对应的仓库(GitHub、Gitee等),可能能找到对应线索。
需要往mugen仓库提交issue,解释哪些用例失效了。
这一类错误主要是在test_execution, test_restart, test_reload
的时候出现fail,并且是找得到对应服务的情况。
可能的解决方案:一般我是通过以下几条命令去查看service具体出错的原因的:
journalctl -x | grep xxx
journalctl -xeu xxx.service
systemctl status xxx.service
前两者通过系统日志查看是否有报错信息等,而后者是在手动模拟的时候查看service的状态,有可能能发现一些有价值的信息,比如缺了配置文件、某些组件启动失败等。例如,hostname的service缺少/etc/sysconfig/network文件,需要手动创建。
修复后向mugen仓库提交pr。
一些测试用例涉及磁盘,例如下图所示,suite2cases/ntfs-3g.json要求有2个5G大小以上的磁盘。由于QEMU启动脚本是没有额外磁盘的,因而此时需要手动添加磁盘。
由于RISCV是使用QEMU进行模拟的,因而需要先创建qcow2文件。下述命令创建了一个10G的磁盘。
qemu-img create -f qcow2 disk1.qcow2 10G
然后在启动脚本中,加入下述选项,即可添加对应磁盘。
-drive file=disk1.qcow2,format=qcow2,id=hd1,if=none \
-device virtio-blk-pci,drive=hd1 \
比如,我添加了三块磁盘,最终结果如下图所示,多了vdb、vdc、vdd三块磁盘。
我使用的是VMware模拟x86环境,因而可以直接在设置里添加硬盘。
在向mugen提交pr的时候,可能会遇到shellcheck不通过的情况,如下图所示。
针对其中某些情况,可以添加下述语句,以关闭对应的shellcheck,从而通过一些检查。例如sourcce "../../common/common.sh"
这样的语句无法通过shellcheck,可以注释掉相应的SC。
# shellcheck disable=SCxxxx,SCxxxx
注意,大部分的shellcheck最好是需要修正的,在发现shellcheck无法通过时,最好仔细查看并修改对应项。
大多数失败用例其实修复起来并不困难,通过查看log,在出现问题的时候多Google,很多情况下都能够解决问题的。
受限于个人能力与精力,本文章可能存在一些纰漏、未涵盖的地方,请各位佬们指正!(鞠躬