posts - 11, comments - 29, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

C++ Test 之 RuleWizard 使用心得

Posted on 2005-11-22 17:43 -=Kinohl=- 阅读(3993) 评论(9)  编辑  收藏 所属分类: 软件评测

C++  Test  之 RuleWizard 使用心得
***************************************
关键字:C++Test    Rulewizard    Python
难易度:中

软件版本:Parasoft  C++ Test  6.5
时间:2005-11-23
Author:Kino
********************************

一.介绍一下C++Test吧(这一部分请允许我ctrl + c/v )

是单元测试和静态分析工具,自动测试CC++类别、功能或组件,而无需编写单个测试实例、测试驱动程序或桩调用。只需点击按钮,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的界面如下图:


o_Rulewizard001.JPG*******

图1。RuleWizard界面

 

 

右边的就是我们写的规则。

那么我们先来大概的介绍一下rulewizard定义的基本组成部分吧。(实在不太会翻译,那么就沿用英文名字了,请大家多多包涵)

Node:规则的基本组成部分,通过Node你可以很清楚的知道它的功能。比如表达式a=b、变量的类型测试。。。分为:

parentNode:规则中的主分支Node或者次分支的主Node。内容可以是表达式、变量、函数等

childNode:规则的组成单元。

Commands用来在NodeNodes之间建立关联关系。形象一点就是点中一个Node然后右键显示出的快捷菜单的上半部分。如下图:

 o_Rulewizard002.JPG

 图2

介绍一下主要的Command

Collector:集合。这个概念更像数学中的集合而不是Java中的广义集合。满足一定条件的数据或者方法或者变量的全体。比如,所有被声明过的变量,如下图

o_Rulewizard003.JPG
图3

isDecl是用来返回前边的node是不是一个声明。那么bodymembervariable返回了所有的包涵指定类型变量得语句(包括 变量付值、声明、判断等)那么这个图被理解为,所有不是声明得语句内使用的变量的集合。

没有被声明的变量,如下图

o_Rulewizard004.JPG
图4

这里的意思是所有作为声明语句的变量的集合。

 

那么通常情况下,A集合和B集合应该是相等的,也就是说所有被声明过的变量(B集合内容)应该都被使用/付值/判断(A集合的内容)。那么对于存在声明了但没有被使用的变量的特殊情况应该怎么样表示呢?

Node Set:NodeNode集合的处理。分为Union(合并)、Intersection(交叉)、Difference(差值,左差/右差)、Xor(异或)。如下图

o_Rulewizard006.JPG
图5

如果 满足这个规则,那么输出相应得警告信息。

 

Output如果满足check的条件,向用户返回一个消息(箭头表示)

 

三.Python

       这里python是用来给rulewizard作补充的一个脚本语言。通过python可以定制一些特殊的,rulewizardnode不能完成的规则。Python可以使用2种方式被加入到规则中:

作为一个输出:如果规则没有被遵守那么可以调用一个违反规则的方法。(类似于输出错误消息,只不过这里用来启动一个方法而已)

作为一个单独的方法组件:其实就是一个方法而已。比如,以上图为例子,如果我们不判断B A的大小关系,就是想打印一下AB的内容,那么就得到如下的图:

 

 r_Rulewizard005.JPG

图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  setDifference|left menus(就是图4中最下的那个6边形),而用python一样的可以对比2List。但是就像他提供的功能是静态测试一样,这里我们得到的永远是经过处理的集合。而不能把python插入检测的循环中,不能一次得到一个变量,做点操作然后等下次的变量。

2.              集合的概念在这里有 他的优点,也有缺点,如果我们想要明确的得到代码里相同变量的出现次数,那么通过现有的rulewizard是得不到的,因为我们得到的集合总是经过“合并”的、没有重复的数据结构。

3.              就我看到的资料,所有的内置的node都没有为用户提供接口。不能够把通过python的处理结果正确的传递给内置的node。感觉所有的python做成的node 都是“叶子”。

4.              技术支持和官方论坛人气低到,看了浑身发抖的地步。没有交流,没有讨论。不知道是不是因为太贵的原因。

5.              贵!!!真的很贵。动辄就是4XXX$-_-! 反正贵。

就写这么多,希望大家多多交流,国内关于软件的新闻有不少,经验却没有,希望能给我仍的“砖”能换来大家“玉”。谢谢!


