RTRT代码覆盖率及在Linux测试环境中的应用_第1页
RTRT代码覆盖率及在Linux测试环境中的应用_第2页
RTRT代码覆盖率及在Linux测试环境中的应用_第3页
RTRT代码覆盖率及在Linux测试环境中的应用_第4页
RTRT代码覆盖率及在Linux测试环境中的应用_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用 Rational Test RealTime 分析 C/C+ 代码覆盖率及在 Linux 测试环境中的应用代码覆盖率是在产品开发,测试过程中,衡量产品质量的一项非常重要的技术指标。它可以帮助工程师准确的判断哪些源代码经过了测试,是否还需要补充测试代码,从而在产品的开发、测试阶段帮助工程师及时发现潜在问题,更好的提升产品质量。Rational Test RealTime 是专门进行自动化测试、实时分析的工具集,它包括 Coverage、SystemTest、 Trace 等多项功能。其中 Coverage 用于分析代码覆盖率,改善代码的可靠性和性能,它不但支持 C、C+、Java 等主流语言,而且在 Linux、Unix 和 Windows 上都可以集成使用。本文主要介绍了在 Linux 环境下,如何利用 Rational Test RealTime 的命令模式进行 C/C+ 的代码覆盖率分析,针对不同的覆盖率需求如何部署和配置 Rational Test RealTime,以及在真实的测试环境中如何收集、整合程序覆盖率的测试结果,最终达到自动化分析和测试的目的。0评论李 小燕, 软件工程师, IBM曾 凡钢, 软件工程师, IBM2009 年 11 月 26 日 内容在 IBM Bluemix 云平台上开发并部署您的下一个应用。开始您的试用概述当代信息社会中,软件的功能日趋强大,而项目却日趋复杂,如何保证软件项目在发布之前进行充分的测试,找出潜在问题,成为了一项重要课题。代码覆盖率是在产品开发,测试过程中,衡量产品质量的一项非常重要的技术指标。它可以帮助工程师准确的判断哪些源代码经过了测试,是否还需要补充测试代码,从而在产品的开发、测试阶段帮助工程师及时发现潜在问题,更好的提升产品质量。Rational Test RealTime 是 IBM 公司开发的一套强大的、适用于嵌入式系统,实时系统以及网络系统的、跨平台的自动化实时测试分析工具集。它拥有代码覆盖率分析,内存泄露检查,以及性能检测等功能;能够进行单元测试,集成测试,系统测试,实时的嵌入式系统测试,分布式应用测试等各种自动化测试;支持 AIX、HP Unix、Linux、Sun Solaris、Windows 等多种操作平台。Rational Test RealTime 几乎可以满足开发团队建立复杂交互系统测试平台的所有需求。本文主要介绍在 Linux 环境下如何利用 Rational Test RealTime 的命令模式进行 C/C+ 的代码覆盖率分析,针对不同的覆盖率需求如何部署和配置 Rational Test RealTime,以及在真实的测试环境中如何收集、整合程序覆盖率的测试结果,最终达到自动化分析和测试的目的。目前针对代码覆盖率有很多测试的角度。Rational Test RealTime 主要提供下列 4 种: 功能测试覆盖:检测程序中的每个函数是否被调用。特别是在开始的测试中,可以用来检测软件的哪些地方被覆盖。这种测试往往可以迅速有效的找出测试漏洞。 调用代码覆盖:这个标准检测是否执行了每次函数调用。这是基于缺陷通常产生于模块间的调用而提出的一个方法。 块代码覆盖:检测是否每一行可执行的代码都被执行过。 条件代码覆盖:检测是否有足够的测试用例测试过每一条可能导致不同结果的条件语句。基于 Rational Test RealTime 提供的上述代码分析方法,接下来本文将会介绍如何使用 Rational Test RealTime 来做代码覆盖分析。其中,所有的实例都是基于本文供下载的例子代码,在 Linux 环境中运行所得。回页首搭建配置环境环境参数配置Rational Test RealTime 的下载,安装方法可以在它的帮助手册中找到。在使用 Rational Test RealTime 开始编译项目之前,首先需要正确配置环境变量。下面给出了一些比较重要且常见的环境变量的配置方法: TESTRTDIR: 强制赋值的变量。该变量指出 Rational Test RealTime 安装的路径。只有当此变量被分配之后,所有的 Rational Test RealTime 可执行文件和库才能被找到。比如,当 Rational Test RealTime 被安装在/build/RTRT/releases/TestRealTime.7.5.0.0下,运行命令echo $TESTRTDIR应该打印出上面的路径信息。 ATLTGT: 同样是一个强制赋值的变量。它表示当用户使用该工具的命令行时的目标部署端口(Target Deployment Port)的路径。 ATTOLOBJ: 可选择的赋值变量。该变量指向project.h文件和目标部署端口文件TP.o或TDP.obj生成的路径。缺省条件下,这些文件生成在当前路径下。如果需要在项目中生成多次project.h或TP.o文件,可以使用该变量指定生成位置,只生成一次,以后用的时候,系统会自动在该变量指定的路径下去寻找这些文件。TDP 设置Rational Test RealTime 的目标部署技术(Target Deployment Port,TDP)是一种灵活的,高效率的技术,它可以使测试基于目标或者实时分析独立地进行分析,与编译器、链接器、调试器及目标结构无关,从而实现跨多开发环境,多目标结构。作为 Rational Test RealTime 的一个关键组件,目标部署技术允许用户的测试用例和实时分析可以直接运用到目标系统上。构建 TDP 以使它可以和用户的编译器,链接器,调试器和目标结构相协调,使得测试可以独立于 TDP。当环境改变的时候不需要另外去更新 TDP。测试脚本的配置,执行和报告仍然可以使用。在每个 TDP 配置中包含四个部分。 基本设置:这个部分制定了缺省的文件扩展名,编译链接标志,环境变量和用户自定义变量,允许用户设置所有 Rational Test RealTime 常见的设置和变量以及 TDP 的部分。比如说,用户可以设置在编译,预处理和链接过程中使用的编译器的名字和位置。如果稍后要改变编译器,只需要更新这个部分就可以了。 构建(Build)设置:这个部分主要配置 Rational Test RealTime 图形接口集成 build 过程所需要的一些功能。它定义了编译,链接,执行 perl 脚本以及用户所需的自定义的脚本。该部分是 TDP 的核心部分,所有的需要编译和执行的部分都是靠它来驱动的。所有和 build 设置相关的文件都被存储在 TDPcmd这个下级目录下。 库设置:这个部分描述了在目标平台下使用 TDP 的一系列源码文件和用户定制文件。它定义了特定平台下的 TDP 的最常用的部分定制设置。这些文件被存储在 TDP.lib目录下。 解析设置:这个部分可以为了强调非标准的编译后缀名而改变解析器的行为。例如,non-ANSI后缀。该部分使得用户可以使用 Rational Test RealTime 正确适当的解析自己的源码,插入标志或者生成代码。对应的配置文件放在 TDPana这个下级目录下。安装完 Rational Test RealTime 在$TESTRTDIR/targets这个目录下发现已经有一些常用的 TDP 被安装了。在笔者的机器上,安装了下列 TDP(清单 1).清单 1. 已安装 TDP#lsadagnat adaunxapex clinuxgnu cunxdiabsgstep gcc_act jdk1.4.0 stAgent xml用户可以通过设置 ATLTGT 这个环境变量来决定使用哪一个 TDP。例如,在本例中使用了clinuxgnu。目录ana下的文件atl.opp包括了解析设置的一部分,也是比较常用的一部分。清单 2 是它的一个实例。清单 2. 文件 atl.opp 示例-dollar-no_restrict-special_subscript_cost-no_alternative_tokens-variadic_macros-extended_variadic_macros-void_star_null_pointer-guiding_decls-old_specialization-gnu_mode-microsoft_union_with_array-treat_template_classes_as_static-simulate_virtual_methods-simulate_called_routines-diag_suppress 14,34,46,47,161,174,177,305,375,427,549,550,737,795,830,837,940,997-diag_suppress 1,30,114,289,330,349,397-diag_suppress 100,137,280,350,381,416,541,815-diag_suppress 175,186,307,321,347,485,603,756-diag_suppress 191,265,603,691,802,1053,1205-diag_suppress 68,847,1097-diag_suppress 83, 94, 111, 180, 513-old_style_template_instantiation-vla-sys_include=/usr/X11R6-gnu_version=40300-gen_new_specialization-sys_include=/usr/lib/gcc/i386-redhat-linux/4.3.0/././././include/c+/4.3.0-sys_include=/usr/include/c+/4.3.0-sys_include=/usr/lib/gcc/i386-redhat-linux/4.3.0/././././include/c+/4.3.0/i386-redhat-linux-sys_include=/usr/include/c+/4.3.0/i386-redhat-linux-sys_include=/usr/lib/gcc/i386-redhat-linux/4.3.0/././././include/c+/4.3.0/backward-sys_include=/usr/include/c+/4.3.0/backward-sys_include=/usr/local/include-sys_include=/usr/lib/gcc/i386-redhat-linux/4.3.0/include-sys_include=/usr/include-sys_include=project path/CodeCoverage/include在该文件中,有几个参数常常会用到,需要引起注意。其中之一是Diag_suppress。当用户在使用 RT 来编译工程时如果想忽略某些警告甚至错误时,可以通过设置这个参数来实现。例如,如果想忽略错误或者警告83,94,111,180,153,可以把这样一行-diag_suppress 83, 94, 111, 180, 513加入该文件。另一个需要注意的参数是sys_include。通常情况下,RT 会对所有的原文件来做代码覆盖分析,包括 .c, .cpp 和 .h 文件。如果用户不想对位于某些特定位置的文件作覆盖分析,可以把对应的目录路径赋值给该变量。例如,该实例中不想对include目录下的文件做代码分析,可以加入这样一行-sys_include=the examples folder/include。回页首集成 Rational Test RealTime 生成 Build安装完 Rational Test RealTime,配置好所需的环境参数后,需要检查 Rational Test RealTime 所需要的环境配置是否都已经在当前系统中运行成功。方法如下:1. 运行命令行$TESTRTDIR/license_check来确认所需的 Rational Server 已经运行,并已经具备有效的注册码。2. 运行命令$TESTRTDIR/testrtinit.sh设置 Rational Test RealTime 的环境变量,包括 PATH 等等。Rational Test RealTime 还提供了命令attolcc来编译以 C/C+ 为源代码的程序。它的使用方法如下所示。#attolcc - 以上参数分别代表: 指一系列可选择的参数项。 是一系列可选择项的对应值。 是指在没有使用 Rational Test RealTime 情况下,用户所用的编译项目的标准命令行。所有上面描述的参数细节都可以在 Rational Test RealTime 帮助文档中查到。完成环境配置后,就可以开始利用 Rational Test RealTime 来生成项目的新 Build。生成方法只需在命令行中加入 Rational Test RealTime 的相应指令。接下来将从全代码覆盖率和指定模块代码覆盖率两种不同覆盖方法,举例说明如何利用 Rational Test RealTime 生成新 build,以及如何进行覆盖率分析。全代码覆盖率分析全代码覆盖率分析,就是对整个项目的所有文件进行覆盖率分析。这种方法适用于用户关心整体项目的测试质量,而非某个模块。使用 Rational Test RealTime 进行全代码覆盖率分析十分方便,只需在整个项目顶层的编译参数前加上 Rational Test RealTime 的参数。以上面的例子为例,进行全代码覆盖率分析。我们在项目文件夹 CodeCoverage 下面运行命令make,并且在其前面加上 Rational Test RealTime 的参数attolcc,还可以在编译指令(如gcc)前面加上适当的选择参数。比如我们有一个包括 3 个模块的项目,每个模块都有他们自己的 .c 文件和 makefiles(如清单 3 所示)。在最顶层的文件夹中,另外有一个总的 main.c 文件,它会链接所有的模块中的目标文件,然后生成一个可执行文件。清单 3. 用例文件夹结构#lscomponent1 component2 component3 include main.c makefile进行全代码覆盖率分析我们只需要在顶层文件夹编译时,将编译命令改为:# make CC=attolcc gcc”在这里,我们为顶层编译的“gcc”加了一个前缀“attolcc -”。在打印出的日志信息里面,我们可以看到所有的模块在编译时都会自动加上测试代码覆盖率的前缀“attolcc -”,如列表 4 所示清单 4. 日志示例attolcc -proc - gcc -g -I/include -o main.o -c main.c#Perl Script Command Line (9 args): # attolcc -proc - gcc -g -I/include -o main.o -c main.c # ATLTGT = /RTRT/Execute/releases/TestRealTime.7.5.0.0/targets/clinuxgnu# TESTRTDIR = /RTRT/Execute/releases/TestRealTime.7.5.0.0TestRT-I-STARTEXEC, Rational(R) Test RealTime instrumentation driver 7.5.0.0TestRT-I-COPYRIGHT, Copyright(C) 1996-2008 Rational Software Corporation. preprocessing of main.c to main.iinstrumentation of main.i to main_aug.ccompilation of main_aug.c to main.omake1: Entering directory /component1attolcc -proc - gcc -I/include -c file1.cpreprocessing of file1.c to file1.iinstrumentation of file1.i to file1_aug.ccompilation of file1_aug.c to file1.oattolcc -proc - gcc -I/include -c file2.cattolcc -proc - gcc -I/include -c file3.cattolcc -proc - gcc -g -I/include -o calculator main.o /component1/file1.o /component2/file2.o /component3/file3.oTestRT-I-STARTEXEC, Rational(R) Test RealTime instrumentation driver 7.5.0.0TestRT-I-COPYRIGHT, Copyright(C) 1996-2008 Rational Software Corporation. TDP generation. Link with ./TP.o在编译成功后,在对应的文件夹下面会产生一些新的文件,比如 products.h, TP.o 等等,如列表 5 所示。清单 5. 生成文件#lsattolccReport.xtp component1 component2 component3 main.c main.o products.hcalculator include main.c.fdc makefile TP.o其中,.fdc 文件就是代码覆盖率的报告文件。在每个模块中对每个 .c 文件都会生成一个这样对应的文件。在有些情况下,我们加入“attolcc -”进行编译,会增加出错的概率,这可能是因为 Rational Test RealTime 会进行二次编译的原因造成的。这时我们可以加入参量verbose来增加打印错误信息,来判断是何种原因造成的出错以及如何解决。根据经验,如果遇到“unlink ./products.h failed”的错误,往往是因为系统在链接过程中会因在众多模块中产生多个 TP.o 文件而产生链接错误,可以通过以下方式解决:1. 通过以下命令在某个目录下手动的生成 TP.o 文件#gcc TP.c2. 定义参数ATTOLOBJ。将其值设定为步骤 1 中 TP.o 文件的路径。#export ATTOLOBJ=the path in step 13. 在编译命令中加入参数- noTDP。这会使得系统在链接过程中使用步骤 1 中生成的 TP.o,而不是由系统自己生成的 TP.o。#make CC=” attolcc noTDP - gcc”指定模块覆盖率分析在很多测试情况下,不需要对整个项目进行代码覆盖率分析,而只是对项目中某些特定的模块感兴趣,只需要对这些部分模块进行代码修改或者测试。Rational Test RealTime 不仅支持整个项目的全代码覆盖率分析,而且还支持只分析某些特定的项目模块,为程序员提供了更大的灵活性。同样以上例为例,在示例中我们有三个模块,分别是:component1, component2 和 component3。假如仅仅需要分析 component1 的代码覆盖率,也就是指定模块的覆盖率分析。可以按以下步骤进行:1. 仅在编译 component1 时使用 Rational Test RealTime。# make CC=attolcc -atl_runtime_format=NONE - gcc2. 而在其他模块的编译中不使用 Rational Test RealTime。# make3. 在顶层的项目文件夹下,先编译出目标文件。# gcc c main.c o main.o4. 利用 Rational Test RealTime 链接所有的目标文件,最后生成可执行文件。# attolcc - gcc -o main.exe main.o component1/file1.a component2/file2.o component3/file3.o这个可以通过修改顶层文件夹下的 makefile 来实现(清单 6)。清单 6. Makefile 示例CC = gccCFLAGS = -g $(OPTION64) -I$(PDIR) RT = attolcc - $(CC) calculator l: main.o $(DIRCOMP1)/file1.o $( DIRCOMP2)/file2.o $( DIRCOMP3)/file3.o$(RT) $(CFLAGS) -o $ $? main.o: ./main.c$(CC) $(CFLAGS) -o $ -c $?$(DIRCOMP1)/file1.o: cd $(DIRCOMP1); make CC=attolcc -atl_runtime_format=NONE - gcc;cd .; $(DIRCOMP2)/file2.o: cd $(DIRCOMP2); make; cd .; $(DIRCOMP3)/file3.o: cd $(DIRCOMP3); make; cd .;通过这种方法,代码覆盖率的报告文件(.fdc 文件)就只会在 component1 下面生成,而不是整个项目下都有。在使用 Rational Test RealTime 进行指定模块覆盖率分析的时候,有两点我们特别要注意:1. 如果编译过程中遇到以下错误:/build/RTRT/releases/TestRealTime.7.5.0.0/targets/clinuxgnu/lib/priv.c:119: multiple definition of priv_exit,这可能是由于 Rational Test RealTime 在链接库文件时重复链接造成的,可以尝试加入参数-atl_runtime_format=NONE来避免重复链接。当链接时生成的文件是目标文件(obj)或者库文件时必须使用该参数设置。2. 在第 1 步和第 4 步使用的参数除了-atl_runtime_format=NONE以外必须相同。回页首收集覆盖率数据在利用 Rational Test RealTime 对项目编译链接完成以后,下一步就需要对代码进行覆盖率数据收集。我们通过运行生产的目标程序来获取源代码插入分析信息文件(Source Code Insertion -SCI),这个文件的默认名字是atlout.spt(如清单 7 所示)。清单 7. 生成 spt 文件#lsatlout.spt calculator component1 component2 component3 main.c.fdc makefile TP.cattolccReport.xtp main.c main.o products.h在这之后,利用 dump file splitter 工具atlsplit 来分离源代码插入分析信息文件。这里假设 .spt 文件使用的就是默认名字,我们可以运行清单 8 中的命令。在其结果中,会新产生一个以tio为后缀的文件,默认名为attolcov.tio,这个就是代码覆盖分析所需的动态追踪文件 (Dynamic Trace File)。清单 8. Split 结果#atlsplit atlout.sptSplitting atlout.spt traces fileTraces file successfully split.现在,所有检查代码覆盖率所需的文件都准备好了。回页首查看覆盖率信息收集完代码覆盖率数据以后,可以通过 Rational Test RealTime 中的图形界面(GUI)来查看覆盖率分析结果。Rational Test RealTime 的图形查看工具支持 Windows、Linux、AIX 等多种操作系统,能够对代码覆盖率进行柱状图分析,源文件覆盖分析和统计结果分析。这里仍以 Linux 环境下进行结果查看为例。在 Rational Test RealTime 的安装目录下运行以下代码:#studio .c.fdc attolcov.tio图形界面将会自动打开。其中 .c.fdc 是我们所想要查看的代码覆盖率报告文件。我可以指定一个或者同时指定多个 fdc 文件。比如,我们需要查看component1下的file1.c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论