CN103593291B - 用于包括多个函数测试模块的单元测试方法及装置 - Google Patents
用于包括多个函数测试模块的单元测试方法及装置 Download PDFInfo
- Publication number
- CN103593291B CN103593291B CN201310581759.9A CN201310581759A CN103593291B CN 103593291 B CN103593291 B CN 103593291B CN 201310581759 A CN201310581759 A CN 201310581759A CN 103593291 B CN103593291 B CN 103593291B
- Authority
- CN
- China
- Prior art keywords
- function
- node
- statement
- path
- controlling stream
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种用于包括多个函数测试模块的单元测试方法及装置,为解决现有的单元测试中无法实现函数调用语句中函数错误的测试而设计。所述方法包括构建测试模块,所述测试模块包括两个以上有调用关系的函数;根据测试模块内程序的逻辑关系及函数间的调用关系形成若干条函数间路径;为每一条所述函数间路径选择测试用例进行测试。所述方法及装置在单元测试阶段即可及时的发现函数调用中的错误,避免了将函数调用的错误延迟到集成测试中,进而及时的对软件中函数调用的错误进行修正,达到了降低测试成本的目的。
Description
技术领域
本发明涉及计算机领域的软件测试技术,尤其涉及一种用于包括多个函数测试模块的单元测试方法及装置。
背景技术
软件测试包括对软件单元的单元测试以及多个单元的集成测试。
单元测试包括确定软件程序测试的最小模块,将所述最小模块从软件程序中分离出来,并对分离出的模块是否能按照预期运行进行测试。
集成测试是将多个单元按照软件程序的逻辑形成一个组件,且是对测试单元间接口是否能如预期相互关联运行进行测试(即实现测试单元间耦合性的测试)。
模块化的思想导致软件程序中出现了越来越多的函数调用,研究表明现有的大多数软件程序中每20个指令就有一个函数调用。现有的单元测试中往往一个单元仅包括一个函数,出现函数调用时往往使用打桩的方式进行处理,导致函数调用的错误延迟到集成测试时才被发现,而集成测试中错误修复的成本远远大于单元测试。造成现有技术中一个单元仅能实现一个函数的测试的原因有:
1、没有一种通用的方式处理各种格式的函数调用形式;
2、不能正确的处理函数的值参、引参以及返回值。
综合上述,故如何在单元测试实现多个函数调用的测试,是现有的软件单元测试方法中亟待解决的问题。
发明内容
有鉴于此,本发明的主要目的在于提供一种用于包括多个函数测试模块的单元测试方法及装置,以实现在单元测试时测试出函数调用的错误。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供一种用于包括多个函数测试模块的单元测试方法,所述方法包括:
构建测试模块,所述测试模块包括两个以上有调用关系的函数;
根据测试模块内程序的逻辑关系及函数间的调用关系形成若干条函数间路径;
为每一条所述函数间路径选择测试用例进行测试。
上述方案中,所述形成若干条函数间路径包括:
构建对应于测试模块中各函数调用语句的语句控制流图;
构建对应于测试模块中各函数的函数控制流图;
根据函数调用关系,关联所述语句控制流图以及所述函数控制流图形成模块控制流图;
在所述模块控制流图中确定待覆盖节点,根据预设的路径选择策略选出经过所述待覆盖节点的所述函数间路径。
上述方案中,所述构建语句控制流图包括:
步骤A:判断函数调用语句调用中当前运算是否为原子运算,若是则构建结束,若否则进行以下步骤;
步骤B:为当前运算构建一个语句控制流图;
步骤C:构建所述语句控制图的入口节点;
步骤D:在所述语句控制图中创建对应每个操作对象的操作对象节点;
步骤E:根据当前运算的运算先后顺序确定操作对象节点之间的连接顺序;
步骤F:创建一个运算节点对应于当前运算的结果;
步骤G:设置所述语句控制流图的出口节点;
步骤H:按顺序连接各节点,保存操作对象节点与运算节点之间的运算关系;
步骤I:为包括函数调用的操作对象节点创建对应的语句控制流图,并替换所述操作对象节点。
上述方案中,所述步骤I包括步骤I.1至步骤I.4;
所述步骤I.1:获取包括函数调用的操作对象节点的操作对象;所述操作对象分为操作数以及由2个以上操作数之间的运算构成的操作式;
所述步骤I.2:判断所述对象中是否有操作式;
若有则进入步骤I.3,若否则构建结束;
所述步骤I.3:将所述运算操作式视为当前运算,执行所述步骤A至步骤I,以构建所述操作式所对应的语句控制流图;
所述步骤I.4:将所述步骤I.3中所构建的语句控制流图,替换所述操作对象节点,并返回所述步骤I.1。
上述方案中,所述根据预设的路径选择策略选出经过所述待覆盖节点的函数间路径包括:
通过所述模块控制流图所对应的控制树和蕴含树,得出形成函数间路径必定经过的必经节点;
根据最多覆盖原则补全所述必经节点之间的节点,并同时确保经过所述待覆盖节点,进而形成所述函数间路径。
上述方案中,所述函数控制流图包括主函数对应的函数控制流图以及被调用的子函数对应的函数控制流图;
形成模块控制流图包括:
将语句控制流图替换主函数对应的函数控制流图中的函数调语句所对应的节点;
将子函数对应的函数控制流图替换语句控制流图中调用函数节点。
上述方案中,所述根据预设的路径选择策略选出经过所述待覆盖节点的函数间路径还包括:
判断所选择出的函数间路径是否为不可达路径,若否则函数间路径选择正确,若是则采用不可达前缀法进行路径重选。
上述方案中,所述不可达路径的判定包括:
获取节点的变量;所述变量包括对应语句控制流图的入口节点所对应的值参和引参、返回节点所述对应的返回值以及出口节点的值参和引参;
使用符号化执行技术表达变量之间的关联;
使用区间运算技术处理路径约束判定所选的函数路径是否为不可达路径。
本发明提供一种用于包括多个函数测试模块的单元测试装置,所述装置包括:
测试模块构建单元,用以构建测试模块,所述测试模块包括两个以上有调用关系的函数;
函数路径形成单元,用以根据测试模块内程序的逻辑关系及函数间的调用关系形成若干条函数间路径;
测试单元,用以为每一条所述函数间路径选择测试用例进行测试。
进一步地,所述函数路径形成单元包括:
语句控制流图构建子单元,用以构建对应于测试模块中各函数调用语句的语句控制流图;
函数控制流图构建子单元,用以构建对应于测试模块中各函数的函数控制流图;
模块控制流图构建子单元,用以根据函数调用关系,关联所述语句控制流图以及所述函数控制流图,从而形成模块控制流图;
路径确定子单元,用以确定所述模块控制流图中待覆盖节点,根据预设的路径选择策略选出经过所述待覆盖节点的路径,形成所述函数间路径。本发明用于包括多个函数测试模块的单元测试方法及装置的有益效果:
本发明所述的用于包括多个函数测试模块的单元测试方法及装置,在进行单元测试时,通过构建由多个函数调用形成的测试模块,选择出函数间路径进行了单元测试,从而在单元测试阶段即可及时发现函数调用中的错误,避免了将函数调用的错误延迟到集成测试中,进而及时的对软件中函数调用的错误进行修正,从而提高了软件测试的有效效率,并降低了测试及软件修正的成本。
附图说明
图1为本发明实施例所述的用于包括多个函数测试模块的单元测试方法的流程示意图;
图2为本发明实施例中所述的函数调用关系图;
图3为本发明实施例中所述的函数间路径形成的流程示意图;
图4a为图2中所述函数调用关系图的主函数对应的函数控制流图;
图4b为图2中所述函数调用关系图的函数调用语句对应的语句控制流图;
图4c为图2中所述函数调用关系图的子函数所对应的函数控制流图;
图4d为图2中所述函数调用关系图所对应的测试模块的模块控制流图;
图5为本发明实施例中所述形成的函数调用语句的语句控制流图的流程示意图之一;
图6为本发明实施例中所述的形成函数调用语句的语句控制流图的流程示意图之二;
图7为本发明实施例中所述的一种函数间路径的结构示意图;
图8a为本发明实施例中所述的一种函数调用语句的语句控制流图;
图8b为本发明实施例中所述的模块控制流图的形成示意图;
图9a为在图8b中所形成的模块控制流图中一条不可达的函数间路径;
图9b为在图8b中所形成的模块控制流图中一条可达的函数间路径;
图10为本发明实施例中所述装置的结构示意图;
图11为图10中所述函数间路径形成单元的结构示意图。
具体实施方式
以下结合实施例与附图对本发明的技术方案进行详细的描述。
如图1所示,本实施例用于包括多个函数测试模块的单元测试方法包括:
步骤S110:构建测试模块,所述测试模块包括两个以上有调用关系的函数;
步骤S120:根据测试模块内程序的逻辑关系及函数间的调用关系形成若干条函数间路径;
步骤S130:为每一条所述函数间路径选择测试用例进行测试。
在本实施例中所述测试模块包括了至少两个有相互调用关系的函数,相对于传统的单元测试中仅包括一个函数的测试模块,测试模块的构建即不同。
在具体的实现过程中,所述测试模块所对应的数学表达式可为二元组<caller,callees>。其中,caller为入口函数;callees为被调用的子函数列表。在子函数列表中包括了至少1个以上的函数。
具体的如图2所示,对应的程序中包括了函数f1、f2、f3、f4以及f5,且函数之间的调用关系如图中连接关系所示。根据本实施例所述的测试模块的构建方法,则f1和f2可以构成测试模块且f1为入口函数;f1、f4以及f2可以构成测试模块且f1为入口函数;f2以及f4可以构成测试模块且4为入口函数;f3以及f4不能构成模块,因为没有调用关系。
故在实施例所述测试模块在运行时,不仅涉及了函数内的逻辑关系,同样的还包括了函数调用关系。从而进行软件的单元测试时,软件的运行将从一个函数进入被调用的函数内部进行运行。故在选择函数间路径时,本实施例所述方法考虑了函数调用关系,从而能实现多个函数测试模块的单元测试方法。
所述步骤S130中所述的测试用例可以是现有方法中对应的测试用例,测试方法也可以采用现有的方法实现,具体的所述测试用例可以预先设置。
综合上述,本实施例所述的单元测试方法,测试时不仅实现了对一个函数的测试,同时还实现了对函数调用的测试,从而能在单元测试时及早的发现函数调用的错误(具体的如接口错误),以免所述错误流入集成测试,从而节省了测试成本,提高了测试有效效率。
在具体的实现过程中,所述函数路径的形成方法有多种,如图3所示,本实施例提供如下优选方法:
步骤S210:构建对应于测试模块中各函数调用语句的语句控制流图;
步骤S220:构建对应于测试模块中各函数的函数控制流图;
步骤S230:根据函数调用关系,关联所述语句控制流图以及所述函数控制流图,从而形成模块控制流图;
步骤S240:确定所述模块控制流图中待覆盖节点,根据预设的路径选择策略选出经过所述待覆盖节点的路径,形成所述函数间路径。
采用步骤S210至步骤S240形成函数间路径,提供了一种通用的方式处理各种格式的函数调用形式;且能正确的处理函数的值参、引参以及返回值。
所述函数控制流图包括主函数以及子函数所对应的函数控制流图其;中,所述子函数为被调用的函数。
所述语句控制流图的数学表达式有多种,在本实施例中提供一种优选的数学表达式:所述语句控制流图的数学表达式为五元组(N,E,Entry,Exit,R);
其中,所述N是节点的集合,所述节点包括操作对象节点以及运算节点;所述E是有向边的集合;所述Entry是唯一入口节点;所述Exit是唯一的退出节点;所述R表示节点间的运算关系。
所述函数控制流图即可以采用现有单元测试中常用的控制流图构建方法来构建。
所述函数控制流图、语句控制流图以及模块控制流图都是属于控制流图的一种,区别在于对应不同类型的程序代码。通常控制流图为一个抽象的数据结构,由若干个节点构成。节点之间通过箭头表示节点之间的逻辑关系。所述控制流图至少包括入口节点、出口节点以及真假分支结构等。
voidf(inti){
i=i>0?f1(i):f2(i);
}
intf1(i){
return++i;
}
intf2(i){
return--i;
}
上述C程序代码当采用本实施例所述的函数路径构建方法,则至少包括对应了主函数f(inti)所对应的函数控制流图、子函数intf2(i)所对应的控制流图以及对应于i=i>0?f1(i):f2(i)的语句控制流图。
具体的如图4a为所述主函数f(inti)的函数控制流图,包括了节点11、12以及13;其中节点11为入口节点、节点12对应了f(inti);节点13为出口节点。
具体的如图4b为函数调用语句i=i>0?f1(i):f2(i)的语句控制流图,包括了节点21、节点22、节点23、节点24以及节点25;其中节点21为入口节点对应了i>0的判断;T表示i>0为真,F表示为i>0为假。i>0判断为真时,顺序执行函数intf1(i),为假则调用子函数intf2(i)。节点22对应了f1(i),返回值为f1(i),节点23对应了f2(i),返回值为f2(i);节点24对应了三元运算i>0?f1(i):f2(i),如果A的返回值为真,则节点24返回值为B的返回值,否则返回值为节点23的返回值;节点25为出口节点对应的是赋值运算,返回值为i。
具体的如图4c为子函数intf2(i)的控制流图,包括节点31、32以及33。节点3为入口节点、节点32应了原子运算“return–i”,节点33为出口节点。
所述步骤S230中,关联函数控制流图以及语句控制流图,形成模块控制流图包括以下步骤:
步骤1:将语句控制流图替换主函数对应的函数控制流图中的函数调语句所对应的节点。在图4d中函数调用语句所对应的节点为虚线圆框所形成的节点12。
步骤2:将子函数对应的函数控制流图替换语句控制流图中调用函数节点。在图4d中对应于调用子函数的节点为虚线圆框所形成的节点23。
具体如图4c所示,上述步骤依次为,将图4b替换图4a中的节点12,再将图4c中的子函数的函数控制流图替换图4b中的节点23,从而形成了最终的模块控制流图如图4d所示,用以提供函数间路径。
在具体的实施过程中语句控制流图的形成方法有多种,如图5所示提供一种优选的语句控制流图形成方法,具体如下:
步骤A:判断函数调用语句调用中当前运算是否为原子运算,若是则构建结束,若否则进行以下步骤;所述原子运算是不能再细分的运算。
步骤B:为当前运算构建一个语句控制流图。
步骤C:构建所述语句控制图的入口节点;此处构成的入口节点可以是一个虚节点。
步骤D:在所述语句控制图中创建对应每个操作对象的操作对象节点。
步骤E:根据当前运算的运算先后顺序确定操作对象节点之间的连接顺序;当前运算先后顺序的确定需根据当前运算来确定的。若当前运算包括四则运算时,根据四则运算的结合性来确定;当前运算包括逻辑关系式时,根据逻辑关系式的逻辑关系来进行。所述逻辑关系式又分为分支结构运算以及非分支结构运算;若是分支结构运算则根据分支结构的逻辑连接操作对象节点,若为非分支结构运算则按顺序连接操作对象节点。通常所述分支结构运算包括三元表达式、逻辑与和逻辑或等。
步骤F:创建一个运算节点对应于当前运算的结果。
步骤G:设置所述语句控制流图的出口节点;本步骤中所述的出口节点同样的可以是一个虚节点。
步骤H:保存操作对象节点与运算节点之间的运算关系。
步骤I:为包括函数调用的操作对象节点创建对应的语句控制流图,并替换所述操作对象节点。具体的运算过程中,所述操作对象节点包括操作数以及由多个操作数通过运算符连接起来的操作式。所述操作数可以是常量或变量。所述操作符可以是四则运算法或逻辑关系符等。
具体的所述步骤I中可以优选以下方法。如图6所示,所述步骤I具体包括步骤I.1至步骤I.4;
所述步骤I.1:获取包括函数调用的操作对象节点的操作对象;所述操作对象分为操作数以及由2个以上操作数之间的运算构成的操作式;
所述步骤I.2:判断所述对象中是否有操作式;
若有则进入步骤I.3,若否则构建结束;
所述步骤I.3:将所述运算操作式视为当前运算,执行所述步骤A至步骤I,以构建所述操作式所对应的语句控制流图;
所述步骤I.4:将所述步骤I.3中所构建的语句控制流图,替换所述操作对象节点,并返回所述步骤I.1。
结合上述,可知形成函数调用语句的语句控制流图中包括了递归算法的运用。
进一步的,所述函数路径选择包括:
通过所述模块控制流图所对应的控制树和蕴含树,得出形成函数间路径必定经过的必经节点;所述控制树和蕴含树都是现有对程序代码流程分析的一种图示,具体的含义参见现有技术中的定义,在此就不再赘述;
根据最多覆盖原则补全所述必经节点之间的节点,并同时确保经过所述待覆盖节点,进而形成所述函数间路径。
采用控制树和蕴含树能快捷有效的找到形成路径的必经节点,再通过补全其他节点的方式,能快速的得到多条经过待覆盖节点的函数间路径,从而提高了函数间路径形成的效率。在具体的实现过程中,还可以采用遍历的方法,遍历的方法可以现有技术中的遍历有向图的方法。
作为上述函数间路径的进一步的优化,所述函数路径选择还包括:
判断所选择出的函数间路径是否为不可达路径,
若否则函数间路径选择正确,
若是则采用不可达前缀法进行路径重选。
在本实施例中通过函数间路径不可达的判定,提高了单元测试的有效测试效率。所述不可达前缀法步骤如下:
给定待覆盖节点T和经过待覆盖节点T的路径p,当路径p不可达时依次进行如下步骤:
步骤1:找到路径p的不可达前缀路径q,所述前缀路径q为从起点到发生矛盾的分支节点所对应的路径;
步骤2:将前缀路径q中发生矛盾的分支转换为另一个未选择的分支路径,得到前缀路径q';
步骤3:判断待覆盖节点T是否属于q',
步骤3.1:如果T∈q',则q与q'连接形成了新选择的函数间路径;
步骤3.2:如果则选择q'到待覆盖节点T的路径,再选择待覆盖节点T到终点的路径,以形成新选择的函数间路径
步骤4:如果新选择的函数间路径仍不可达,继续转换不可达前缀的分支
步骤5:重复上述步骤直至找到可达路径
在具体的实施过程中,所述函数间路径是否为不可达路径的判断方法有多种,以下提供一种优选方法。所述不可达路径的判定具体包括:
获取节点的变量;所述变量包括对应语句控制流图的入口节点所对应的值参和引参、返回节点所述对应的返回值以及出口节点的值参和引参;所述获取节点的变量信息,可以采用经典的数据流公式得到。
使用符号化执行技术表达变量之间的关联。
使用区间运算技术处理路径约束,从而判定所选的函数路径是否为不可达路径。
由于本发明所述的单元测试是针对包括了多个相互有调用关系的测试模块,相对于现有技术中仅包括一个函数的测试模块,有以下区别点:
区别点1:子函数入口节点只继承其参数对应的变量,且需要区分值参、引参;
区别点2:子函数return节点需要记录函数的返回值;
区别点3:子函数出口节点需要对值参和引参,且对值参与引参需进行分别处理;
区别点4:对于路径中属于语句控制流图的部分,表达式运算有以下区别:每个节点运算表达式的操作数必然已经在前一个节点计算完毕,直接从对应节点获取计算结果即可。
本实施例所述的不可达路径判断该方法是根据以上区别点为本发明所述的软件的单元测试特意设计的,这样不可达路径的判断准确简单。
以下提供一个具体的示例:
structNode*del(structNode*head,intnum){
returnhead;
}
intmain(){
intnum;
charstring[20];
structNode*head=create(1);
…
del(head,num);
…
}
以上是一段取自链表操作的link.c的代码。其中,head是del函数的引参,num是del函数的值参,返回值为head。图7所示的是经过del函数的一条函数间路径;a是子函数del的前一个节点;b是子函数del的入口点;c是子函数del的return语句;d是子函数del的出口节点。子函数入口节点b从节点a得到参数head和num的值;函数return语句所对应的节点c记录函数调用运算的返回值为head;函数出口节点d从节点a取num的值以及head的值。
此外,通过验证以及推理得出,本发明所述的用于包括多个函数测试模块的单元测试方法,在具体的进行测试单元模块大小确定时,代码行优选为不大于500行,否则不可达路径的百分率将较高,故测试模块所包括的代码行限制在500行以内方便提高测试效率以及准确度(其中一条语句通常对应一个代码行)。
以下再提供一个采用上述方法进行软件的单元测试的示例:
所述示例针对的是以下代码:
intmonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
intjudge(dated)
{
return
((d.month==2)&&(d.day<month[d.month-1]+leap(d.year)))||
((d.month!=2)&&(d.day<month[d.month-1]))?1:0;
}
intleap(intyear){
return((year%400==0)||((year%4==0)&&(year%100!=0)))?1:0;
}
上述代码内函数judge用以判断日期d的有效性,judge函数中调用了判断年份year是否为闰年的函数leap。
第一,确定了测试模块M,所述测试模块M包括入口函数judge以及被调用的子函数leap。
第二,形成了函数调用语句——return语句所对应的语句控制流图,具体的如图8a所示。在所述图8a中:
节点A表示关系运算d.month==2。
节点B表示关系运算d.day<month[d.month-1]+leap(d.year),在此层函数调用语句分解中,此处函数调用语句变成了d.day<month[d.month-1]+leap(d.year)。
节点C表示关系运算(d.month!=2)&&(d.day<month[d.month-1]);此处由于为非函数调用语句故可以不将上述运算拆分为原子运算。
节点D表示逻辑运算表达式(d.month==2)&&(d.day<month[d.month-1]+leap(d.year))为真。
节点E表示逻辑运算表达式(d.month==2)&&(d.day<month[d.month-1]+leap(d.year))为假。
节点F表示逻辑运算||。节点G表示三元表达式的真分支所对应的常量。H表示三元表达式的假分支所对应的常量。I表示整个三元表达式运算。
如图8b所示,函数judge(date)所对对应的函数控制流图CFG中包括入口节点A1、对应judge函数的节点B1以及包括出口节点C1;被调用的子函数leap的CFG包括三个节点,分别是节点A2、B2以及节点C2;其中节点A2为入口节点,B2为对应函数leap,C2为出口节点。
第三,进行函数控制流图CFG以及函数调用语句的语句控制流图SCFG的关联。如故8b所示,所述关联包括将语句控制流图替换主函数judge的函数控制流图中相应的节点B1,再将被调用的子函数的函数控制流图替换语句控制流图SCFG中的节点B,进而形成完整的模块控制流图。
第四,在完成模块控制流图形成之后,需要进行路径的确定。例如节点G为待覆盖节点,依据最多覆盖准则选出路径,得出的路径如图9a中虚线覆盖的路径。所述最多覆盖准则为选出一条覆盖待覆盖节点、必经节点且能覆盖最多节点路径的选择准则。采用最多覆盖准则,能一次对更多的代码进行测试,从而能减少测试用例的使用,从而能提高测试效率。
当采用如图9a中所述路径时,节点A的真分支和节点C的真分支矛盾,选出的函数间路径为不可达路径。对不可达前缀进行分支替换,即选择节点C的假分支,然后选择E到G的路径E→F→G。但对于新生成的路径,节点C的假分支和节点F的真分支矛盾。由于节点C再没有可以替换的分支,所以回到节点C的上一个分支节点B进行分支替换。替换成节点B的真分支后,选到的路径如图9b中虚线所覆盖的路径所示。判定新选择的路径为可达路径,则该路径为符合要求的函数间路径。
在此说明,图8a、8b、9a以及9b的图示中的T均表示对应的判断为真,F均表示对应的判断为假。
综合上述,本实施例提供了一种用于包括多个函数测试模块的单元测试方法,所针对的测试模块包括至少两个有相互调用关系的函数,从而在单元测试时同样的可以实现函数调用错误的测试,避免了函数调用的错误延迟到集成测试才能发现,进而提高了测试的有效效率并降低了测试以及软件错误校正的成本。
本实施例提供一种用于包括多个函数测试模块的单元测试装置,所述装置用于为上述实施例中所述的用于包括多个函数测试模块的单元测试方法实现所对应的功能的物理装置。如图10所示,所述装置包括:
测试模块构建单元110,用以构建测试模块,所述测试模块包括2个以上有调用关系的函数;
函数路径形成单元120,用以根据测试模块内程序的逻辑关系及函数间的调用关系形成若干条函数间路径;
测试单元130,用以为每一条所述函数间路径选择测试用例进行测试。
以上各个功能单元的具体结构均有多种,以下提供一种结构精巧的函数路径形成单元的优先结构。如图11所示,所述函数路径形成单元120包括:
语句控制流图构建子单元121,用以构建对应于测试模块中函数调用语句的语句控制流图;
函数控制流图构建子单元122,用以构建对应于测试模块中函数的函数控制流图;
模块控制流图构建子单元123,用以根据函数调用关系,关联所述语句控制流图以及所述函数控制流图,从而形成模块控制流图;
路径确定子单元124,用以确定所述模块控制流图中待覆盖节点,根据预设的路径选择策略选出经过所述待覆盖节点的路径,形成所述函数间路径。
本实施例中所述的用于包括多个函数测试模块的单元测试装置,具体的物理结构可以是包括一个处理器、存储单元、数据接口以及连接各部分原件的总线。所述处理器可以是中央处理,单片机,数字信号处理器或可编程阵列。所述处理器上运行有实现上述功能的软件和/或固件。
本实施例中所述的用于包括多个函数测试模块的单元测试装置为与上述实施例中用于包括多个函数测试模块的单元测试方法相对应的装置,故能实现同样的功能,从而同样的具有在单元测试中就能发现函数调用中的错误,避免了函数调用的错位延迟到集成测试才发现,从而提高了测试的有效速率,并降低了测试成本。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (10)
1.一种用于包括多个函数测试模块的单元测试方法,其特征在于,所述方法包括:
构建测试模块,所述测试模块包括两个以上有调用关系的函数;
根据测试模块内程序的逻辑关系及函数间的调用关系形成若干条函数间路径;
为每一条所述函数间路径选择测试用例进行测试。
2.根据权利要求1所述的用于包括多个函数测试模块的单元测试方法,其特征在于,所述形成若干条函数间路径包括:
构建对应于测试模块中各函数调用语句的语句控制流图;
构建对应于测试模块中各函数的函数控制流图;
根据函数调用关系,关联所述语句控制流图以及所述函数控制流图形成模块控制流图;
在所述模块控制流图中确定待覆盖节点,根据预设的路径选择策略选出经过所述待覆盖节点的所述函数间路径。
3.根据权利要求2所述的用于包括多个函数测试模块的单元测试方法,其特征在于,所述构建语句控制流图包括:
步骤A:判断函数调用语句调用中当前运算是否为原子运算,若是则构建结束,若否则进行以下步骤;
步骤B:为当前运算构建一个语句控制流图;
步骤C:构建所述语句控制图的入口节点;
步骤D:在所述语句控制图中创建对应每个操作对象的操作对象节点;
步骤E:根据当前运算的运算先后顺序确定操作对象节点之间的连接顺序;
步骤F:创建一个运算节点对应于当前运算的结果;
步骤G:设置所述语句控制流图的出口节点;
步骤H:按顺序连接各节点,保存操作对象节点与运算节点之间的运算关系;
步骤I:为包括函数调用的操作对象节点创建对应的语句控制流图,并替换所述操作对象节点。
4.根据权利要求3所述的用于包括多个函数测试模块的单元测试方法,其特征在于,所述步骤I包括步骤I.1至步骤I.4;
所述步骤I.1:获取包括函数调用的操作对象节点的操作对象;所述操作对象分为操作数以及由2个以上操作数之间的运算构成的操作式;
所述步骤I.2:判断所述对象中是否有操作式;
若有则进入步骤I.3,若否则构建结束;
所述步骤I.3:将所述运算操作式视为当前运算,执行所述步骤A至步骤I,以构建所述操作式所对应的语句控制流图;
所述步骤I.4:将所述步骤I.3中所构建的语句控制流图,替换所述操作对象节点,并返回所述步骤I.1。
5.根据权利要求2、3或4所述的用于包括多个函数测试模块的单元测试方法,其特征在于,所述根据预设的路径选择策略选出经过所述待覆盖节点的函数间路径包括:
通过所述模块控制流图所对应的控制树和蕴含树,得出形成函数间路径必定经过的必经节点;
根据最多覆盖原则补全所述必经节点之间的节点,并同时确保经过所述待覆盖节点,进而形成所述函数间路径。
6.根据权利要求2至4任一项所述的用于包括多个函数测试模块的单元测试方法,其特征在于,所述函数控制流图包括主函数对应的函数控制流图以及被调用的子函数对应的函数控制流图;
形成模块控制流图包括:
将语句控制流图替换主函数对应的函数控制流图中的函数调语句所对应的节点;
将子函数对应的函数控制流图替换语句控制流图中调用函数节点。
7.根据权利要求5所述的用于包括多个函数测试模块的单元测试方法,其特征在于,所述根据预设的路径选择策略选出经过所述待覆盖节点的函数间路径还包括:
判断所选择出的函数间路径是否为不可达路径,若否则函数间路径选择正确,若是则采用不可达前缀法进行路径重选。
8.根据权利要求7所述的用于包括多个函数测试模块的单元测试方法,其特征在于,所述不可达路径的判定包括:
获取节点的变量;所述变量包括对应语句控制流图的入口节点所对应的值参和引参、返回节点所述对应的返回值以及出口节点的值参和引参;
使用符号化执行技术表达变量之间的关联;
使用区间运算技术处理路径约束判定所选的函数路径是否为不可达路径。
9.一种用于包括多个函数测试模块的单元测试装置,其特征在于,所述装置包括:
测试模块构建单元,用以构建测试模块,所述测试模块包括两个以上有调用关系的函数;
函数路径形成单元,用以根据测试模块内程序的逻辑关系及函数间的调用关系形成若干条函数间路径;
测试单元,用以为每一条所述函数间路径选择测试用例进行测试。
10.根据权利要求9所述的用于包括多个函数测试模块的单元测试装置,其特征在于,所述函数路径形成单元包括:
语句控制流图构建子单元,用以构建对应于测试模块中各函数调用语句的语句控制流图;
函数控制流图构建子单元,用以构建对应于测试模块中各函数的函数控制流图;
模块控制流图构建子单元,用以根据函数调用关系,关联所述语句控制流图以及所述函数控制流图,从而形成模块控制流图;
路径确定子单元,用以确定所述模块控制流图中待覆盖节点,根据预设的路径选择策略选出经过所述待覆盖节点的路径,形成所述函数间路径。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310581759.9A CN103593291B (zh) | 2013-11-18 | 2013-11-18 | 用于包括多个函数测试模块的单元测试方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310581759.9A CN103593291B (zh) | 2013-11-18 | 2013-11-18 | 用于包括多个函数测试模块的单元测试方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103593291A CN103593291A (zh) | 2014-02-19 |
CN103593291B true CN103593291B (zh) | 2016-03-09 |
Family
ID=50083442
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310581759.9A Expired - Fee Related CN103593291B (zh) | 2013-11-18 | 2013-11-18 | 用于包括多个函数测试模块的单元测试方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103593291B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104915287B (zh) * | 2014-03-11 | 2018-07-06 | 富士施乐实业发展(中国)有限公司 | 单元测试方法及*** |
CN104536896A (zh) * | 2015-01-12 | 2015-04-22 | 牟永敏 | 面向函数调用路径的回归测试用例选择与排序方法及*** |
CN105159835B (zh) * | 2015-10-24 | 2017-11-03 | 北京航空航天大学 | 一种基于全局超级块支配图的插桩位置获取方法 |
CN106020848A (zh) * | 2016-06-07 | 2016-10-12 | 北京信息科技大学 | 面向c#的函数调用路径生成方法 |
CN109684189B (zh) * | 2017-10-18 | 2022-02-11 | 富士通株式会社 | 区块链智能合约的逻辑验证方法和装置及计算机存储介质 |
CN108021370B (zh) * | 2017-12-26 | 2020-05-12 | 网易(杭州)网络有限公司 | 字节码的优化方法、装置、存储介质、处理器及终端 |
CN109960624A (zh) * | 2017-12-26 | 2019-07-02 | 航天信息股份有限公司 | 一种JsDriver的测试方法及*** |
CN113760771A (zh) * | 2021-09-14 | 2021-12-07 | 中国农业银行股份有限公司 | 集成测试用例的执行方法及装置 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101286132A (zh) * | 2008-06-02 | 2008-10-15 | 北京邮电大学 | 一种基于软件缺陷模式的测试方法及*** |
CN101334753A (zh) * | 2007-06-26 | 2008-12-31 | 中兴通讯股份有限公司 | 一种单元测试方法及其装置 |
CN102419728A (zh) * | 2011-11-01 | 2012-04-18 | 北京邮电大学 | 基于覆盖率量化指标确定软件测试过程充分性的方法 |
CN102495796A (zh) * | 2011-11-25 | 2012-06-13 | 中国人民解放军总参谋部第五十四研究所 | 一种基于单元测试的软件脆弱性测试方法 |
CN102708052A (zh) * | 2012-04-27 | 2012-10-03 | 北京邮电大学 | 一种单元测试中软件故障自动定位方法 |
CN102855177A (zh) * | 2011-06-30 | 2013-01-02 | 阿里巴巴集团控股有限公司 | 一种单元测试的方法和装置 |
CN102915271A (zh) * | 2012-10-31 | 2013-02-06 | 北京邮电大学 | 基于控制流图的单元回归测试用例集合优化方法 |
CN103116540A (zh) * | 2013-01-23 | 2013-05-22 | 电子科技大学 | 基于全局超级块支配图的动态符号执行方法及其装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100547562C (zh) * | 2006-10-18 | 2009-10-07 | 国际商业机器公司 | 自动生成可再现运行时问题的单元测试用例的方法和*** |
-
2013
- 2013-11-18 CN CN201310581759.9A patent/CN103593291B/zh not_active Expired - Fee Related
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101334753A (zh) * | 2007-06-26 | 2008-12-31 | 中兴通讯股份有限公司 | 一种单元测试方法及其装置 |
CN101286132A (zh) * | 2008-06-02 | 2008-10-15 | 北京邮电大学 | 一种基于软件缺陷模式的测试方法及*** |
CN102855177A (zh) * | 2011-06-30 | 2013-01-02 | 阿里巴巴集团控股有限公司 | 一种单元测试的方法和装置 |
CN102419728A (zh) * | 2011-11-01 | 2012-04-18 | 北京邮电大学 | 基于覆盖率量化指标确定软件测试过程充分性的方法 |
CN102495796A (zh) * | 2011-11-25 | 2012-06-13 | 中国人民解放军总参谋部第五十四研究所 | 一种基于单元测试的软件脆弱性测试方法 |
CN102708052A (zh) * | 2012-04-27 | 2012-10-03 | 北京邮电大学 | 一种单元测试中软件故障自动定位方法 |
CN102915271A (zh) * | 2012-10-31 | 2013-02-06 | 北京邮电大学 | 基于控制流图的单元回归测试用例集合优化方法 |
CN103116540A (zh) * | 2013-01-23 | 2013-05-22 | 电子科技大学 | 基于全局超级块支配图的动态符号执行方法及其装置 |
Also Published As
Publication number | Publication date |
---|---|
CN103593291A (zh) | 2014-02-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103593291B (zh) | 用于包括多个函数测试模块的单元测试方法及装置 | |
Black | Computing ripple effect for software maintenance | |
Baresel et al. | Fitness function design to improve evolutionary structural testing | |
US8661415B2 (en) | Path-sensitive visualizations of aggregated profiling and trace date | |
US20190108003A1 (en) | Defect detection method, device, system and computer readable medium | |
Sou et al. | Computing critical $ k $-tuples in power networks | |
CN104820613B (zh) | 一种异构多核程序的编译方法 | |
EP2257873A2 (en) | Systems and methods for information flow analysis | |
Zhonglin et al. | An improved method of acquiring basis path for software testing | |
Cachera et al. | A certified denotational abstract interpreter | |
CN102073587A (zh) | 一种程序中不可达路径的静态检测方法 | |
CN106970788A (zh) | 一种基于时态的对象依赖关系发现方法和*** | |
WO2016059733A1 (ja) | 自律学習型知識構築機 | |
US20150106794A1 (en) | Transparent performance inference of whole software layers and context-sensitive performance debugging | |
CN104965687B (zh) | 基于指令集生成的大数据处理方法及装置 | |
Venkatasubramanyam et al. | Prioritizing code clone detection results for clone management | |
Ligęza | BPMN–a logical model and property analysis | |
Black | Deriving an approximation algorithm for automatic computation of ripple effect measures | |
CN105739993B (zh) | 一种架构静态成熟度度量方法 | |
CN112433762A (zh) | 基于数据相关性约束的随机指令序列生成方法 | |
Forster et al. | Detecting precedence-related advice interference | |
CN101840372B (zh) | 应用符号分析的软件测试方法 | |
CN112949243B (zh) | 参数配置方法、装置、计算机设备及存储介质 | |
Li et al. | Automatically generating functional scenarios from SOFL CDFD for specification inspection | |
Martinez et al. | Merging requirements views with incompleteness and inconsistency |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160309 Termination date: 20211118 |