hacrwang

this is temp storage for hacrwang

 

Logiscope测试机理

1前言

本文介绍了静态测试工具 Logiscope的测试机理。通过对Logiscope测试机理的 了解,能 帮助我们更好的 使用 这个工具。

通过阅读本文,你可以了解到以下信息:

 Logiscope是如何分析 软件产品质量的;

 Logiscope是如何检测代码的编码规范的;

 Logiscope是如何统计测试覆盖率 的;

2 Logiscope总览

Logiscope有三项主要功能,以三个独立工具的形式出现,分别是:

软件质量分析工具——Audit;

代码规范性检测工具—— Rulechecker ;

测试覆盖率统计工具—— TestChecker 。

Audit和 Rulechecker 提供了对软件进行 静态分析的功能, TestChecker提供了测试覆盖率统计的功能。
    
    Logiscope可以对多种语言实现的代码进行分析,比如C、C++、Java、Ada,等等。下面的内容与具体的语言基本是没有关系的,但如果某些地方确实要涉及具体的语言,则我都是以C++为例。

    下面,我对 Audit 、 Rulechecker 和 TestChecker 的测试机理,分别进行介绍。

3 Audit测试机理

3.1软件质量模型

前面已经说过, Audit 是审查程序代码质量的。要讨论代码的质量,就需要先说明一下软件质量模型的概念,因为理解下面的内容需要软件质量模型的相关知识。

如果你原来学习过软件质量保证的相关知识,那么应该会对软件质量模型这个概念有印象。为了说明 Audit 的测试机理,在这里只对软件质量模型做个简单的介绍。如果你对软件质量模型的概念比较陌生,建议找一本讲述软件工程方面的书,阅读一下软件质量保证部分的内容。

软件质量模型是一个分层结构,它的一般形式如下图所示:

logiscope1.gif
图3-1 软件质量模型的一般形式

由图可以看出,质量因素处于质量模型中最高一级。软件的质量因素包括 功能性、可靠性、易用性、效率、可维护性、可移植性这六 个方面( 在ISO/IEC 9126中有详细的描述)。

在质量因素之下,又细分成多个质量标准。

每个质量标准又由多个质量度量元组成。这些质量度量元处于 质量模型 分层结构中的最底层 。

    质量因素、质量标准一般是固定的,就是这几类,
但质量度量元不是固定的,可以根据不同的情况发生变化。

软件质量模型就是一个将程序信息由底层到高层、由细节到概括的一个过程模型,它由简单、可测量的数据入手,最后分析概括出软件的特征。

3.2 Audit对软件质量模型的实现

上面我们了解了 软件质量模型的大体结构, Audit 也是按照这种分层、量化的方式来审查代码质量的。

Audit 通过一个文本文件来定义质量模型。在为被测代码建立 Audit 检测项目的过程中,有一步是要求我们“ choose a quality ”,这就是在要求我们设定一个质量模型,默认的, Audit会 提供一个质量模型文件,它的位置在“ LogiscopeHOME \Logiscope\Ref\Logiscope.ref ”。用记事本打开这个文件,通过观察我们会发现,文件中首先定义了若干个度量元,并为这些度量元设定了数值范围,接着通过组合若干个度量元形成质量标准,最后又通过组合质量标准,形成最后的质量因素。这个过程与软件质量模型中由底层到高层、由细节到概括的结构恰好对应。

除了使用 Audit 提供的这个质量模型文件外,我们当然可以定义自己的质量模型文件(99%的情况下都需要我们制定符合我们需要的质量模型文件),只要符合 Logiscope.ref 这个文件的格式即可。

为了方便起见,我们下面就以 Audit 提供的这个质量模型文件展开讨论,讲解 Audit对软件质量模型的实现。

对应于 质量模型中 质量因素这一级,Logiscope提供的默认的 质量模型文件对软件的可维护性这个质量因素进行了实现,使用这个文件,可以通过 Audit 评价软件的可维护性水平 。

    在 质量标准级,在质量模型文件中定义了 四个质量标准,分别是: 易于分析性( ANALYZABILITY )、易于测试性( TESTABILITY )、稳定性( STABILITY )和适应变化性 ( CHANGEABILITY )。

对于软件质量模型中最底层的质量度量元级,质量模型文件 从Audit提供的度量元中选择了几十个 度量元构成了基本度量元 ,比如函数语句数 度量元 (lc_stat)、类公共数据成员数 度量元( cl_data_publ ), 等等。

那么各层具体的分析结果是如何得出来的呢?我们按照质量度量元、质量标准、 质量因素的顺序由底到高,依次解释。

