当前位置: 首页 > 专利查询>北京大学专利>正文

基于执行序列的JUnit测试用例化简方法技术

技术编号:3987622 阅读:580 留言:0更新日期:2012-04-11 18:40
本发明专利技术提供了一种基于执行序列的JUnit测试用例化简方法,属于软件测试中的测试用例化简技术领域。本发明专利技术提出了一种k-序列的表示方法来描述每条JUnit测试用例,用以体现每条JUnit测试用例对方法的调用顺序,并将所有JUnit测试用例包含的方法调用序列作为化简前后需要保持不变的条件,对JUnit测试用例集合进行化简,从而保证化简后的测试用例集合可以揭示源于单个方法调用不当和源于多个方法调用顺序不当的错误。本发明专利技术提出的测试用例化简技术可以提高化简后测试用例集合的揭错能力,减少测试用例化简过程造成的测试效果损失。

【技术实现步骤摘要】

本专利技术属于软件测试中的测试用例化简
,是一种针对Java程序的JUnit 测试用例化简方法。
技术介绍
软件测试是确保软件质量的重要手段。由于软件开发过程中程序员无法保证代码的正确性,因此,软件测试是软件开发阶段必不可少的重要过程。另一方面,软件测试代价 大,占整个软件开发和维护过程总开销的一半。JUnit是目前主流的针对Java程序的测试用例框架,当前程序开发人员多手工 或使用JTest,JCrasher, Randoop等工具自动生成JUnit形式的测试用例来测试Java程 序。虽然测试用例生成工具可以方便快捷地为程序开发人员随机地生成大量的测试用例, 但是,大量测试用例的执行会增大软件测试的时间开销和资源开销。而且,当软件测试的时 间或资源受限时,软件测试过程有时也无法执行所有这些大量的测试用例。为了有效地利 用现有的测试用例,在减少软件测试各种开销的同时保证软件测试的效果,需要对手工编 写或工具自动生成的测试用例构成的集合进行化简,这是本专利技术提出的动机之一。在软件开发过程中,为了确保修改后的程序的正确性,程序开发人员需要对修改 后的代码进行测试,这一过程称为回归测试。在回归测试过程中,程序员可以使用原程序的 JUnit测试用例来测试修改后的Java程序。但是,针对原程序的测试用例很多,为了减少回 归测试的开销,需要把针对原程序的JUnit测试用例进行化简,这是本专利技术提出的另一个 动机。目前已有的测试用例化简技术,主要是用于解决回归测试过程中的测试用例化简 问题,而不是一般的软件测试过程。这些技术主要根据测试用例在原程序执行过程中的结 构性覆盖(比如语句或分支覆盖)对测试用例进行化简,从而保证化简前后的测试用例集 合能够满足相同的结构性覆盖。这种基于测试用例执行信息的化简技术,无法解决一般软 件测试过程中的JUnit测试用例化简问题,因为后者没有办法提供JUnit测试用例的执行 fn息ο现有的Jupta技术是一种测试用例排序技术,它可以扩展用于测试用例化简,但 是这一技术与本专利技术要解决的问题不同。Jupta技术分析每条JUnit测试用例的静态调用 图,Jupta技术预知每条测试用例在执行过程中可能执行到的方法,以此为基础计算每条测 试用例的揭错能力,并对测试用例集合进行化简。使用Jupta技术,化简后的测试用例集合 的揭错能力要明显小于化简前。这是因为Jupta技术仅仅根据测试用例对单个方法的覆盖 来选择测试用例,可是程序中的某些故障不是源于单个方法本身的错误,而是多个(至少 两个)方法的调用顺序不当。Jupta技术选出的测试用例无法保证揭示这类故障,因此,使 用Jupta技术化简后的测试用例集合的揭错能力要小于原测试用例集合。
技术实现思路
本专利技术的目的是给出一种测试用例化简技术,针对JUnit形式的测试用例构成的 集合T进行化简,并使化简后的测试用例构成的集合T"能够满足下面几个条件(I)T"对方法调用顺序不当导致的故障的揭错能力与T相同;(2)T"的揭错能力与T的揭错能力接近;(3)Τ〃是T的真子集。本专利技术的技术方案如下JUnit测试用例是一组方法和类构成的可执行程序。本专利技术只关注每条JUnit测 试用例包含的方法以及它们之间的顺序关系,忽略程序中的其他语句。不同于已有的测试 用例化简方法,本专利技术在测试用例化简前后不仅关注源于单个方法本身的故障,也关注源 于方法调用顺序(比如push和pop之间顺序调用关系)不当引起的故障。本专利技术提出了 一种k-序列的表示方法来描述每条JUnit测试用例——体现了每条JUnit测试用例对方 法的调用顺序,并将所有JUnit测试用例包含的方法调用序列作为化简前后需要保持不变 的条件,对JUnit测试用例集合进行化简,从而保证化简前后的测试用例集合都可以揭示 源于单个方法调用不当和源于多个方法调用顺序不当的错误。简单来说,本专利技术包括两个步骤(1)使用k_序列的集合来表示JUnit测试用例集合中的每条测试用例;(2)对基于k-序列表示的JUnit测试用例集合进行化简。下面分别介绍这两个步骤的具体过程。(1)使用k_序列的集合表示每条JUnit测试用例首先介绍k_序列表示方法。序列的长度指的是序列中成员的个数。长度为k的 序列称为k-序列,记成,其中Hii(KiSk)是这个序列的成员。位于不同 位置的成员有可能是同一方法。比如,k-序列的成员Hii和%(1彡i兴j彡k)可能是同一 方法,只不过它们在这个序列中的位置不同。接着,将每条JUnit测试用例拆分成若干条k-序列,再将每条JUnit测试用例表 示成若干个上述k-序列构成的集合。具体地,形如JUnit测试用例T = 表示测试用例T中有η个方法 Hi1, m2, m3,…,mn被调用,它们的调用顺序是Hli要比Hlj先被调用(i < j)。Α.如果测试用例T只有1个方法被调用,即T = };於-1个B.如果测试用例T只有2个方法被调用,即T= Dvm2],那么它的序列表示如下 如果 k = 1,T 的 k-序列表示为{}; 如果 k = 2,T 的 k-序列表示为{};眷如果k > 2,T 的 k-序列表示为{h,%,f^2++,4^d ;t一 2个C.否则, 如果2<k<k+l <n,那么,先将T拆分成k-序列,, ...,,然后T 表示成 Hm1, ...,mk],,..., )■; 如果2彡k < k+1 = n,那么先将T拆分成k_序列,, 然后将T表示成{,}; 如果2彡k = n,那么先将T拆分成k-序列,然后将T表示成 {}; 如果k = 1,那么先将T拆分成k-序列,,…,,然后将T表示成 {,…,};參如果k > η > 3,那么先将T拆分成k_序列^” + ++,^^^^++,們〃]’然后将T表it—η个示成 t-η个(2)化简基于k-序列表示的JUnit测试用例集合。步骤如下1)根据JUnit测试用例包含的方法数将原测试用例集合T分成两个不相交的子 集T1和T2,T1由方法数少于k的JUnit测试用例构成,T2由方法数不少于k的JUnit测试 用例构成。初始时,化简后的测试用例集合T"为空;2)对于T1中的测试用例,选择具有不同k-序列表示的JUnit测试用例来构造集 合T3。即如果有多条JUnit测试用例具有相同的k-序列表示,从中任选一条JUnit测试 用例放入T3中;3)对于T2中的测试用例,首先统计T2中的所有测试用例的k_序列表示包含的方 法序列构成集合R,使用如贪心算法在内的任一化简算法,从T2中挑选出部分测试用例构成 集合T4,使得R中任意方法序列都至少可以被T4中的某条测试用例对应的k-序列表示包 含; 4)T3和T4两集合的并就是化简后的JUnit测试用例集合T"。利用本专利技术提出的测试用例化简技术,不仅可以如传统的测试用例化简技术一样 揭示单个方法上的故障,而且还可以揭示由于方法调用顺序不当引起的故障。本专利技术提出 的测试用例化简技术可以提高化简后测试用例集合的揭错能力,减少测试用例化简过程造 成的测试效果损失。附图说明图1为构造JUnit测试用例的k-序列表示的流程图;图2为化简基于k-序列的JUnit测试本文档来自技高网
...

【技术保护点】
一种JUnit测试用例化简方法,化简后的测试用例是化简前测试用例的真子集,化简后的测试用例的揭错能力与化简前接近,其特征在于:化简后的测试用例对方法调用顺序不当导致的故障的揭错能力与化简前相同;化简方法包括以下步骤:第一步:把JUnit测试用例集合中的每条测试用例都表示成一个k-序列的集合;第二步:对第一步中得到的k-序列集合进行化简。

【技术特征摘要】

【专利技术属性】
技术研发人员:郝丹张令明张路梅宏
申请(专利权)人:北京大学
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1