APP下载

自动化技术在Klocwork测试中的应用

2010-06-14罗春雷于红增卢华斌

无线电工程 2010年1期
关键词:自动测试脚本流程

罗春雷,于红增,卢华斌

(中国电子科技集团公司第五十四研究所,河北石家庄050081)

0 引言

在软件开发与维护的全生命周期,各类角色的项目相关活动在很大程度上是重复性劳动,为了适应软件企业快速发展的需要,提高软件过程效率,计算机辅助及自动完成这些重复劳动的自动化技术在许多现代软件研发企业得到普遍应用。自动化已成为现代软件企业的重要标志,相关技术也成为企业重要的IT基础设施。

Klocwork是一款优秀的源代码静态分析工具,支持缺陷检查、代码质量度量和编码规范检查,在软件研发过程中很好地应用此工具可以使代码的质量和软件稳定性得到很大的提高。该工具提供了GUI和命令行2种操作界面,GUI界面操作简单,可以完成大部分测试功能;而命令行界面不仅可以完成全部测试功能,也便于实现过程自动化。Klocwork自身并没有提供自动测试框架或脚本供用户使用,一般要借助于持续集成工具来实现自动化测试。本文提出一种基于Windows Shell脚本的Klocwork自动测试的技术框架,并给出了组建自动测试系统的实例。

1 Klocwork自动测试方法探讨

自动化针对一个可重复性过程,并对其进行改善。因此,要从软硬件设施和制度上保证软件过程活动的最大可重复性。

企业内部实现自动化测试的进程如下:

①依靠版本管理系统,搭建测试所需的软硬件环境;

②梳理测试步骤,规范测试流程;

③进行自动化脚本设计;

④编写、调试测试脚本,实现自动测试;

⑤完善测试脚本,实现制度化的自动化测试。

其中进程④和⑤在一定时期内可能会有反复。

1.1 测试环境设计

基于配置管理设施搭建测试环境,在版本管理工具和软件测试工具之间建立起稳固的联系,既便于自动化,也可以保证被测软件版本的正确。一个典型的基于开源Subversion源码版本管理工具的K8(Klocwork 8.0,以下同)测试环境如图1所示,考虑到一般情况,开发分为内场(主要开发场地)和外场(联试或用户现场),K8软件测试服务器部署在内场。

图1 基于Subversion的K8测试环境

1.2 测试流程设计

软件测试流程在GUI操作界面和命令行操作界面中是不同的,自动化测试流程必须基于命令行操作界面来设计,并根据需要定制工作流程和添加自己的流程节点(比如获取版本库代码、生成离线测试报告、测试状态通知等)。

命令行界面中进行K8测试的基本流程如下:

①创建被测C/C++项目的构建规范文件;

②创建与被测C/C++项目对应的K8工程;

③设置K8工程属性;

④执行构建和缺陷检查;

⑤加载缺陷检查结果;

⑥生成离线报告。

在这些流程节点中,由于C/C++项目有VC++6.0、VC++.net、GNU C/C++和其他 makefile等多种工程类型,要用不同的K8命令创建它们的构建规范文件,并且针对这些不同的工程类型,相应K8工程的属性集也有差异。因此,步骤①和③有多种情况需要考虑,而其他流程节点是一致的。

将K8测试流程和版本管理工具结合起来,并考虑测试过程的意外情况处理,K8缺陷检查流程如图2所示,从等待版本库准备好开始,到被测代码没有缺陷或没有关注缺陷时结束。

从计划和质量管理角度讲,工程项目软件的测试要按照软件测试计划进行,并需要在检测后生成检测报告,这超出了本文的探讨范畴,不再讨论。

图2 K8缺陷检查流程

1.3 测试命令选择

Klocwork命令行界面提供了很多命令,其中与C/C++项目有关的命令包括:

①Kwadmin,用于管理K8工程,包括创建、删除和属性设置等;

