微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > McCabe在多项目工程中的应用及覆盖率统计技巧

McCabe在多项目工程中的应用及覆盖率统计技巧

时间:12-18 来源:电子产品世界 点击:

摘要:McCabe软件测试工具常常被测试人员用来测试单一项目工程的软件系统,然而随着软件工程的发展,多项目工程的大型系统软件陆续出现。那么如何利用现有的McCabe软件测试工具解决多项目工程中的逻辑测试呢?本文详细介绍McCabe软件测试工具在多项目工程中的应用及覆盖率统计技巧,供读者参考与交流。

  1 McCabe软件测试工具简介

McCabe IQ是美国McCabe Software公司的软件质量管理解决方案,为用户提供软件质量度量、软件结构分析、动态结构化测试的全面支持。McCabe IQ的功能可以分为质量度量、覆盖率测试、数据流分析、变更分析、冗余代码分析和企业级报告等。

McCabe是一个完全图形化的工具,可以提供如下图形报告:

· 模块调用关系图:用红黄绿颜色标识出模块的复杂度的高低,对于软件的结构和复杂程度一目了然。

· 模块控制流图:有助于了解软件模块的内部流程,发现隐藏的危险路径。

· 散点图/KV图/柱状图:综合分析软件整体的质量分布情况,有助于了解软件质量情况,和测试工作量评估。

图 1?1-该资料来源于中国评测

图 1?2-该资料来源于中国评测

McCabe软件测试工具在逻辑动态测试时,前提是要对代码进行插装。然而在实际工作中,由于大型软件常常是由多个项目工程构成,所以针对多项目工程的插装一直是众多软件测试人员困惑的问题。下面我们将详细分析如何在多项目工程中巧妙使用McCabe软件测试工具。

  2 McCabe在多项目工程中的应用

由于 McCabe 在分析程序之前先要调用用户环境中的编译器对程序进行预处理,在按照用户指定的插装选项对被测程序文件插装后,才能获得足够的程序信息,完成正确的分析。

按照以下步骤完成创建工程操作:

1. 在 File 目录下选择New Project。创建新项目工程。

2. 给新建的工程命名,并选择工程将要存放的目录。

3. 选择所用的语言以及语言的扩展。

4. 源代码选择对话框有两个界面。这是因为我们是对多项目工程的插装,所以选择I’ll supply the infor选项,点击“下一步”。如图2.1。

图 2?1-该资料来源于中国评测

5. 进入源文件选择界面,如图2.2,点击“Add/Remove Files”。Add/Remove Files 对话窗口有三种操作模式,进入源代码目录存放文件夹中,点击“Add Hierarchy”,这样所有文件都会被添加进项目。如图2.3。

图 2?2-该资料来源于中国评测

图 2?3-该资料来源于中国评测

6. 依次点击“下一步”,对项目进行设置,完成项目插装步骤。

7. 在完成了项目的插装后,会在项目指定的目录中生成McCabe对本项目工程的说明文件test_Pathvec.cs。这个文件必须加载在插装后的代码文件中,这样才能对工程项目进行调试。

8. 将插装完成后的文件拷贝至源文件目录下,同名覆盖源文件。启动源文件中的解决方案,如图2.4。

图 2?4-该资料来源于中国评测

9. 在现有的解决方案中新建一个项目,命名为“cabe”,并将先前的test_Pathvec.cs文件添加进来。在原有的工程项目中添加引用cabe工程。如图2.5。

图 2?5-该资料来源于中国评测

10. 启动项目调试,生成输出文件,多工程项目文件的插装工作完成。测试完成后,将项目输出文件导入McCabe中,就可以进行代码覆盖率统计工作了。

  3 McCabe软件测试覆盖率统计技巧

McCabe 的动态测试不但适合于宿主机系统,也适合于各种嵌入式系统环境下运行,当被测软件动态运行的时候,McCabe 分析生成的追踪信息,得到覆盖率信息,McCabe 可以提供的覆盖率类型有:集成覆盖率、路径覆盖率、分支覆盖率、语句覆盖率、类覆盖率、布尔覆盖率(MC/DC)、数据覆盖率和调用对覆盖率等。

覆盖率的信息最直观的查看方式就是在模块调用图上用不同的颜色标识出来,基于McCabe度量的理论,可以提供给用户强大的路径分析路径覆盖率,适合于安全关键软件的严格测试。覆盖率的信息以切片(Slice)的方式详细的报告给用户,用户可以使用McCabe的切片直接的逻辑运算发现被测软件的业务规律。

然而在覆盖率统计时,我们常常发现无论选择什么样的测试用例,总有一些分支无法覆盖。下面就对常见无法覆盖的分支详细分析。

1. 只有if分支,无else分支

这是最常见无法覆盖的情况之一。当if判断条件存在重复判断时,往往出现else无法覆盖的情况。如下所示:

if (a > 1)

{

if (a > 0)

{

a = a + 1;

}

else return;

}

else return;

在上面这个简单的例子中我们发现,在大于1的情况下,是永远大于0 的,所以第一个else是无法覆盖的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top