在 Audit 的内部定义了大量的质量度量元,度量元是检验一个软件质量好坏的最基本元素。在Logiscope提供的这个默认质量模型文件中,选取的度量元都是为最后评价可维护性提供服务的。通过观察 Logiscope . ref 质量模型文件,你会发现,度量元都可以量化为数字,允许我们在质量模型文件中为每个度量元设定上限值和下限值。当某一度量元超出我们设定的上限值和下限值的范围时, Audit就 认为被检测的代码在该项度量元上不符和要求。

    下面举一个度量元的例子:
lc_stat 度量。 该度量元表示函数中可执行语句的数量。 lc_stat 度量元对于衡量函数的复杂性是很有用的,比如我们可以设定它的上限值为 30 ,下限值为 0 ,即我们规定了:一个函数中可执行的语句数不能超过 30 条。这就是 Audit 对质量模型中度量元级的处理方法。

通过这一个个单独的度量元,我们还不能判断程序的可维护性如何,因为过于片面,只有将这些度量元按某种规则组织起来,才能对软件的可维护性作出评价。通过观察 Logiscope . ref 这个质量模型文件我们会发现,每个质量标准都是由若干个度量元按权相加组成的,质量标准最后也用数字来表示它自己的值。通过质量标准值的大小, Audit 给出程序代码遵守该项质量标准的级别。级别共有四个,由高到底依次是 EXCELLENT (优秀)、 GOOD (良好)、 FAIR (合格)、 POOR (不合格)。下面从 Logiscope . ref 文件中摘录一段,作为如何计算质量标准的例子:

logiscope2.gif

这个质量标准是评价函数的稳定性的。最上面一行是这个质量标准的计算公式:

function_STABILITY = ic_varpe + ct_exit + dc_calls + ic_param

该公式表明,该质量标准由四个度量元所决定,即 ic_varpe 、 ct_exit 、 dc_calls 、 ic_param ,每个度量元的权重均为1。该质量标准的最高得分为 4 分,即当构成该质量标准的四个度量元的值均在我们设定的范围内时,该项质量标准得分为 4 分,当有三个度量元的值均在我们设定的范围内时,该项质量标准得分为 3 分,以此类推。最后根据具体的得分,可以判定程序代码在该项质量标准上所处的等级。这就是 Audit 对质量模型中质量准则级的处理方法,可以看出,质量准则是建立在质量度量元的基础之上的,是比质量度量元更加综合的一级。

最后,综合多个质量标准,得出代码的可维护性质量因素。可维护性因素的计算方法如下:

function_MAINTAINABILITY: component  =  function_ANALYZABILITY

+  function_CHANGEABILITY

+  function_STABILITY

+  function_TESTABILITY

logiscope3.gif

这是在计算函数的可维护性。最上面是计算公式,函数的可维护性由四个质量标准的得分相加得出(质量标准得分的计算方法上面已经说过了)。对于这个例子来说,它的最高得分为 12 分,最低得分为 0 分。最后根据具体的得分,可以判定程序代码在可维护性上所处的等级( EXCELLENT 、 GOOD 、 FAIR 、 POOR )。通过层层综合,最后终于得到了可维护性质量因素的结果。

OK,以上通过 Audit 为我们提供的默认质量模型,讲述了在 Audit 中由质量度量元、到质量准则、最后到质量因素的逐级评价方法。如果是我们自己制定的质量模型,其原理是完全一样的。

怎么样,这个过程清楚了吗?如果还是有些迷惑,建议你看一看“ Logiscope HOME \Logiscope\Ref\Logiscope.ref ”这个文件的内容,那会对你理解这些内容有所帮助。

3.3 作用域的划分

我们在人工分析一个应用程序的代码时,通常先会查看应用程序的总体情况,然后分析应用程序中的各个类(对于使用面向对象这类语言实现的代码来说),进而再分析类中的成员函数。

Audit 在分析、显示对代码的审查结果时,也按这种形式进行划分,我们称它为作用域,比如对于C++、Java语言实现的代码, Audit 划分的作用域有:应用程序作用域、类作用域、函数作用域。通过它们的名字,你应该可以猜出各个作用域所包含的内容。应用程序作用域针对整个应用程序,类作用域针对系统中的各个类,函数作用域针对系统中的各个函数。

不同作用域之间是彼此独立的,但它们都是遵照我们前面提到的那个质量模型对代码进行分析。

3.4 Audit对代码的处理过程

对于使用Audit的用户来说,输入的是源程序代码,输出的是Audit的分析结果。Audit对代码的处理过程如图所示:

jili1.jpg
图3-2 Audit对代码的处理过程

3.5 结束

好了,Audit 的测试机理到此就介绍完了。



4 Rulechecker检测机理

现在来介绍一下 Logiscope为我们提供的另外一个工具—— Rulechecker 。 Rulechecker 也是一个静态测试工具。

先回想一下我们组织内部的编码规范。编码规范中会对程序代码的 注释、变量命名、 书写格式等各个方面做出规定,其目的,是为了让开发人员书写的代码更健壮,可读性更好。 Rulechecker 这个工具也是为了协助我们实现使 代码更健壮,可读性更好 这个目的的。

Rulechecker 实现了一个编码规范集。在这个规范集中 的内容,与我们组织内部定义的编码规范的内容类似,但覆盖的范围要更广,规定的也更细(关于 Rulechecker 编码规范集中各条编码规范的详细内容,可以阅读我写的另一篇文章《 RuleChecker 编码规范》,在这里就不做描述了)。

在这个规范集中 ,有将近一半 左右的编码规范,我们可以对其内容进行定制,这就大大增加了灵活性,使 Rulechecker 能更好的适应我们实际情况的需要。

在具体的测试过程中, Rulechecker 的编码规范是如何发挥作用的呢?在我们为被测代码建立 Rulechecker 项目的过程中,有一步是让我们“ Choose a configuration file ”,这就是让我们选择一个编码规范描述文件, Rulechecker 为我们提供了一个叫做‘ RuleChecker.cfg’ 的编码规范描述文件,我们当然可以修改或重新编写一个 .cfg 文件, 来适应我们的要求。

下面举 Rulechecker 编码规范集中一个编码规范的例子: Headercom 编码规范

    
Headercom编码规范 对代码文件的 文件注释做出了规定,具体内容为:“每个代码 文件的头部必须有文件注释,且注释要遵照一定的格式”。这个格式可由我们来设定。

				我现在将
				Headercom规范要求的
				注释
				格式,
				设置成与我所在公司的编码规范中规定的文件注释相同的格式。




打开
RuleChecker.cfg文件,用下面的内容代替文件Headercom原来的内容。

STANDARD Headercom ON

LIST "HEADER"                " 【文件名】 "

                                          " 【功能模块和目的】 "

                                          " 【主要函数及其功能】 "

                                        " 【主要算法】 "

                                         " 【接口说明】 "

                                        " 【开发者及日期】 "

                                        " 【版本】 "

                                        " 【更改记录】 " END LIST

LIST "CODE"                    " 【文件名】 "

                                          " 【功能模块和目的】 "

                                          " 【主要函数及其功能】 "

                                         " 【主要算法】 "

                                          " 【接口说明】 "

                                         " 【开发者及日期】 "

                                        " 【版本】 "

                                        " 【更改记录】 " END LIST

END STANDARD

做完这个操作后,保存成另一个文件,以 .cfg 为后缀名。在建立被测代码的 RuleChecker 项目时,选中这个文件,则 RuleChecker 会以该格式检查代码文件的文件注释格式,如果哪个文件不符合要求,就会被检测出来。

OK,RuleChecker 的测试机理介绍完了,应该是很好理解的。

5 TestChecker检测机理

现在来介绍一下 Logiscope为我们提供的最后一个工具——TestChecker 。 TestChecker是用来统计 被测试程序的测试覆盖率的。它提供的覆盖率数据是边覆盖率,或者叫判定到判定的覆盖 (DDP 覆盖 ) 。

所谓边覆盖率,也就是我们执行的测试用例对程序流程图中的边的覆盖情况。有一些单元测试工具,比如 Numega中的TrueCoverage ,Rational的Purecoverage等,它们也可以 统计 被测试程序的测试覆盖率,但它们所提供的覆盖率数据是点覆盖率( IB 覆盖率),或者叫做语句覆盖率,这个覆盖率的覆盖强度要低于边覆盖的覆盖强度。

TestChecker 的测试机理是这样:建立起TestChecker项目后,通过TestChecker编译连接代码,生成可执行文件,在这个过程中,TestChecker会向程序源代码中涉及到控制流转移的语句处,插入一些标志语句(这个过程叫做“插装”)。在TestChecker中运行起被这个可执行文件,执行测试用例的时候,TestChecker会在后台运行。由于在程序代码中“插装”了标志语句,所以在程序的执行过程中,TestChecker能记录下程序中哪些分支走到了,哪些分支没有走到,进而统计出每个测试用例的覆盖率,以及多个测试用例覆盖率的总和。

TestChecker的测试机理基本就是这样。

6 总结

        Logiscope 的测试机理到此就介绍完了,象其它的计算机技术一样,理解、掌握 Logiscope 的最好办法就是实际的使用 Logiscope 去测试一些项目,好了,让我们开始吧。

posted on 2006-05-06 20:49 hacrwang 阅读(410) 评论(0)  编辑 收藏 引用 所属分类: Code Checker

导航

随笔档案

文章分类

文章档案

搜索

最新评论