②KwDspParser,为VC++6.0工程创建构建规范.out文件;

③KwVcprojParser,为VC++.net工程创建构建规范.out文件;

④Kwinject,为makefile工程创建构建规范.out文件;

⑤Kwbuildproject,按照构建规范(.out文件)进行构建和缺陷检查;

⑥Kwinspecttrport,生成离线报告。

1.4 测试脚本架构设计

按照上述K8软件测试流程,可以设计出3个WSH脚本模块或脚本文件:FindAllPrj.cmd、KwCheckAll.cmd和KwCheckPrj.cmd,分别完成不同的任务,共同构成一个自动化测试框架。

FindAllPrj.cmd是一个C/C++工程文件搜索工具,完成对待检测C/C++工程文件的搜索,并生成工程文件清单PrjList.txt。

KwCheckAll.cmd工具实现测试所需环境变量初始化,并对PrjList.txt中工程列表进行遍历,遍历时通过调用KwCheckPrj.cmd完成对单个工程的测试。

KwCheckPrj.cmd工具是测试功能的核心模块,用于对单个的C/C++工程进行缺陷检查,记录测试过程起止时间,并分别生成txt格式和xml格式的离线测试报告。其中,VC、VC.net和Tornado工程文件的扩展名分别为dsp、sln和wpj,脚本能够进行自动识别,并作不同的处理。在创建Klocwork工程时它以项目缩写前缀(由KwCheckAll工具设置并在调用KwCheckPrj时传入)来区分不同项目中的C/C++工程或测试师。

2 测试脚本的开发

2.1 测试脚本的编写

2.1.1 设置关注缺陷集

通过一次性设置好的缺陷类型列表,所有新建的缺陷检查工程都将按照这个关注缺陷列表进行代码缺陷检查。

通过设置系统关注缺陷列表,在每个K8工程创建时将默认按照它设置关注缺陷集,所有项目记录在名为problems_default. pconf.xml的文件中,它是XML格式的,可以逐项设置。

2.1.2 获取工程的默认配置

不管是哪种C++工程,获取工程的默认目标是正确分析源代码的关键,不同的编译目标往往对应着不同的目标系统和软件环境配置。

2.1.3 项目属性设置

必须针对每个项目进行正确的属性设置,以提高测试效率,方便结果查询,配置结果都将存放在Projects服务器上。具体设置可以参考手册中kwadmin set-project-property的帮助信息来获得,也可以通过查看已有工程配置的方式来获取。

2.1.4 实现遍历

Windows的for/F命令可遍历一个集合并对其中的每一个成员执行需要的命令集。

限于篇幅,下面给出添加注释后的测试脚本KwCheckPrj.cmd的实现片段,从中可以看出它覆盖了设计的测试流程。KwCheckPrj.cmd如下:

::创建一个K8工程

kwadmin create-project%1_%~n2-langu age c,cxx—copy-sources

::设置K8工程属性

kwadmin—host localhost set-project-property%1_%~n2 jobs_number auto

……

::得到一个VC++6.0项目的构建文件

kwDspParser%2-c Debug-o%OUTDIR%\%~n2.out

::基于构建文件进行K8测试

kwbuildproject-S%1_%~n2-o″%table%″%OUTDIR%\%~n2.out

::将测试结果加载到K8工程数据库

kwadmin load%1_%~n2″%table%″

::生成离线测试报告

kwinspectreport—project%1_%~n2—build build 1—xml%Report%\%~n2.xml

::利用ipmsg工具进行测试结果通知

ipmsg/msg%DstHost%″%~n2测试完成.″

2.2 脚本调试与过程优化

在脚本调试过程中,通过显示脚本命令本身及命令输出信息,可以及时发现并改正编码错误和环境设置问题。

另外,K8测试是实践性很强的工作,通过以下措施可以将测试过程进一步优化:

