linux kernel是如何通过软件测试保证质量的(2)

发表于:2013-01-22来源:百度质量部作者:不详点击数: 标签:linux
LTP是一个联合项目主要验证Linux系统的可靠性、健壮性和稳定性,最先由SGI启动,并由IBM负责维护。2012年4月发布的最新稳定版本已拥有3000+的case(case增长并

  LTP是一个联合项目主要验证Linux系统的可靠性、健壮性和稳定性,最先由SGI™启动,并由IBM®负责维护。2012年4月发布的最新稳定版本已拥有3000+的case(case增长并不多,06年时就有2900+的case),用于测试Linux kernel以及相关功能。使用的编程语言主要是ANSI-C(占94%),以及Bash脚本(占5%),还有Perl(占0.62%)。它也有一套使用ANSI-C和Bash写case的模板

  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,这类配置通常会在测试时打开。

  4. 硬件测试。验证kernel对不同平台的支持时,会使用些不常用的硬件,以及不常用的硬件组合,不同的体系架构。

  5. 对待变化。由于Linux kernel经常变化,不可能每次变动都同等对待。针对-rc候选发布版本,需要严格地测试,因为它们一旦被认为是稳定的之后就会正式发布,并很可能由发行商选中到发行版中。而针对-next树或者以前的-mm树,因为它们太容易变化了,没有时间和资源运行全量测试,通常只执行最基本的测试。

  6. 工具。Linux测试工具众多,可见http://ltp.sourceforge.net/tooltable.php,覆盖率、安全性、调试、网络、性能等方方面面工具都应有尽有。

  7. 性能测试。Linux kernel对性能要求也比较高,性能测试通常要注意的几点:(1)最好是利用benchmark,以取得可信数据;(2)避免I/O缓存因素,缓存对性能影响较大;(3)确保测量环境的稳定性,特别是比较前后版本时。Autotest中也包含性能测试自动化,一次升级导致的性能问题和修复如下图六所示,2.6.14-rc2-mm1版本与2.6.14-rc1-mm1版本相比执行时间由101增加到了111,性能降低了10%,直到2.6.16-rc1-mm4版本才修复。

  图六 Autotest性能测试执行结果图

  8. 可测性。Linux kernel在可测性方面也有较好支持。

  (1)内核模块化。启动内核模块支持后,内核的某些部分就可以在需要的时候才装载到内存中,使内核变得更小,运行更快。模块化的内核部分可以在系统运行期间装载或者卸载。

  (2)内核hacking 选项,编译一个测试用的内核,有助有内核特定功能的调试,也需要注意有部分选项会导致性能降低。

  (3)Magic SysRq键,神奇的键盘快捷键,可以利用快捷键直接向内核传递特定的指定。

  (4)多种信息收集方式,内核的bug不一定是导致系统崩溃,一些严重的错误通过日志等表现出来,信息收集就变得犹为重要了。可以通过Syslog, console, dmesg等方式dump和显示日志,除此之外,还可以通过串口和网络控制台远程收集信息。

  (5)kexec快速重启系统,使用 kexec可以直接重新启动到另一个内核,不再必须通过固件和引导装载程序阶段,能为测试节省大量时间。

原文转自:http://qa.baidu.com/blog/?p=1026