C++ Test 之 RuleWizard 使用心得
***************************************
关键字:C++Test Rulewizard Python
难易度:中
软件版本:Parasoft C++ Test 6.5
时间:2005-11-23
Author:Kino
********************************
一.介绍一下C++Test吧(这一部分请允许我ctrl + c/v )
是单元测试和静态分析工具,自动测试C和C++类别、功能或组件,而无需编写单个测试实例、测试驱动程序或桩调用。只需点击按钮,C++Test即会采用业内编码标准执行代码的静态分析,测试代码构造(白盒测试),测试代码功能性(黑盒测试),并保持代码完整性(回归测试)。可以巡行在Windows 2000/XP 、Linux 、Solaris 7, 8, 9平台之上。她的主要功能可以参见下边的链接网页:
http://www.superinst.com/cn/products/software_engineering/unit_testing/parasoft/ctest.html
这里我想说明的不是C++Test有多么好用,而是要说明她内置的RuleWizard™定制编码机能。那么什么才是RuleWizard呢?他到底能干什么?
二.RuleWizard
C++Test内置了300多个静态测试项,一般的情况下其实也就够用了。但是如果有特殊的测试要求,动辄几十K的代码,用眼睛看,脑子想,太辛苦,也不“安全”。那么使用rulewizard定制自己的规则还是很有用的。
我们首先要明确,rulewizard定制的是 不成功 的情况。也就是应该被排除的。
Rule的创建有2种方式,一种是手工写规则,另一种是写入需要剔除的代码,让rulewizard去帮你生成规则(最好别用,弱弱的autocreate)。我这里主要重点放在自己写规则方面。
Rulewizard的界面如下图:
*******
图1。RuleWizard界面
右边的就是我们写的规则。
那么我们先来大概的介绍一下rulewizard定义的基本组成部分吧。(实在不太会翻译,那么就沿用英文名字了,请大家多多包涵)
Node:规则的基本组成部分,通过Node你可以很清楚的知道它的功能。比如表达式a=b、变量的类型测试。。。分为:
parentNode:规则中的主分支Node或者次分支的主Node。内容可以是表达式、变量、函数等
childNode:规则的组成单元。
Commands:用来在Node和Nodes之间建立关联关系。形象一点就是点中一个Node然后右键显示出的快捷菜单的上半部分。如下图:
图2
介绍一下主要的Command
Collector:集合。这个概念更像数学中的集合而不是Java中的广义集合。满足一定条件的数据或者方法或者变量的全体。比如,所有被声明过的变量,如下图
图3
isDecl是用来返回前边的node是不是一个声明。那么body的membervariable返回了所有的包涵指定类型变量得语句(包括 变量付值、声明、判断等)那么这个图被理解为,所有不是声明得语句内使用的变量的集合。
没有被声明的变量,如下图。
图4
这里的意思是所有作为声明语句的变量的集合。
那么通常情况下,A集合和B集合应该是相等的,也就是说所有被声明过的变量(B集合内容)应该都被使用/付值/判断(A集合的内容)。那么对于存在声明了但没有被使用的变量的特殊情况应该怎么样表示呢?
Node Set:Node对Node集合的处理。分为Union(合并)、Intersection(交叉)、Difference(差值,左差/右差)、Xor(异或)。如下图:
图5
如果 满足这个规则,那么输出相应得警告信息。
Output:如果满足check的条件,向用户返回一个消息(箭头表示)
三.Python
这里python是用来给rulewizard作补充的一个脚本语言。通过python可以定制一些特殊的,rulewizard的node不能完成的规则。Python可以使用2种方式被加入到规则中:
作为一个输出:如果规则没有被遵守那么可以调用一个违反规则的方法。(类似于输出错误消息,只不过这里用来启动一个方法而已)
作为一个单独的方法组件:其实就是一个方法而已。比如,以上图为例子,如果我们不判断B 和 A的大小关系,就是想打印一下A、B的内容,那么就得到如下的图:
图6
其中Method的内容是:
def showCollectorContext(node,context):
a = context.getList("A")
b = context.getList("B")
context.report("D's Context is " + str(a) + "C's Context is " + str(b))
那么在c++test进行测试的时候就会得到输出我们需要的内容。
关于python的语法我这里就不写了,毕竟和这篇文章的内容美关系。如果想要了解,可以去下载相关资料,我这里建议使用 Orielly的 Python in a Nutshell 。
四.不足点
作为一个能自定义规则的静态测试工具,不得不佩服parasoft兄弟们的才智。但是我觉得还有一些改善点的:(当然也不排除,已经有,但我没有发现的情况,如果各位知道请指教,谢谢先)
1. 通过pyhon我们可以干涉规则的制定,比如,对于上例变量的确定,如果们不使用collect set的Difference|left menus(就是图4中最下的那个6边形),而用python一样的可以对比2个List。但是就像他提供的功能是静态测试一样,这里我们得到的永远是经过处理的集合。而不能把python插入检测的循环中,不能一次得到一个变量,做点操作然后等下次的变量。
2. 集合的概念在这里有 他的优点,也有缺点,如果我们想要明确的得到代码里相同变量的出现次数,那么通过现有的rulewizard是得不到的,因为我们得到的集合总是经过“合并”的、没有重复的数据结构。
3. 就我看到的资料,所有的内置的node都没有为用户提供接口。不能够把通过python的处理结果正确的传递给内置的node。感觉所有的python做成的node 都是“叶子”。
4. 技术支持和官方论坛人气低到,看了浑身发抖的地步。没有交流,没有讨论。不知道是不是因为太贵的原因。
5. 贵!!!真的很贵。动辄就是4XXX$。-_-! 反正贵。
就写这么多,希望大家多多交流,国内关于软件的新闻有不少,经验却没有,希望能给我仍的“砖”能换来大家“玉”。谢谢!