评论

# re: C++ Test 之 RuleWizard 使用心得  回复  更多评论   

2005-11-23 17:08 by -=Kino=-
噢对了,都忘了一个很关键的问题:
集合的1 2 3 4 5。。。都代表什么意思。
这个数字又是如何产生的呢?

第2个问题:
在rulewizard中,以当前的collector所指向的node为起点,递归的数到根,然后+1,就是数字的最大上限,
比如:图1种的B集合所在的node是第3级,那么数字最大就是3;图3中的A集合所在node是第2级,那么数字最大就是2。

第1个问题:
首先对于不同的node产生的集合其可选种类(数字)不尽相同:
总结的活计还没干,先提一下1、2、3一般情况下都表示什么吧。
1 --- 集合只有一个元素,就是最后匹配的那个,以往的匹配元素都被清空。
2 --- 集合记录下一个TestCase的所有匹配参数。
3 --- 集合记录下所有此类TestCase的匹配参数。

举个例子吧:
有如下的一个方法A,其设定参数分别为abcd,即测试a(b)结构
string a,b,c,d;
methodA(a,b);
methodA(b);
methodA(d);
如果我们要匹配方法A内出现的参数,并将其作为一个集合。
那么:
1 >>> 得到3个匹配结果,分别为:[b] [b] [d]
找到一个参数记入集合,再进行下一个参数查找之前清空集合。
2 >>> 得到3个匹配结果,分别为:[a,b] [b] [d]
找到a(b)结构并且a==methodA里所有的匹配的参数,放入集合,排除重复的。
3 >>> 得到3个匹配结果,分别为:[a,b] [a,b] [a,b,d]
找到整个文件里所有a(b)结构并且a==methodA的方法调用中的参数,放入一个集合,排除重复的。

总结:
这里的数字就是表示了一个范围,范围的起点不是当前的node,而是当前的parent Node。结束也不是root Node,而是隐含的上界(整个文件)。
这样就可以理解了吧。
(越来越发现纯语言的表述就是有限)

# re: C++ Test 之 RuleWizard 使用心得  回复  更多评论   

2005-11-23 17:36 by -=Kino=-
对了,给各位想使用rulewizard又没有钱的朋友提示一下:
C++ Test 是用Java写的,那么。。。明白了吧!
这就是java的软肋啊。不知道是该开心呢,还是该忧虑呢?
(sigh,现在的感觉有点像搬起石头砸自己的脚,还说很爽。。。)

# re: C++ Test 之 RuleWizard 使用心得  回复  更多评论   

2006-10-10 09:51 by mingke
请教:Parasoft C++ Test 6.5 pro 自带的RuleWizard是 只读 版本,如何变成可编辑版本?多谢!

# re: C++ Test 之 RuleWizard 使用心得[未登录]  回复  更多评论   

2008-03-10 15:12 by Tony
哎..迷惑啊..谁能帮我了解下C++TEST的RLUE制作方面的知识.加我MSN号:wangfeng521123@hotmail.com

# re: C++ Test 之 RuleWizard 使用心得  回复  更多评论   

2008-05-23 15:49 by hsm
同问:
Parasoft C++ Test 6.5 pro 自带的RuleWizard是 只读 版本,如何变成可编辑版本?多谢!

# re: C++ Test 之 RuleWizard 使用心得  回复  更多评论   

2008-05-26 17:42 by kinohl
为什么能使用 rule wizard 。。。
其实也很简单,这软件是java写的,用decompiler 反编译,得到原码。
这里只要修改一下,menu bar上的代码,让本来灰色的按钮变亮就可以用了。
时间比较长了,我自己都忘了具体是哪个类了。

# re: C++ Test 之 RuleWizard 使用心得  回复  更多评论   

2008-05-26 17:43 by kinohl
TODO :
   wangfeng521123@hotmail.com
   sysmon ?

# re: C++ Test 之 RuleWizard 使用心得  回复  更多评论   

2009-02-03 14:10 by nicoleluu
图形化的自定义规则还是非常好的,这样规范包相当于自己公司的!
好像亿道电子可以免费试用~~

# re: C++ Test 之 RuleWizard 使用心得  回复  更多评论   

2011-06-26 22:09 by 小蛮
谢谢博主,很牛的资料。

只有注册用户登录后才能发表评论。


网站导航: