Autotest是后启之秀,早被用于Linux kernel自动化测试的框架,使用python语言,现在也被多个其它项目所应用。新case能较容易添加,ANSI-C或者Bash写的case也能较方便地融入此框架。针对Linux kernel的测试项目地址是http://test.kernel.org,用于交流、共享和分析测试数据。Autotest框架分服务端和客户端,在监听到有新版本发布(三位版本、四位版本、-rc版本、-git版本)时,会自动触发执行自动化,执行过程见下图四。

图四 Autotest自动化执行流程

  CrackerJack 是一个主要负责linux kernel兼容性测试的项目,找出不同内核版本系统调用的diff情况,已支持317个系统调用。它也是使用Autotest框架执行,diff结果是个矩阵可见下图五或者网址http://ossipedia.ipa.go.jp/crackerjack/compare_results.html。Diff比较是智能的,并非单独地比较输出结果,比如time时间调用每次系统返回都是不一样的,比较时是检查两次调用之间的时间差。

图五 CrackerJack diff结果

  测试方式

  测试手段是多样的:单测、集成测试、功能测试、性能测试、压力测试、回归测试等,但没有一种手段在任意时候都合适。质量保证是多方面的,除了要求开发者写出高质量代码外,静态代码检查、还要有频繁且严格的code review,下面列举一些针对Linux kernel特点的测试。

  1、开发者测试。鼓励开发者写单元测试,但很多时候有太多的依赖假设,单测等是很难的,比如要测试U盘在读写过程中被拔掉,再插上的情况,只有实际运行执行才能验证程序是否正确。无论开发人员使用何种方式,都需要保证负责的代码是经过测试了的。不需要在所有版本上运行,但需要确保代码质量,不能假定的字节序、字节长度,都应该使用标准接口。有些时候是修复别人报的bug,而开发人员又没有复现该bug的环境,此时修改也需要由bug提交者确认在其环境测试通过或者在其它能复现该bug的环境验证通过。对修改代码的质量保证方法还包括交由其它人评审通过或测试通过。编译器的报警也是需要修复的。

  2、社区测试。社区开发模式,也强调社区测试,鼓励大家在做好数据备份前提下使用新发布的版本,类似软件正式发布前的试用版本,以确保在不同的机器不同的平台上能实际正常运行。对此类版本的使用是有风险的,有可能导致系统崩溃。通常在系统安装后,启动时也会比较小心,逐项加载启动,以检查每步都是正常的。还会做一些非常规的操作,也是异常测试。

  3、配置测试。Linux kernel的配置也较复杂,以支持较好的灵活性和可扩展性,测试需要尽量地覆盖不同的配置组合条件。有的做法是随机配置,再编译运行启动,7*24小时重复不间断地做,以找出可能存在的问题。做的过程中也有优化,比如关闭一些不必要的选项,减少编译的时间。

  有些配置项是有助于测试执行时监控问题和分析问题的,比如打印出debug日志,或者在出错时打印尽可能多的信息,kernel在某些设置下自身也会做一些运行过程中的检查,如CONFIG_DETECT_SOFTLOCKUP能检查出内核部分是否在内核模式中循环超过60秒的bug,这类配置通常会在测试时打开。