Skip to content

Latest commit

 

History

History
158 lines (91 loc) · 9.18 KB

2024.5.10-mugen-testcase-陈志康.md

File metadata and controls

158 lines (91 loc) · 9.18 KB

mugen失败用例修复经验

前言

​ 本文章主要介绍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

1. RPM包未引入

​ 这一类错误在新版本,比如RISCV 24.03x86 24.03中比较常见,主要是由于对应的rpm包还没构建出来。在log中,会显示unable to find a match,比如下图,找不到nvml的rpm包。

nvml

​ 可能解决方案:需要引入rpm包。

​ 往src-openeuler的对应仓库中提交引入rpm包的issue,包括OS版本信息。

2. 软件更新导致差异

​ 这一类错误主要是因为测试用例基于旧的包版本,跟新的包版本存在一定的差异,包括:

  • 不再支持参数选项,或者选项更改了名字,或者传入的参数发生变化。比如,在旧版本下,显示版本信息是-v,但是新版本下,显示版本信息是-V
  • 不再支持命令,可能是该命令被移除,也有可能是整合到其他命令中了。比如,pylint的测试用例中,原有的命令epylint已经被整合到pylint命令中。
  • 输出差异,在执行操作后,新旧版本的输出存在不同。比较特殊的例子是抓取版本信息的用例,可能会因为更新后版本信息不同而存在差异。最好通过$(rpm -qa xxxx) | awk -F- '{print $xxx}'抓取版本信息,然后再检查版本。
  • API改变,多见于.c、.cpp、.java等源码文件所使用的API接口发生了改变,需要查看官方文档,再修改对应的接口。
  • 文件位置发生改变,大多数情况下是配置文件的地址迁移到其他目录下,需要查看官方文档,找到新的地址。也有可能是不同系统下的文件在不同路径,例如x86riscv64可能不一样,需要根据系统,找到对应文件。
  • ……

​ 可能的解决方案:由于软件更新带来的错误没有什么通用的解决方案,一般是通过查看log,然后再google、查看官方文档,来进行对应的修复。

​ 修复后向mugen仓库提交pr。

3. 缺包

​ 这一类错误主要是因为测试用例需要编译一些文件,但是缺乏相应的编译器,比如gcc、gcc-c++、java。此外,还有可能缺乏其他命令,比如tar、unzip等。如下图所示,这一类错误在log上会显示command not found

leveldb

​ 可能的解决方案:可以通过Google等方式,找到对应的软件包并进行安装。值得注意的是,如果是软件包应该具备的命令找不到,那可以试着安装devel版本的软件包,有时候可能解决问题;否则,可能是不存在该命令了,也可能是命令被整合到其他地方。

​ 修复后向mugen仓库提交pr。

4. grep

​ 这一类错误大多数是因为需要grep的内容发生了改变,导致抓取不到对应的信息,包括但不限于中英文、大小写、软件输出差异、抓取到多行数据、抓取到转义字符(比如‘\n’)等。比如下图所示,如果仅抓取中文,则在英文环境下可能出错;如果仅抓取英文,则在中文环境下可能出错。

java-11-openjdk

​ 可能的解决方案:把grep语句注释掉,然后查看原本会输出什么内容,再根据情况修改grep的内容。比如,针对大小写,可以用grep -i忽略大小写;针对中英文环境不同,可以加入对两种环境的grep。注意,需要保证抓取的内容是有意义的。此外如果命令本身出错,此时抓取是没有意义的。

​ 修复后向mugen仓库提交pr。

5. 缺少设备

​ 这一类错误主要是因为缺少对应的设备,例如下图所示,缺少tpm硬件,因而无法执行对应的操作。这一类错误比较少见。

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。

6. service not found

​ 这一类错误主要是在test_execution, test_restart, test_reload的时候出现找不到对应服务的情况,例如下图所示,找不到digest lists的服务。

digest-lists

​ 解决方案:我目前遇到的这一类错误都是因为对应的服务要么被删除(例如setup-ima-digest-lists.service被删除了),要么对应的服务被重命名了(例如mailman.service现在被称为mailman3.service)。一般是查看google、软件对应的仓库(GitHub、Gitee等),可能能找到对应线索。

​ 需要往mugen仓库提交issue,解释哪些用例失效了。

7. service fail

​ 这一类错误主要是在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文件,需要手动创建。

hostname

​ 修复后向mugen仓库提交pr。

磁盘配置

​ 一些测试用例涉及磁盘,例如下图所示,suite2cases/ntfs-3g.json要求有2个5G大小以上的磁盘。由于QEMU启动脚本是没有额外磁盘的,因而此时需要手动添加磁盘。

json

​ 由于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三块磁盘。

disk

​ 我使用的是VMware模拟x86环境,因而可以直接在设置里添加硬盘。

shellcheck关闭

​ 在向mugen提交pr的时候,可能会遇到shellcheck不通过的情况,如下图所示。

shellcheck

​ 针对其中某些情况,可以添加下述语句,以关闭对应的shellcheck,从而通过一些检查。例如sourcce "../../common/common.sh"这样的语句无法通过shellcheck,可以注释掉相应的SC。

# shellcheck disable=SCxxxx,SCxxxx

​ 注意,大部分的shellcheck最好是需要修正的,在发现shellcheck无法通过时,最好仔细查看并修改对应项。

总结

​ 大多数失败用例其实修复起来并不困难,通过查看log,在出现问题的时候多Google,很多情况下都能够解决问题的。

​ 受限于个人能力与精力,本文章可能存在一些纰漏、未涵盖的地方,请各位佬们指正!(鞠躬