一种基于功能覆盖率的随机激励的自动产生方法

文档序号:6530631阅读:307来源:国知局
专利名称:一种基于功能覆盖率的随机激励的自动产生方法
技术领域
本发明涉及软件测试领域,具体来说,涉及一种基于功能覆盖率的随机激励的自动产生方法。
背景技术
在软件测试、ASIC验证过程中,需获得代码覆盖率及功能覆盖率的数据。虽然在该过程中可以达到100%的代码覆盖率,但仅凭这点尚不能确定所设计的被测试对象(DUT)已经不存在问题,因为被训练的仅仅是代码本身,尚不能判断出是否已输入了所有的激励?是否接收了所有可能的结果?被测试对象的状态是否均已被访问?所有的内部转换是否都已出现?等等。
针对这些问题,业界提出了功能覆盖的概念,功能覆盖定义为来自设备和测试计划规格的清晰的功能需求。所以功能覆盖在度量实现上并不如代码覆盖率那么清晰和容易界定,代码覆盖率的度量在设计和测试激励确定以后就唯一确定了,而功能覆盖率的度量则因功能覆盖率代码的不同而不同。
在功能覆盖率度量的实现上,由于功能覆盖率来自于功能需求,目前功能需求(测试点)都以文档的方式来描述,因此,对于功能覆盖率的度量方法,自然就想到在文档上标明功能点,并辅之以相应的测试用例,当一个测试用例通过了,就表示该测试用例对应的功能点被覆盖了,于是在文档上进行标记,最后测试人员根据文档的标记情况来统计整个测试项目的覆盖率情况。
因此,对于功能覆盖率的度量,在操作上,也可以利用EDA工具来对被测对象定义的功能覆盖率进行自动的执行和统计,其一般是使用可执行的语言描述功能需求的行为,再由仿真工具在仿真时自动判断所描述的功能需求是否覆盖。
但在实际的验证过程中,要达到已定义的功能覆盖率,按上述的实现方法,一般采用根据已定义好的功能覆盖率目标,对要产生的激励施加约束,通过随机来达到目的。这需要编写大量的代码,耗费较大的编程工作。这种方法存在有如下的不足之处1、对单个输入参数具有丰富的约束方式,但对多个参数之间的相互关系约束却没有很好的方式。而实际的功能覆盖率目标往往定义的是多个参数的组合情况。
2、针对功能覆盖率目标的随机激励产生需要编写较多的约束代码,没有专门针对组合、序列的约束方式,要达到功能覆盖率目标比较困难。

发明内容
本发明所要解决的技术问题在于,提供一种基于功能覆盖率的随机激励的自动产生方法,其可以对组合、序列情况提供专门的约束手段,在不需要增加任何约束的情况下,工具能根据功能覆盖率目标,自动产生随机激励,直接完成功能覆盖率目标的覆盖。
为了解决上述技术问题,本发明采用的技术方案在于提供一种基于功能覆盖率的随机激励自动产生的方法,其特征在于,包括定义一个激励的数据结构及测试对象;定义各类别的功能覆盖率,所述功能覆盖率包括基本测试对象、组合测试对象及构成序列的测试对象的功能覆盖率;对组合测试对象设置组合约束,对构成序列的测试对象设置序列约束;产生激励,对于组合测试对象首先生成正交组合,再产生其他组合;对于构成序列的测试对象,自动按其序列来产生激励。在本发明的基于功能覆盖率的随机激励自动产生的方法中,进一步包括根据功能覆盖率目标自动施加组合或序列约束,产生随机激励。
在本发明的基于功能覆盖率的随机激励自动产生的方法中,进一步包括所述组合约束和序列约束直接面向功能覆盖率定义施加约束,或针对功能覆盖率目标任意定义。
在本发明的基于功能覆盖率的随机激励自动产生的方法中,对于组合测试对象生成正交组合的步骤中进一步包括根据测试对象,建立相应正交表,每个正交表中均包括参数数目、水平值和试验次数;为某种测试需求,采用“匹配算法”,找出一种与该测试需求最接近的正交表;匹配到合适的正交表后,确定正交表中的所需要的试验数据;并产生相应的测试向量。
在本发明的基于功能覆盖率的随机激励自动产生的方法中,所述正交表包括含有单一的水平值的“单一型”正交表、含有两种水平值的“混合2型”正交表及含有三种水平值的“混合3型”正交表。
实施本发明的基于功能覆盖率的随机激励自动产生的方法,具有以下有益效果本发明提供了新的组合约束和序列约束方式,使得随机激励的约束方式更加灵活,更容易达到功能覆盖率的目标。同时,根据功能覆盖率的目标,工具可以自动完成随机激励的产生,大大简化了用户编写约束代码的工作量,使得随机激励的产生能够向目标收敛,增强了测试用例的有效性。


图1是本发明中一种集成有功能覆盖率度量模型的验证平台示意图;图2是本发明中测试点的分解过程示意图;图3是本发明中功能覆盖率度量模型中各个要素之间的关系示意图。
具体实施例方式
如图1所示,是本发明中一种集成有功能覆盖率度量模型的验证平台示意图。功能覆盖率统计模块是其中最为重要的模块,在此模块中实现了本发明中的功能覆盖率度量模型;在验证平台的主控台产生激励和结果分析过程中,通过事件触发功能覆盖率统计模块工作。
本发明中的功能覆盖率统计是基于测试点(Testcase)的,测试点的分解过程如图2所示。其中度量了一些基本要素,如测试对象(Object)及段(Segment)等等。
从被测试对象(DUT)的需求规格出发逐渐往下分解,首先根据需求规格分解出验证特性(Feature),即具有同一特征的规格的集合,然后在验证特性中分解测试点(Testcase),最后根据测试点来设计具体的测试用例(Test)。注意测试点和测试用例的关系是多对多的关系,即一个测试点可以对应多个测试用例(多个测试用例可能都测试到了同一个测试点),一个测试用例同样对应多个测试点(一个测试用例中可能测试了多个测试点)。
其中,测试对象(Object)其物理意义是逻辑某个功能处理所涉及到的、有明确物理意义的相关要素。分为基本(Basic)、组合(Cross)、序列(Sequence)三种类型的测试对象。在大规模逻辑测试中,典型的测试对象实例有单个有明确物理意义的信号(如中断信号);输入数据包中需要关心的域(如IP包中CRC域);输入数据流抽象的特性参数(如包长);逻辑内部或输出某种处理;逻辑的某类配置。
段(Segment)的物理意义是根据等价类测试工程方法定义的,Object的所有可能出现的范围,每一个范围为一个Segment,当Object实际取值落在某个已经定义的范围里面时,称该Segment被命中(Hit)1次;一个Object中可以包含一个或多个Segment,每个测试点(Testcase)中可以包含一个或多个Segment,其中这些Segment可以属于不同的Object。
在大规模逻辑测试中,典型的Segment实例有中断信号有效、无效;CRC对、错;包长长包、短包、超长包、超短包、典型长度包;包过滤处理的所有路径路径1、路径2、……输出处理方式0、方式1、……如图3所示,是本发明中功能覆盖率度量模型中各个要素之间的关系示意图。从该图中可以看出,通过Segment将两个层次联系起来了,Segment是度量功能覆盖率的基本元素。
下面具体介绍基于测试点的功能覆盖率计算方法。
对于每个测试点(Testcase),在定义时验证人员会给一个重要级别(如分为高、中、低),每个级别对应着一个权重(Weight)(如高为5,中为3,低为1),每个测试点中包含的Segment都有一个权重(Weight)属性,该值即为所在测试点重要级别对应权重值。通过对测试点定义重要级别,验证人员可以对每个测试点的重要程度进行区分,可以指导验证人员设计测试用例,决定验证人员的测试策略。
从图3可以看出,基于测试点的层次(下面方框内)共有四个层次,分别是段(Segment)、测试点(Testcase)、特性(Feature)、被测试对象(DUT),对这四个层次分别计算覆盖率情况,具体以得分(Score)量化,得分的取值范围为0到1之间(包括0和1),得分为1时称之为完全覆盖到或达到了目标,得分为0时称之为完全没有覆盖到或完全没有达到目标,介于0和1之间称之为部分覆盖到或部分达到目标。
Segment、Testcase、Feature、DUT四个层次的功能覆盖率的计算公式完全一致,都以其包含的Segment的得分(Score)和权重(Weight)为基础。对于Testcase和Feature,还有是否通过的标志(Pass)计算,对于DUT而言,还有测试点通过率(PassRatio)的计算。这四个层次的功能覆盖率计算公式分别描述如下层次一Segment的功能覆盖率Score(Segment)=min(1.00,Hits(Segment)/Goal(Segment))层次二Testcase的功能覆盖率Score(Testcase)=∑(Score(Segment)*Weight(Segment))/∑(Weight(Segment))Pass(Testcase)=(Score(Tests)=1)?1:0层次三Feature的功能覆盖率Score(Feature)=∑(Score(Segment)*Weight(Segment))/∑(Weight(Segment))Pass(Feature)=(Score(Tests)=1)?1:0层次四DUT的功能覆盖率Score(DUT)=∑(Score(Segment)*Weight(Segment))/∑(Weight(Segment))测试点通过率PassRatio(Testcase)=(通过的测试点数目)/(测试点总数)通过分层次计算功能覆盖率(得分),验证人员可以了解到在每个层次的功能覆盖情况,根据功能覆盖情况可以设计特定的测试用例来提高功能覆盖率。
从上面的叙述中可以看出,功能覆盖率可以通过三种类型的object(测试对象)Basic object(基本测试对象)、Cross object(组合测试对象)、Sequence object(构成序列的测试对象)来描述。下面是针对这三种object的示例。
首先对Object进行定义//定义一个激励的数据结构struct Stimulator{bit 3Op{Add,Sub JP}bit 5DataAbit 8DataB}//定义测试对象object Stimulator.OpAddSubJPobject Stimulator.DataA0..1516..31object Stimulator.DataB0..6364..127128..191192..255//定义三类功能覆盖率testcase1 type:basic//定义basic objectStimulator.Op(Add,Sub,JP)goal:1testcase2 type:cross//定义cross objectStimulator.Op(Add,Sub,JP)Stimulator.DataA(0..15,16..31)goal:1testcase3 type:sequence //定义sequence objectStimulator.Op(2*Add,4..5*Sub,JP)goal:1在现有的方法中,要达到上述三种类型的功能覆盖率testcase1、testcase2、testcase3,使用已有的方法需要对其分别施加约束。
//针对testcase1的约束testcase1 type:basic//定义basic objectStimulator.Op(Add,Sub,JP)goal:1
keep Stimulator.Op Addkeep Stimulator.Op Subkeep Stimulator.Op JP//针对testcase2的约束testcase2 type:cross//定义cross objectStimulator.Op(Add,Sub,JP)Stimulator.DataA(0..15,16..31)goal:1keep Stimulator.Op Addkeep Stimulator.DataA 0..15keep Stimulator.Op Addkeep Stimulator.DataA 16..31keep Stimulator.Op Subkeep Stimulator.DataA 0..15keep Stimulator.Op Subkeep Stimulator.DataA 16..31keep Stimulator.Op JPkeep Stimulator.DataA 0..15keep Stimulator.Op JPkeep Stimulator.DataA 16..31//针对testcase3的约束testcase3 type:sequence //定义sequence objectStimulator.Op(2*Add,4..5*Sub,JP)goal:1keep Stimulator.Op Addkeep Stimulator.Op Addkeep Stimulator.Op Subkeep Stimulator.Op Subkeep Stimulator.Op Subkeep Stimulator.Op Subkeep Stimulator.Op JP上述是针对功能覆盖率定义直接施加约束产生激励的方法,这种方法需要编写较多的代码。
当然也可以不加约束,通过完全随机的方式产生激励。但其最后的覆盖率目标的达成结果无法预知,某些情况可能永远无法达到。
而在本发明中,可以采用EDA工具来支持下面的组合约束方式和序列约束方式,可以实现testcase1、testcase2和testcase3的功能覆盖率目标。(注可以将testcase1看作是testcase2的一个特例)。如下述//针对testcase2的约束testcase2 type:cross //定义cross objectStimulator.Op(Add,Sub,JP)Stimulator.DataA(0..15,16..31)goal:1//组合约束keep crossStimulator.Op(Add,Sub,JP)Stimulator.DataA(0..15,16..31)//针对testcase3的约束testcase3 type:sequence //定义sequence objectStimulator.Op(2*Add,4..5*Sub,JP)goal:1//序列约束keep serialStimulator.Op(2*Add,4..5*Sub,JP)针对testcase2的组合,共有6种组合(Add,Sub,JP)*(0..15,16..31),暂且将这6种组合定义为0..5,首先将这6种组合中的正交组合的编号放在前面,其余的放在后面,在产生激励时,先产生正交组合,再产生其他组合。在组合数目较少的情况下还看不出很大的意义,当组合数目很庞大时,其有效性将得到很大体现。
针对testcase3的序列,工具可以自动按这种序列来产生。
其中,所述产生正交组合的过程包括,首先,根据测试的实际需要,建立相应的正交表。
单个正交表有三个基本参数参数数目N、水平值M和试验次数L。在建立正交表时,我们一般建立如下三种正交表。
如果只有单一的水平值,我们称之为“单一型”正交表,如
L8-2^7水平值为2,参数数目为7,试验次数为8如果有两种水平值,则称为“混合2型”正交表,如L36-6^3-3^7水平值一为6,参数数目一为3,水平值二为3,参数数目二为7,试验次数为36同样,对于三种水平值的情况,则称为“混合3型”正交表,如L72-4^1-3^24-2^20水平值一为4,参数数目一为1,水平值二为3,参数数目二为24,水平值三为2,参数数目三为20,试验次数为72不同的参数数目和不同的取值数目对应有不同的正交表。由于不同的正交表没有一个统一的算法,需要事先算出相应的正交表,然后根据实际需要查找对应的正交表。现在的问题是,可以事先存入的正交表数目是有限的,不可能事先算出所有可能出现的正交表,这就是说,对于某种测试需求,在查找正交表时,可能查找不到正好适合的正交表,这就需要采用“匹配算法”,对不同取值数目的参数进行“合并”,找到一种与该测试需求最接近的正交表。
这种“匹配算法”可以通过以下三种算法来实现“查找算法(找算法)”、“涨算法”和“凑算法”。
“查找算法”是指查找到水平值相等、参数数目大于等于输入参数数目的正交表;“涨算法”是指对水平值进行加1的算法;“凑算法”是将两个或多个水平值“凑”在一起,其中最大的水平值作为“凑”后的水平值,同时将其对应的参数数目相加作为“凑”后的参数数目。
这三种算法交互使用,共同完成匹配查找。下面以水平值最大为7为例,来描述这种匹配算法。
找、涨、凑算法“涨”算法指水平值反复加1,直到水平值达到7“查找”算法“查找”算法中仅包括“涨”操作,而无“凑”算法注查找到指水平值相等,参数数目大于等于输入参数数目A、单一型“查找”算法先在单一型索引表中查找水平值和参数数目if(水平值和参数数目符合){查找到正确返回;}else//不符合{对水平值执行“涨”算法,直到7,在单一型索引表中进行反复查找;if(查找到){以试验数目最少的返回;}else//查找不到{查找失败返回;}}B、混合2型“查找”算法先查找高水平值和参数数目if(高水平值和参数数目符合){再查找低水平值和参数数目;if(查不到){对低水平值执行“涨”算法,直到7,进行反复查找;if(查找到){查找到正确返回;}else//查找不到{查找失败返回;}}else//查到{
查找到正确返回;}}else//不符合{对高水平值执行“涨”算法,直到7,进行反复查找;if(查找到){再查找低水平值和参数数目if(查不到){对低水平值执行“涨”算法,直到7,进行反复查找;if(查找到){查找到正确返回;}else//查找不到{查找失败返回;}}else//查到{查找到正确返回;}}else//查找不到{查找失败返回;}}C、混合3型“查找”算法先查找高水平值和参数数目if(高水平值和参数数目符合){再查找中水平值和参数数目;if(查不到){对中水平值执行“涨”算法,直到7,进行反复查找;if(查找到){再查找低水平值和参数数目if(查不到){对低水平值执行“涨”算法,直到7,进行反复查找;
if(查找到){查找到正确返回;}else//查找不到{查找失败返回;}}else//查到{查找到正确返回;}}else//查找不到{查找失败返回;}}else//查到{查找到正确返回;}}else//不符合{对高水平值执行“涨”算法,直到7,进行反复查找;if(查找到){再查找中水平值和参数数目if(查不到){对中水平值执行“涨”算法,直到7,进行反复查找;if(查找到){再查找低水平值和参数数目if(查不到){对低水平值执行“涨”算法,进行反复查找;if(查找到){查找到正确返回;}else//查找不到{查找失败返回;
}}else//查到{查找到正确返回;}}else//查找不到{查找失败返回;}}else//查到{查找到正确返回;}}else//查找不到{查找失败返回;}}“凑”算法“凑”指小水平值向大水平值“凑”A、对于混合2型的“凑”法在混合2型中查找if(查找到){查找到正确返回;}else//未查找到{两个相“凑”,在单一型索引表中查找;if(查找到){查找到正确返回;}else//查找不到{查找失败返回;}}B、对于混合3型的“凑”法先进行两两相“凑”,再分别对每种“凑”的结果通过混合2型“查找”算法进行查找(要保留“凑”的结果)。在混合3型中查找if(查找到){查找到正确返回;}else//未查找到{两两相“凑”在混合2型中查找;1、凑的结果1在混合2型中查找;2、凑的结果2在混合2型中查找;3、凑的结果3在混合2型中查找;if(查找到){以试验数目最少的返回;}else//查找不到{三个相“凑”在单一型索引表中查找if(查找到){查找到正确返回;}{查找失败返回;}}}C、对于混合4型的“凑”法进行两两相“凑”(共6种),“凑”成混合3型,再按混合3型进行处理D、对于混合5型的“凑”法进行三三相“凑”(共10种),“凑”成混合3型,再按混合3型进行处理E、对于混合6型的“凑”法进行四四相“凑”(共15种),“凑”成混合3型,再按混合3型进行处理当匹配到合适的正交表后,还需根据匹配过程中的“凑”、“涨”的情况确定正交表中哪些试验数据是需要的。
其次,对于每个参数,将其分为若干个等效段,每个等效段作为该参数的一种取值;当选中某个等效段时,再按随机的方式取该段中的某个具体的值。
最后,在产生测试向量时,只需指定哪些参数需要进行正交,软件工具将查找到相应的正交表,然后根据正交表自动产生相应数目的测试向量。比如对于三参数三种取值的各种组合(27种),A(A1,A2,A3)×B(B1,B2,B3)×C(C1,C2,C3),软件自动选取其中的9种组合作为测试向量。
同样,在定义测试覆盖率目标时,将正交表定义的组合情况作为覆盖的首要目标,命中这些目标,其覆盖率得分就高。在本发明中,在不施加任何约束的情况下,工具还可以根据功能覆盖率目标自动施加上述约束,产生随机激励,其实现方法同上,所不同的是,当这些组合全部产生后,以后的激励按完全随机的方式来产生。
上述新增的两种方法具有独立性,组合约束和序列约束可以直接面向功能覆盖率定义来施加约束,也可以不针对功能覆盖率目标任意定义,具有较高的灵活性。
工具自动完成的实现方法是直接按功能覆盖率目标定义来产生随机激励的,其针对性更强,目标更明确,用户编程的工作量更小,可以不额外增加任何约束代码。
权利要求
1.一种基于功能覆盖率的随机激励的自动产生方法,其特征在于,包括定义激励的数据结构及测试对象;定义功能覆盖率,所述功能覆盖率包括基本测试对象、组合测试对象及构成序列的测试对象的功能覆盖率;对组合测试对象设置组合约束,对构成序列的测试对象设置序列约束;产生激励,对于组合测试对象首先生成正交组合,再产生其他组合;对于构成序列的测试对象,自动按其序列产生激励。
2.根据权利要求1所述的基于功能覆盖率的随机激励的自动产生方法,其特征在于,进一步包括根据功能覆盖率目标自动施加组合或序列约束,产生随机激励。
3.根据权利要求2所述的基于功能覆盖率的随机激励的自动产生方法,其特征在于,进一步包括所述组合约束和序列约束直接面向功能覆盖率定义施加约束,或针对功能覆盖率目标任意定义。
4.根据权利要求1至3任一项所述的基于功能覆盖率的随机激励的自动产生方法,其特征在于,在组合测试对象生成正交组合的步骤中进一步包括根据测试对象,建立相应正交表,每个正交表中均包括参数数目、水平值和试验次数;根据测试需求,采用“匹配算法”,找出与该测试需求最接近的正交表;确定正交表中的所需要的试验数据,并产生相应的测试向量。
5.根据权利要求4所述的基于功能覆盖率的随机激励的自动产生方法,其特征在于,所述正交表包括含有单一的水平值的“单一型”正交表、含有两种水平值的“混合2型”正交表及含有三种水平值的“混合3型”正交表。
全文摘要
本发明涉及一种基于功能覆盖率的随机激励的自动产生的方法,包括定义激励的数据结构及测试对象;定义各类别的功能覆盖率,所述功能覆盖率包括基本测试对象、组合测试对象及构成序列的测试对象的功能覆盖率;对组合测试对象设置组合约束,对构成序列的测试对象设置序列约束;产生激励,对于组合测试对象首先生成正交组合,再产生其他组合;对于构成序列的测试对象,自动按其序列来产生激励。本发明使随机激励的约束方式更加灵活,更容易达到功能覆盖率的目标。同时,根据功能覆盖率的目标,工具可以自动完成随机激励的产生,可简化了用户编写约束代码的工作量,使得随机激励的产生能够向目标收敛,增强了测试用例的有效性。
文档编号G06F11/36GK1873625SQ20051003678
公开日2006年12月6日 申请日期2005年8月19日 优先权日2005年8月19日
发明者易敏, 王进成, 程智辉, 王万财 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1