代码覆盖分析工具在嵌入式软件测试中的应用
发布时间:2008/5/27 0:00:00 访问次数:568
1 代码覆盖分析
代码覆盖分析过程包含以下几个方面:
◇通过一组覆盖测试数据发现和分析那些没有被运行到的代码;
◇为了提高代码覆盖率而设计新的测试用例;
◇确定代码覆盖的定量标准,这些数据也间接地反映测试质量;
◇识别那些冗余的测试用例。
代码覆盖分析是一种白盒测试方法,因为覆盖分析需要访问测试代码本身,且经常需要重新编译程序,以程序的内部结构为基础来设计测试案例。其基本准则是测试案例要尽可能多地覆盖程序的内部逻辑结构,发现其中的错误和问题。另外要注意的是,覆盖分析并不是为了提高程序本身的质量而是为了确保测试用例的质量。一般来说,覆盖分析通常应用在软件测试的早期,即单元测试阶段。在软件发布版本阶段是不需要运行软件覆盖分析的。
2 覆盖分析在嵌入式系统上的问题
嵌入式软件的开发与通用软件的开发很大的不同点在于:嵌入式系统需要采用交叉开发的方式,即开发工具运行在软硬件配置丰富的宿主机上,而嵌入式应用程序则运行在软硬件资源相对缺乏的目标机上。所以针对覆盖分析测试,嵌入式系统的困难之一就是如何获取测试产生的覆盖数据。大多数的覆盖分析测试工具都需要对代码插装,而当在目标环境下运行经过代码插装的可执行程序时,就会有覆盖分析数据产生。这些数据是分析覆盖数据报告的重要输入条件,所以要顺利实现嵌入式系统覆盖分析的一个关键点是如何建立宿主机与目标机之间的物理/逻辑连接,解决覆盖分析数据信息的传输问题。
3 bullseyecoverage的实现方式
bullseyecoverage是bullseye公司提供的一款c/c++代码覆盖率测试工具。相对于rational公司的pure cov-erage,bullseyecoverage支持的c/c++编译器更多,除了支持各种unix下的编译器之外,在windows下还支持vc、borland c++、gnu c++和intel c++。其提供的代码覆盖率是基于条件/判断的分支覆盖率,而不是一般的代码行覆盖率。
bullseyecoverage采用的是先对代码进行插装,然后收集覆盖数据,最后分析覆盖率原理的技术。其工作原理是:针对不同的编译器,设计一个和真实编译器名字相同的拦截器,这些拦截器文件存放在bullseyecoverage的bin目录下。当覆盖编译开关打开时,文件在编译过程中将首先被这些拦截器所拦截,而不是由真实的编译器去编译源代码。在这个拦截过程中,拦截器将一系列探针代码插入到c/c++源代码中,然后文件再次通过真实的编译器生成二进制代码。当覆盖编译开关关闭时,这些拦截器将直接调用真实的编译器而不进行代码插装的过程。两者的区别及调用关系如图1所示。
当完成了代码插装并且将编译好的运行文件下载到嵌入式系统后,开始代码覆盖分析另外一个重要的工作过程——覆盖分析数据更新过程。由于bullseyecoverage需要在运行时态对经过覆盖拦截器生成的覆盖分析文件(大小一般是运行代码的1.2~1.5倍)进行读写操作,所以可以对覆盖文件的大小进行简单的估计,以便设计系统。存数据更新过程中,bullseyecovcrage的每次读写操作范围为1字节~4 kb。另外,bullseyecoverage只有在测试程序触发了cov_write函数时才会对覆盖分析文件进行更新。如果覆盖没有更新,那么相应地也没有i/o动作发生。针对嵌入式系统,bullseyecoverage有两种实现的方式:
①利用读取内存区数据的原理。首先,通过串口、以太网或者usb将覆盖分析文件下载到嵌入式系统的某个未用内存区域;然后,修改测试工具的i/o库函数,将对覆盖分析文件操作的更新数据直接写入那块内存区域中。这样在测试开始后,分析程序会自动更新位于内存中的覆盖分析文件。由于覆盖分析文件在内存中,所以这种读写操作的速度会非常快。测试完成后,通过串口、网络或者usb再次将覆盖分析文件读回到pc机中,然后利用工具对覆盖结果进行分析。
②利用实际物理通道的原理。系统需要对覆盖分析文件的i/o操作进行封装,将需要更新的操作命令和更新内容通过串口、网络或者usb传递给宿主系统,而宿主系统需要实现一个简单的接收更新程序对覆盖文件进行更新。在这种实现方式中,最困难的是对每次数据传输的缓冲区大小进行估计。由于bullseyecoverage每次对覆盖分析文件的读写操作的范围是1字节~4 kb,而通常
1 代码覆盖分析
代码覆盖分析过程包含以下几个方面:
◇通过一组覆盖测试数据发现和分析那些没有被运行到的代码;
◇为了提高代码覆盖率而设计新的测试用例;
◇确定代码覆盖的定量标准,这些数据也间接地反映测试质量;
◇识别那些冗余的测试用例。
代码覆盖分析是一种白盒测试方法,因为覆盖分析需要访问测试代码本身,且经常需要重新编译程序,以程序的内部结构为基础来设计测试案例。其基本准则是测试案例要尽可能多地覆盖程序的内部逻辑结构,发现其中的错误和问题。另外要注意的是,覆盖分析并不是为了提高程序本身的质量而是为了确保测试用例的质量。一般来说,覆盖分析通常应用在软件测试的早期,即单元测试阶段。在软件发布版本阶段是不需要运行软件覆盖分析的。
2 覆盖分析在嵌入式系统上的问题
嵌入式软件的开发与通用软件的开发很大的不同点在于:嵌入式系统需要采用交叉开发的方式,即开发工具运行在软硬件配置丰富的宿主机上,而嵌入式应用程序则运行在软硬件资源相对缺乏的目标机上。所以针对覆盖分析测试,嵌入式系统的困难之一就是如何获取测试产生的覆盖数据。大多数的覆盖分析测试工具都需要对代码插装,而当在目标环境下运行经过代码插装的可执行程序时,就会有覆盖分析数据产生。这些数据是分析覆盖数据报告的重要输入条件,所以要顺利实现嵌入式系统覆盖分析的一个关键点是如何建立宿主机与目标机之间的物理/逻辑连接,解决覆盖分析数据信息的传输问题。
3 bullseyecoverage的实现方式
bullseyecoverage是bullseye公司提供的一款c/c++代码覆盖率测试工具。相对于rational公司的pure cov-erage,bullseyecoverage支持的c/c++编译器更多,除了支持各种unix下的编译器之外,在windows下还支持vc、borland c++、gnu c++和intel c++。其提供的代码覆盖率是基于条件/判断的分支覆盖率,而不是一般的代码行覆盖率。
bullseyecoverage采用的是先对代码进行插装,然后收集覆盖数据,最后分析覆盖率原理的技术。其工作原理是:针对不同的编译器,设计一个和真实编译器名字相同的拦截器,这些拦截器文件存放在bullseyecoverage的bin目录下。当覆盖编译开关打开时,文件在编译过程中将首先被这些拦截器所拦截,而不是由真实的编译器去编译源代码。在这个拦截过程中,拦截器将一系列探针代码插入到c/c++源代码中,然后文件再次通过真实的编译器生成二进制代码。当覆盖编译开关关闭时,这些拦截器将直接调用真实的编译器而不进行代码插装的过程。两者的区别及调用关系如图1所示。
当完成了代码插装并且将编译好的运行文件下载到嵌入式系统后,开始代码覆盖分析另外一个重要的工作过程——覆盖分析数据更新过程。由于bullseyecoverage需要在运行时态对经过覆盖拦截器生成的覆盖分析文件(大小一般是运行代码的1.2~1.5倍)进行读写操作,所以可以对覆盖文件的大小进行简单的估计,以便设计系统。存数据更新过程中,bullseyecovcrage的每次读写操作范围为1字节~4 kb。另外,bullseyecoverage只有在测试程序触发了cov_write函数时才会对覆盖分析文件进行更新。如果覆盖没有更新,那么相应地也没有i/o动作发生。针对嵌入式系统,bullseyecoverage有两种实现的方式:
①利用读取内存区数据的原理。首先,通过串口、以太网或者usb将覆盖分析文件下载到嵌入式系统的某个未用内存区域;然后,修改测试工具的i/o库函数,将对覆盖分析文件操作的更新数据直接写入那块内存区域中。这样在测试开始后,分析程序会自动更新位于内存中的覆盖分析文件。由于覆盖分析文件在内存中,所以这种读写操作的速度会非常快。测试完成后,通过串口、网络或者usb再次将覆盖分析文件读回到pc机中,然后利用工具对覆盖结果进行分析。
②利用实际物理通道的原理。系统需要对覆盖分析文件的i/o操作进行封装,将需要更新的操作命令和更新内容通过串口、网络或者usb传递给宿主系统,而宿主系统需要实现一个简单的接收更新程序对覆盖文件进行更新。在这种实现方式中,最困难的是对每次数据传输的缓冲区大小进行估计。由于bullseyecoverage每次对覆盖分析文件的读写操作的范围是1字节~4 kb,而通常