①进行K8检查需要大量的磁盘空间,要将Project_root 设置到空闲空间较大的分区上,以免自动测试过程因为磁盘空间不足而意外中断;

②K8默认最大需要1 024 MB的物理内存,当机器的物理内存较少时,应该修改安装目录中java_wrappers.conf中JVM的有关参数,设置为一个合理的数值,否则测试过程会因为频繁的内存页面切换而影响测试效率;

③确保测试机器上的软件环境符合编译需求,不能通过编译的程序将不能进行测试;

④K8支持多CPU与多核CPU,可以实现多任务并行测试,提高测试效率。

⑤利用命令行界面的即时聊天工具(如ipmsg、FeiQ等),在软件检测的过程中,可以用来远程报告软件测试的结果和通知当前测试的工作进度。

2.3 执行测试

假设C++工程列表文件为PrjList.txt(可通过人工或用FindAllPrj命令来自动生成),进行缺陷检测的命令为:

E:>KwCheckAll zywg PrjList.txt

其中zywg为项目或测试师名称缩写,这样在生成的K8项目工程中,工程名将带有“zywg_”的前缀,以区分不同项目或测试师。

3 效果与分析

3.1 测试能力对比

虽然Klocwork可以对VC++6.0/VC++.net工程、Tornado工程、C/C++的Makefile工程、C#工程、Java Ant工程、C/C++目录等进行测试,但是它的GUI操作界面并不能完成全部这些功能,对C/C++的Makefile工程、C/C++目录等的测试必须首先在命令行界面中生成build规范文件后,才能在GUI界面中继续测试。而通过本文设计的自动化测试脚本,可以通过一个命令完成全部测试任务,这种能力是Klocwork软件本身所不具备的。

3.2 测试效率对比

采用本文设计的自动化框架进行K8测试,可以自动完成对一系列C/C++项目的测试,即使仅仅是一个C/C++项目,由于免去了测试过程中的大量人工选择与录入工作,效率的提升也很明显。

表1摘录了某项目一次自动测试过程的部分测试记录。

表1 自动测试记录

这个项目在集成与系统调试阶段需要每周对47个VC工程(其中有十几大型的CORBA应用)进行一次K8测试。如果按照常规,采用人工方式,测试师就要不间断地重复创建一个工程,启动对它的测试,并等待测试结束,以开始对下一个工程的测试,直到完成所有的测试工作,每一轮测试没有2个工作日是很难完成的。而改用了本文设计的自动化框架和工具后,在单核CPU环境中测试过程缩减到不足7个小时,在双核CPU下甚至仅需2个多小时。

总之,自动化的效益非常可观,不仅基本杜绝了过程中的人为失误,而且可以大幅度提高生产效率。另外,自动化可以采用大量的脚本技术增强测试工具的适应能力和表现能力,使测试过程更加人性化,更好地满足测试工作的需要。

4 结束语

根据软件企业的发展需要,逐步实现构建、打包、安装和测试等方面的自动化,或者更进一步,借助敏捷过程工具 (如 Electric Cloud、Bamboo、CruiseControl等)整合企业的软件过程,最大化过程的自动化,大大降低过程的人工依赖,企业将具有更强的生命力,科研生产能力必将达到一个新的水平。

[1]罗时飞.敏捷持续集成(CruiseControl版):高效研发之道.北京:电子工业出版社,2008.

[2]高如莎.一种软件单元测试策略[J].无线电工程,2007,37(8):54-57.

[3]杜会斌,吴晓娟,周 旭.自动测试在军事电子技术中的应用[J].无线电工程,2005,35(9):61-64.

猜你喜欢

自动测试脚本流程
酒驾
吃水果有套“清洗流程”
安奇奇与小cool 龙(第二回)
JXG-50S型相敏轨道电路接收器自动测试台
关于某型雷达自动测试系统的几点认识和建议
违反流程 致命误判
快乐假期
小编的新年愿望
本刊审稿流程
析OGSA-DAI工作流程