CN104714881A - 一种表格驱动的单元测试系统和方法 - Google Patents
一种表格驱动的单元测试系统和方法 Download PDFInfo
- Publication number
- CN104714881A CN104714881A CN201310690605.3A CN201310690605A CN104714881A CN 104714881 A CN104714881 A CN 104714881A CN 201310690605 A CN201310690605 A CN 201310690605A CN 104714881 A CN104714881 A CN 104714881A
- Authority
- CN
- China
- Prior art keywords
- variable
- type
- data
- tree
- output valve
- 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.)
- Granted
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种表格驱动的单元测试系统和方法,包括:类型解析装置,用于解析数据类型定义获得类型信息;树表装置,由树形控件和表格控件组成;赋值装置,用于将树表装置中的输入值赋给变量,包括基本类型和复合类型;比较装置,用于将树表装置中的输出值与变量的实际值进行比较,并输出测试失败信息;测试驱动装置,用于执行测试过程。本发明还可以增加回调装置和类型替换装置,使不便以使用表格驱动的特殊数据,也能方便地实现表格驱动。还可以提供数据分配、转移、类型修改、驱动生成、显示简化表格等功能。利用本发明,无论是否涉及复合类型、数组、空指针等数据,都可以实现表格驱动,大幅降低单元测试的难度及综合成本。
Description
技术领域
本发明涉及软件测试技术,特别是涉及软件单元测试技术。
背景技术
单元测试是软件开发过程中保证代码质量,提升开发产能的重要手段。
单元测试的基本方法是利用测试驱动代码,设定输入和预期输出,执行被测试程序,自动判断实际输出是否符合预期。输入数据和预期输出称为测试用例,也就是测试数据,这是单元测试工作的基本要素,而对输入的赋值过程和判断输出的比较过程,则是单元测试执行过程的核心。
传统的单元测试过程是:手工编写或使用工具生成测试驱动代码来执行测试,由测试驱动代码给变量赋输入值,并由测试驱动代码判断输出是否符合预期,也就是说,对输入的赋值过程和判断输出的比较过程,是由测试驱动代码直接完成的。例如下面的C++语言代码:
其中add()是被测试函数,add_test()是测试函数,TEST_ASSERT是一个宏,其参数为一个布尔表达式,当该布尔表达式的计算结果为假时,表示被测试函数的实际计算结果不符合预期,向用户输出测试失败信息。
add_test()的两个用例意义是一样的,只是写法不同,后一种更清晰地划分了输入和输出。现在以用例2做进一步说明:用例的输入是:a=1,b=2,通过测试驱动代码直接赋值,而预期输出是:返回值为3,判断实际输出是否符合预期的比较过程,则通过表达式ret==3直接完成。
以上是传统单元测试的工作过程示例,其中,对输入的赋值过程和判断输出的比较过程是由测试驱动代码直接完成的,单元测试已有几十年历史,出现了大量的开源或商业单元测试工具,但赋值和比较过程,基本上都采用这种方式。对传统赋值和比较过程的一个改进思路是:使用宏语法对测试驱动代码进行封装,这种方式不适合于没有预处理特性的语言,且赋值和比较过程仍然是由测试驱动代码完成的,也无法满足对复杂对象的处理。
传统单元测试方式下,测试数据混合在测试驱动代码中,而测试驱动代码的数量往往是产品代码的二至五倍,且测试驱动代码本身也需要调试和维护,导致单元测试的综合成本很高。如果将单元测试过程改为表格驱动,由表格来决定哪些变量需要设定输入值及设定什么值,由表格来确定哪些变量需要判断预期输出以及预期输出的值,那么,用户只要在数据表格中建立和编辑测试数据,就可以高效地建立大量用例,测试数据也更易于维护和重用。同时,将减少和简化测试驱动代码,使测试驱动代码更易以由工具生成,对于工具完全自动生成的测试驱动代码,当产品代码更新时,工具也可以自动刷新,用户不需编写、调试和维护大量的测试驱动代码。总之,表格驱动的单元测试方式可以显著降低单元测试的综合成本。
已经有个别单元测试工具实现了测试数据的表格化,例如广州凯乐软件技术有限公司于2013年3月份发布的单元测试工具Visual Unit3.0。Visual Unit3.0的赋值和比较过程仍然是由测试驱动代码直接完成的,只支持将测试驱动代码中的基本类型的数据,如字符串、数字、字符等,移到表格中,并不是真正的表格驱动。下面是针对前面的示例,Visual Unit3.0的测试驱动代码的摘录:
其中,TEST_ASSERT_EQUAL_INT宏是TEST_ASSERT宏的变形,工作过程基本上是一样的。与前述的add_test()中的用例2比较,差别在于,输入使用了_TDIINT_宏,输出使用了_TDOINT_宏,这两个宏的功能是从表格读取数据。可以看出,对输入的赋值过程和判断输出的比较过程,与add_test()是一样的。由于编程语言本身特性的限制,测试驱动代码一般只能对基本类型进行直接赋值和比较,所以,通常只能把基本类型的数据放在表格中,测试驱动代码读取表格中的数据后进行赋值和比较。对于复合类型,VisualUnit3.0的工作方式是通过测试驱动代码,把复合类型分解为基本类型的成员,再从数据表格中读取数据对基本类型的成员进行赋值和比较,例如,针对下面的被测试函数:
Visual Unit3.0的测试驱动代码大致是这样的:
即首先将复合类型的变量pData分解成基本类型,再分别从表格读取数据并赋值给pData的成员a和b。可以看出,测试过程中需要设置哪些变量的输入和输出值,特别是复合类型中哪个成员需要设置输入或判断输出,哪个成员不需要设置输入和判断输出,是由测试驱动代码决定的,本质上仍然是测试代码驱动,并不是真正的表格驱动。这种工作方式下,在很多时候非常麻烦,例如,参数为一个十个项的数组(数组可以视为一个复合类型),前五项要设置输入和判断输出,如要把测试数据移到表格中,需使用前述的分解办法,给前五项赋值和判断输出,然后把数据移到表格中,需要10行代码,如果数组中的项又是复合类型,如某种结构的指针,那么,将更为麻烦。再如,空指针是很常见的一种输入输出,而在Visual Unit3.0的工作方式下,空指针不但不能放在表格中,而且还不能在使用了表格的测试驱动代码中赋值和判断,需要另外建立测试驱动代码来处理空指针。
一个复合类型,可能包含几十个、几百个甚至更多的直接或间接的成员。对于一个复合类型的变量,测试过程中需要使用的成员,即需要赋值或比较的成员,可能只是其中的几个,由于工具不知道其中的哪个成员需要设定输入,哪个成员需要判断输出,如果对复合类型中的所有成员全部生成输入和输出代码,则会产生海量的垃圾代码,因此,上述测试驱动代码并不是完全自动生成的,其中的第2第3行是在用户的干预下生成的,即在用户指定了需要设定输入的成员后生成的,生成后的代码还有可能需要修改,例如,对于一个指针,可能需要手工添加代码申请内存。在实际工作中,一个函数的测试就可能涉及到众多变量,如多个参数、返回值、成员变量、全局变量,显然,现有技术仍然需要编写、修改或维护大量的测试驱动代码。
如前所述,现有技术没有实现真正意义上的表格驱动,真正意义上的表格驱动应该由表格决定哪些数据特别是复合类型的哪些成员需要赋值或判断输出,应该支持任意类型。现有技术只做到了将基本类型的数据移到表格中,赋值和比较过程仍然由测试驱动代码完成,导致测试驱动代码仍然数量庞大且复杂,工具难以自动生成全部测试驱动代码。这样,用户仍然需要自行编写或者用工具在人工的干预下生成大量测试代码,无论人工编写的还是人工干预下工具生成的测试驱动代码,工具都无法自动维护。
另一方面,现有的技术中,对供用户填写输入输出数据的界面,一般采用树形控件或表格控件,无法满足既需要树形展开变量的直接和间接成员,以便针对某些成员建立数据,又需要建立不限量的用例数据的要求,例如Visual Unit3.0采用的表格控件,就不具有展开变量的直接和间接成员的功能。
综上所述,现有技术下不能实现真正的表格驱动,用户仍然需要编写和维护大量的测试驱动代码,这使单元测试的实施成本很高,严重制约了单元测试的效益。
发明内容
本发明要解决的技术问题是提供一种支持复合数据类型的表格驱动的单元测试系统和方法。为了解决上述技术问题,本发明提出的技术方案是:
一种表格驱动的单元测试系统,其特征在于,包括:
A:类型解析装置,用于解析数据类型定义获得类型信息;
B:树表装置,由树形控件和表格控件组成,用于树状显示变量及其成员,并提供表格供用户填写测试用例的输入值和输出值;
C:赋值装置,用于将所述树表装置中的所述输入值赋给变量,所述变量的数据类型包括基本类型和复合类型;
D:比较装置,用于将所述树表装置中的所述输出值与变量的实际值进行比较,并输出测试失败信息,所述变量的数据类型包括基本类型和复合类型;
E:测试驱动装置,用于调用装置C、被测试代码和装置D,执行测试过程。
作为改进方案,还可以包括:
F:回调装置,供装置C、装置D和/或装置E调用,用于根据过渡变量构建目标变量,和/或根据目标变量构建过渡变量,所述过渡变量,是指调用装置C赋值的变量或调用装置D比较的变量,所述目标变量,是指测试过程中需要赋值或比较的变量;
G:类型替换装置,用于对所述树表装置中的,数据类型含有回调类型的变量,将回调类型替换为过渡类型,所述回调类型,是指所述目标变量的数据类型,所述过渡类型,是指所述过渡变量的数据类型。
装置D还可以进一步包括:用于将散列集合与所述对应输出值进行比较的装置,包括:
针对所述散列集合保存的每个变量,与所述散列集合保存的所有变量的所述对应输出值比较,将比较结果为真的基本类型的值的个数最多的所述对应输出值作为变量的对应输出值,针对变量的所述对应输出值,对比较结果为假的所述变量的成员输出测试失败信息。
作为更进一步的改进方案,还可以包括下述装置中的任一装置或其任意组合:
H:分配装置,用于将所述树表装置中,用约定的符号分隔的系列数据,分配到姐妹单元格;
I:转移装置,用于将所述树表装置中,含有约定符号的数据,转移到所述约定符号所指向的单元格,或指向所述约定符号所代表的变量;
J:类型修改装置,用于为所述树表装置中的指定变量修改数据类型;
K:表格装置,用于显示所述树表装置中,用户填写了输入和/或输出值的行;
L:驱动生成装置,用于生成装置E。
一种表格驱动的单元测试方法,其特征在于,包括:
A:类型解析步骤,用于解析数据类型定义获得类型信息;
B:树表步骤,所述树表由树形控件和表格控件组成,用于树状显示变量及其成员,并提供表格供用户填写测试用例的输入值和输出值;
C:赋值步骤,用于将所述树表中的所述输入值赋给变量,所述变量的数据类型包括基本类型和复合类型;
D:比较步骤,用于将所述树表中的所述输出值与变量的实际值进行比较,并输出测试失败信息,所述变量的数据类型包括基本类型和复合类型;
E:测试驱动步骤,用于调用步骤C、被测试代码和步骤D,执行测试过程。
作为改进方案,还可以包括:
F:回调步骤,供步骤C、步骤D和/或步骤E调用,用于根据过渡变量构建目标变量,和/或根据目标变量构建过渡变量,所述过渡变量,是指调用步骤C赋值的变量或调用步骤D比较的变量,所述目标变量,是指测试过程中需要赋值或比较的变量;
G:类型替换步骤,用于对所述树表中的,数据类型含有回调类型的变量,将回调类型替换为过渡类型,所述回调类型,是指所述目标变量的数据类型,所述过渡类型,是指所述过渡变量的数据类型。
作为更进一步的改进方案,还可以包括下述步骤中的任一步骤或其任意组合:
H:分配步骤,用于将所述树表中,用约定的符号分隔的系列数据,分配到姐妹单元格;
I:转移步骤,用于将所述树表中,含有约定符号的数据,转移到所述约定符号所指向的单元格,或指向所述约定符号所代表的变量;
J:类型修改步骤,用于为所述树表中的指定变量修改数据类型;
K:表格步骤,用于显示所述树表中,用户填写了输入和/或输出值的行;
L:驱动生成步骤,用于生成步骤E的代码。
另外,本发明还提出了前述表格驱动的单元测试系统的次佳方案,其特征在于,用特征M代替特征B:
M:表格装置,用于供用户填写测试用例的输入值和输出值。
本发明提出的单元测试系统和方法,突破了赋值和比较过程由测试驱动代码直接完成的惯例和思维惯性,将赋值过程和比较过程从测试驱动代码中分离出来,改用支持复合类型的赋值装置或赋值步骤来完成赋值过程,改用支持复合类型的比较装置或比较步骤来完成比较过程,克服了赋值过程和比较过程只能针对基本数据类型的限制,并将测试数据包括复合类型的数据放在树表或表格中,由树表或表格中的数据决定用例数量以及需要赋值和比较的变量或成员。
本发明实现了真正意义上的表格驱动,即由表格决定哪些数据特别是复合类型的哪些成员需要赋值或判断输出。无论是否涉及复合类型、数组、空指针等数据,都可以实现表格驱动。数组可以当作一般复合类型来处理,指针可视为一种特殊的基本类型。测试数据与测试驱动代码实现分离,在树表或表格中建立、编辑、维护,减少了工作量,增加了数据的可重用性。本发明使测试驱动代码不承担具体的赋值和比较过程,更不需要将复合类型的变量分解为基本类型,测试驱动代码大为简化,更易以由工具一次生成,用户不需要编写、调试和维护大量的测试驱动代码。
为了进一步增强适应性,本发明还可以增加回调装置和类型替换装置,使不便以使用表格驱动的特殊数据,通过过渡类型作为媒介,也能方便地实现表格驱动。特殊数据大致有以下几种:
a.由链表、映射表等容器类存储的数据;
b.调用其他代码来生成比直接在表格中填写更为方便的数据;
c.不可预知的有特殊测试需求的数据。
利用回调装置和类型替换装置,测试工具可以为某些通用的特殊类型,例如通用链表或映射表,提供预设的调用回调装置的功能,这样,用户不需做额外的工作,直接在数据表格中填写一系列输入值,就可以构建保存了这些值的通用链表或映射表,同时,也为用户提供了一个接口,用于处理特别的测试需求,例如,调用其他代码来构建某些测试数据,保证在绝大多数情形下,用户不需要编写测试代码,实现彻底的表格驱动。
本发明的比较装置还可以进一步增加专用于散列集合的比较功能,进一步降低对散列集合判断输出的工作量。
本发明还可以提供数据分配、转移、类型修改、驱动生成、显示简化表格等功能,进一步减少用户编辑和维护表格数据的工作量。
综上所述,本发明可以大幅降低单元测试的难度及综合成本,利用本发明进行单元测试,测试驱动代码的数量与现有技术相比,通常只有几分之一,且测试驱动代码可以完全由工具生成和维护。利用本发明,测试工作效率远远高于现有技术,通常是现有技术的五倍以上。
附图说明
下面结合附图对本发明的具体实施方式作进一步详细的说明:
图1是本发明的一个实施例的总体构成示意图,其中,图1A是本发明基本实施方式的总体构成示意图,图1B是本发明改进方案所增加的装置示意图;
图2是一些示例数据类型的定义;
图3是使用了图2所示的数据类型的一个示例被测试函数;
图4是图1A所示的装置102的应用效果示意图;
图5是图1B所示的装置108的应用效果示意图,其中,图5A是不使用装置108的效果示意图,图5B是使用了装置108的比效果示意图;
图6是图1B所示的装置109的应用效果示意图,其中,图6A是转移到单元格的效果示意图,图6B是转移到变量的效果示意图;
图7是图1B所示的装置111的应用效果示意图,其中,图7A是使用装置102的示意图,图7B是切换到装置111的对比效果示意图;
图8是本发明的应用效果示意图,针对图3的示例函数,图8A是使用现有技术的测试驱动代码示例;图8B是使用了本发明后的测试驱动代码示例;图8C是使用现有技术的表格数据示例;图8D是使用了本发明后的表格数据示例。
具体实施方式
图1是本发明的一个实施例的总体构成示意图,其中,图1A是本发明基本实施方式的总体构成示意图,如图1A所示,本实施例包括下述装置:类型解析装置101;树表装置102;赋值装置103;比较装置104;测试驱动装置105。
本发明的示例代码采用C语言或C++语言编写,但不代表本发明只适用于C语言和C++语言。本发明所列举的示例代码仅仅为了便以说明本发明的技术方案,不代表是对本发明的限制。
装置101解析数据类型定义获得类型信息。类型信息属于本领域的通用术语,不同的编程语言,类型信息可能有些差别,一般来说,类型信息包括:类型名称、内存大小,各成员的成员名称、类型名称、偏移量,当然,还可以包含其他信息,如成员函数列表。下面是用于描述类型信息的数据结构的一个示例:
用于描述一个成员,其中:type为成员的类型;name为成员的名称;offset为成员的偏移量。
用于描述一个类型,其中,type为类型名称,size为类型的实例的内存大小,childCount为成员数量,pChilds为成员指针数组。当用于基本类型时,childCount为0,pChilds为NULL。当然,也可以不使用childCount和pChilds,而是使用一个链表或类似的集合来代替。
装置101扫描被测试代码,对各个数据类型的定义进行解析,获得类型信息,可以将类型信息保存在映射表中,供装置102、103、104查询使用。由于解析过程属于一般的代码解析和编译技术,这里不作更详细的说明。
装置102是一个树表,由树形控件和表格控件组成,用于树状显示变量及其成员,并提供表格供用户填写测试用例的输入值和输出值。树表既可以像一般的树形控件一样,展开到每个叶子结点,或收起一些结点只显示部分结点,也可以像一般的表格控件一样增加不限数量的列,以便填写不限数量的用例。
图2图3图4示出了装置102的应用效果,其中,图2是一些示例数据类型的定义,图3是使用了图2所示的数据类型的一个被测试函数,图4是装置102的应用效果示意图,即针对图3所示的函数,供用户建立测试数据的界面示意图。用户可以选择单元格设置输入和输出值,也可以增加列来建立更多的用例。
对于每一个变量,根据变量的类型查询装置101所获得的类型信息,将该变量加入树表,并递归扫描所有的成员,根据成员的类型名称找到类型信息,将成员作为子结点加入树表,直到基本类型,即树表的子结点均为基本类型,为了方便用户查看各结点的成员及类型,树表的结点可以显示变量名称和类型名称,也可以将对应的类型信息如前述DataType结构的指针保存在结点中,方便后续的操作。表格部分,可以采用一行两列方式,即每个结点对应表格部分的一行,每个用例两列,即输入列和输出列,也可以使用一列两行方式,即每个节点对应表格部分的两行,即输入行和输出行,每个用例占用一列。在后文中引述装置102时,均采用一行两列方式。用户可以通过增加列来建立更多的用例。至于树表控件的实现过程,和将变量加入树表的过程,以及对树表的常规操作过程,属于现有技术,这里不作详述。
装置103将树表装置中的输入值赋给变量,变量的数据类型可以是基本类型,也可以是复合类型,即装置103用于将基本类型或复合类型的数据,为基本类型或复合类型的变量赋值。由于树表本身是根据变量及其成员的树形关系建立的,树表中的数据,与变量及其成员具有一一对应的关系,装置103的实现思路就是根据这种关系进行赋值操作,在总的思路下,可以设计出多种具有不同细节的实现过程。
下面示出一种实现过程,其具体的思路是:递归扫描变量及其成员,对变量或成员初始化,对于对应输入值不为空的变量或成员,拷贝对应输入值;所述对应输入值,是指所述树表装置中,变量或成员对应的当前用例的输入值,例如,树表采用一行两列方式,则对应输入值是指变量或成员对应的行和当前用例的输入列组成的单元格的值,有些对应输入值可能需要经过转换,例如,整数类型,表格中填写的可能是字符串,要转换为整数。例如,针对C或C++语言,下面的步骤可以实现装置103:
1)根据变量的类型名称,可以找到对应的类型信息,以及是否为指针或数组。数组可以视为复合类型,如int[10],可以视为含有10个int类型成员的复合类型。
2)将变量设为空值,例如C语言,对于指针,则设为空指针,非指针则调用memset()清空内存。如果变量对应输入值为空,且所有直接和间接成员的对应输入值也为空,则返回。
3)如果变量的类型为指针,且对应输入值为空指针,则设为空指针。返回。
4)变量如果需要自行管理内存,如C或C++的指针,则先申请内存。申请内存的方式视语言而定,如C语言,可以调用malloc(size),而对于C++,则调用new操作符。
5)将对应输入值拷贝到变量的内存中,例如C语言,可以用以下方式拷贝:
字符串:strcpy(pDes,pSrc),其中,pDes为变量或成员的指针,pSrc为对应输入值。
整数int:*((int*)pvar)=value,其中,pvar为变量或成员的指针,value为对应输入值。
其他类型的拷贝方式大同小异,不再一一列举。
6)针对变量的每一个成员,根据成员的偏移量,计算出成员的指针,并递归执行上述步骤。
步骤2)3)4)可以看作是对变量或成员初始化。对变量或成员初始化是本领域的基础技术,不同的编程语言,不同的类型,初始化的过程可能不同。对于不使用指针的语言,不需要申请内存和设置空指针的步骤,这种情形下,对变量或成员的内存初始化,通常只是将内存清空或设为缺省值。
有些语言的有些变量的初始化,可能需要调用构造函数,例如C++语言的含有虚函数的类型,其对象的初始化,最好调用构造函数,以免由于虚函数表不正确影响测试执行过程,这种情形下,可以用下述方法代替步骤4)所述的new操作符:在解析类型信息时建立一个需调用构造函数的类型的列表,并给每个类型分配一个序号,并生成对象生成函数的代码,测试代码开始执行时,将对象生成函数的指针传递给测试工具,对象生成函数的功能是根据类型序号调用类型的构造函数生成对象指针,在对变量初始化时,调用对象生成函数并传递类型编号,从而得到调用构造函数而建立的对象指针。对于支持运行期构造对象的语言,如Java语言,不需要使用这种方式。
可以针对表格数据制定一些规则,例如,对于某些特殊的值,可以约定表示该值的符号,如用NULL表示空指针,本发明的示例中,在树表或表格中,均使用NULL表示空指针。
为了实现上的简便,在上述步骤5),通常只处理基本类型,如果树表允许直接针对复合类型填写复合数据,则这种数据通常是按某些规则编排的数据,如图4所示的单元格401中的数据,对于这种情形,在执行赋值过程前,可以将数据分解并分配到叶子结点对应的单元格,即基本类型的成员对应的单元格,以便使步骤5)只处理基本类型。
装置104用于将树表装置中的输出值与变量的实际值进行比较,并输出测试失败信息,变量的数据类型可以是基本类型,也可以是复合类型,即装置104用于将基本类型或复合类型的数据,与基本类型或复合类型的变量比较。由于树表本身是根据变量及其成员的树形关系建立的,树表中的数据,与变量及其成员具有一一对应的关系,装置104的实现思路就是根据这种关系进行比较,在总的思路下,可以设计出多种具有不同细节的实现过程。
下面示出一种实现过程,其具体的思路是:递归扫描变量及其成员,对于对应输出值不为空的变量或成员,比较实际值与对应输出值,如比较结果为假,则输出测试失败信息;所述对应输出值,是指所述树表装置中,变量或成员对应的当前用例的输出值,例如,树表采用一行两列方式,则对应输出值是指变量或成员对应的行和当前用例的输出列组成的单元格的值,有些对应输出值可能需要经过转换,例如,整数类型,表格中填写的可能是字符串,要转换为整数。例如,针对C或C++语言,下面的步骤可以实现装置104:
1)根据变量的类型名称,可以找到对应的类型信息,以及是否为指针或数组。数组可以视为复合类型,如int[10],可以视为含有10个int类型成员的复合类型。指针可以视为一个特殊的int类型变量,需要先比较判断空指针,再视具体情况决定是否进行指针所指对象的比较。
2)如果变量的对应输出值为空,且所有直接和间接成员的对应输出值也为空,则返回。
3)如果变量的数据类型为指针,且对应输出值为空指针,则判断实际值是否为空指针,如果不是,则输出测试失败信息,如“pData expect NULL but not”。返回。
4)如果变量的类型是指针,且实际值为空指针,而对应输出值不是空指针,或某些直接或间接成员的对应输出值不为空,则输出测试失败信息,如“pData->a expect123but pData is NULL”。返回。
5)将变量的实际值与对应输出值进行比较,例如C语言,可以用以下方式比较:
字符串:strcmp(pDes,pSrc)==0,其中,pDes为变量的指针,pSrc为对应输出值。
整数int:*((int*)pvar)==value,其中,pvar为变量的指针,value为对应输出值。
其他类型的比较方式大同小异,不再一一列举。如果对应输出值使用了操作符,如&0x00FF00,则要生成判断表达式,如(*((int*)pvar))&0x00FF00,然后计算表达式的值,如果计算结果为假,则视为比较的结果为假。计算表达式的值的过程属于现有技术,这里不作详述。
如果比较结果为假,则输出测试失败信息,如“pData->a expect123but124”。
6)针对变量的每一个成员,根据成员的偏移量,计算出成员的指针,并递归执行上述步骤。
对于不使用指针的语言,不需要判断和比较空指针的步骤。
为了实现上的简便,在上述步骤5),通常只处理基本类型,如果树表允许直接针对复合类型填写复合数据,可以参照装置103的说明,使步骤5)只处理基本类型。
对于散列集合,如映射表,由于其中保存的变量的次序是不确定的,例如,要比较一个映射表中的数据是否为{1,”a”},{2,”b”},{3,”c”},由于枚举映射表中变量,得到的结果可能是{2,”b”},{3,”c”},{1,”a”},也可能是{2,”b”},{1,”a”},{3,”c”},或者其他排列,特别是,当映射表中增加或移除一个变量时,表中保存的其他变量的次序也可能变化,因此,装置104还可以增加专门针对散列集合的散列集合比较装置,其实现思路是:
针对所述散列集合保存的每个变量,与散列集合保存的所有变量的对应输出值比较,将比较结果为真的基本类型的值的个数最多的对应输出值作为变量的对应输出值,针对变量的对应输出值,对比较结果为假的所述变量的成员输出测试失败信息。简单地说,就是针对散列集合保存的每个变量,查找输出值中的匹配项,如果找到完全匹配的值,就认为该变量的实际值符合预期,如果未找到,就根据匹配的基本类型的值的数量来确定匹配项,并为不匹配的部分输出测试失败信息。下面是一种实现步骤示例:
a:将对应输出值解析为散列集合里的各变量的类型对应的输出值集合,计算所述输出值集合中的一项所含基本值的最大个数,记为X,所述基本值,是指类型为基本类型的值;
b:对于散列集合中的每一未标记为已匹配的变量,循环比较输出值集合中的未标记为已使用的各项,将与基本值的比较结果为真的成员个数记为Y,如果Y等于X,则:
从散列集合移除该变量或标记为已匹配;
从输出值集合移除当前项或标记为已使用;
及为所述比较结果为假的所述成员输出测试失败信息;
c:将X减1,如果X大于0,重复执行b。
装置105为测试驱动代码。测试驱动代码与传统方式的测试驱动代码不同,一般不对变量赋值,也不对输出进行判断,而是调用装置103和装置104来完成对输入的赋值过程和判断输出的比较过程。下面用示例代码来说明。
首先,定义以下通用的代码:
其中,函数_ReadGrid()实现了装置103的功能,完成从树表中读取输入值并赋值给变量的过程;函数_AssertGrid()实现了装置104的功能,完成从树表中读取输出值并与变量的实际值进行比较的过程;辅助函数_ReadOneCase(),用于控制执行循环,例如,当测试函数开始执行时,当前用例编号为0,每执行一次,当前用例编号加1,根据当前者用例编号来确定读取树表中的相应列,即当前用例的输入列或输出列,直到树表中的全部用例执行完毕。函数_ReadOneCase()是可选的,测试过程也可以只执行一个用例。
对于图3所示的被测试函数myfunc(),可以使用下面的测试驱动代码:
从以上示例代码可以看出,测试驱动不需要考虑变量是否为复合类型,不需要考虑复合类型变量中哪些成员需要设定输入、哪些成员需要判断输出,因此,这种测试驱动代码比较简单,易以由工具完全生成,多数情况下,用户不需要修改和维护。
从总体上来说,装置101解析数据类型定义获得类型信息,供装置102、103、104使用;装置102为用户提供建立不限数量的用例并编辑输入输出数据的界面;装置105执行测试,并调用装置103和104,读取用例的输入和输出数据,完成给变量赋值和判断输出是否符合预期的过程。
以上是本发明基本方案的一个实施例,实现了表格驱动的单元测试系统。为了进一步提高测试的工作效率,本发明还提供一系列可选装置。图1B是本发明可选装置的示意图,包括:回调装置106,用于处理特殊数据,使不便以使用表格驱动的特殊数据,也能方便地实现表格驱动;类型替换装置107,用于对树表装置中的,数据类型含有回调类型的变量,将回调类型替换为过渡类型;分配装置108,用于将树表装置中,用约定的符号分隔的系列数据,分配到姐妹单元格;转移装置109,用于将树表装置中,含有约定符号的数据,转移到约定符号所指向的单元格,或指向约定符号所代表的变量;类型修改装置110,用于将树表装置中,修改指定变量的数据类型;表格装置111,用于显示树表装置中,用户填写了输入和/或输出值的行;驱动生成装置112,用于生成装置105。
回调装置106和类型替换装置107用于处理特殊数据,使不便以使用表格驱动的特殊数据,也能方便地实现表格驱动。装置106用于实现两方面功能:
1)根据过渡变量构建目标变量;
2)根据目标变量构建过渡变量。
过渡变量是指调用装置103赋值的变量或调用装置104比较的变量,也就是从树表装置中读取数据并赋值或比较的变量,目标变量是指测试过程中需要赋值或比较的变量,也就是真正要赋值或比较的变量。更具体来说,装置106利用易以在树表或表格中建立和编辑的数据类型作为中间类型,通过中间类型的变量作为过渡,从表格中读取数据并赋值或比较,间接实现对目标变量的赋值和比较,这些中间类型称为过渡类型,这些中间变量称为过渡变量,而使用装置106进行赋值和比较的类型,称为回调类型。
绝大多数类型的表格驱动并不需要使用装置106,因此,装置106不是本发明的必需的组成部分。装置106一般应用于特殊类型的变量,例如以下被测试函数:
函数usecallback()的返回值为int类型,可以直接通过表格来赋值或比较,不需要使用装置106,也就是不需要作为回调类型。并不是说int类型绝对不能作为回调类型,在特殊情形下也是可以使用的,例如,某个int类型的变量,是通过复杂的计算才能得到,如表示一个哈希值的int类型变量,必须根据一个字符串key计算所得,那么,仍然可以将int类型作为回调类型,用字符串类型作为过渡类型,在这种情形下,可以通过类型别名来区分一般的int类型和需要作为本发明所说的回调类型来使用的int类型,代码如:
typedef int HASHKEY;
int usecallback2(HASHKEY hash);
那么,将HASHKEY设为回调类型后,参数hash就可以作为过渡变量,而返回值仍然是一般的int类型变量。
前述函数usecallback()的参数的类型为CList<DATA*,DATA*>&,其中,CList是Visual C++6.0的通用模板链表类,数据要加入该链表,一般方式是调用它的成员函数AddHead()或AddTail(),这种类型的变量,不便以通过表格直接赋值或比较,因此,有必要作为回调类型。通常,对于某种数据的非数组集合,如链表、映射表,都可以通过数组来作为过渡类型,原因是:数组可以通过表格直接赋值和比较,且非数组集合类一般都具有用于加入、取出、枚举的接口,可以由集合构建数组,也可以由数组构建集合。
装置106可实现为一个回调函数,下面用该回调函数的一个示例实现代码来说明:
首先,定义一个结构作为回调函数的参数,用于传递需要的数据,下面是该结构的一个示例:
其中,pUserData保存目标变量的指针,input保存操作的方向(输入或输出),count为数组有效项数,当涉及到数组时,用于保存实际使用的项数,type保存过渡类型的名称,name保存目标变量的名称。
并定义两个函数:
extern void_ReadGridCallback(void*pdes,CALLBACK_DATA*pcbd);
extern void_AssertGridCallback(void*pdes,CALLBACK_DATA*pcbd);
函数_ReadGridCallback()通过调用装置105的说明部分定义的函数_ReadGrid()完成对过渡变量的赋值;函数_AssertGridCallback()通过调用装置105的说明部分定义的函数_AssertGrid()完成对过渡变量的比较,由于参数pcbd已保存了_ReadGrid()和函数_AssertGrid()需要的数据,函数_ReadGridCallback()和函数_AssertGridCallback()是本领域技术人员可以实现的,这里不作详细说明。当本发明应用于一个自动化测试工具时,这两个函数属于测试工具的API,用户不需要去实现它。
下面是为Visual C++6.0的CList类建立的回调函数示例:
在上述示例回调函数vcb_CList()中,CList即为回调类型,而TYPE[16]即为过渡类型。由于CList是类型模板,而vcb_List()也是一个模板函数,因此,CList的所有实例类型都可以作为回调类型,例如,函数的参数类型为CList<DATA*,DATA*>,那么,实际的回调类型是CList<DATA*,DATA*>,实际的过渡类型是DATA*[16]。
函数vcb_CList()根据pcbd->input来判断操作方向(输入或输出),如果是输入,则调用_ReadGridCallback()将表格中的数据赋值给_cbData_,然后,调用CList的成员函数,将数据加入链表。如果是输出,则首先调用CList的成员函数,将链表中的数据保存到_cbData_,然后调用_AssertGridCallback(),读取表格中的数据并与_cbData_的实际值进行比较。
当本发明利用于一个单元测试工具时,函数vcb_CList()可作为工具的一部分提供给所有用户使用,调用回调函数的函数也可作为工具的一部分,用户并不需要编写或修改它。
装置106一般在装置103和装置104调用。装置103和装置104在执行过程中,每当需要从数据表格读取数据为变量赋值或比较变量的时,即检查变量的类型是否含有回调类型,如果有,则不从树表读取数据,而是调用对应的回调函数。当需要调用回调函数时,先构建回调函数需要的参数,如前述CALLBACK_DATA结构的对象,然后可以下述的方法调用对应的回调函数:
对于支持根据函数字符串来调用函数的语言,如perl,可以用类似于eval$vcb_CList的语法调用。对于不支持根据函数名字符串来调用函数的语言,如C、C++,可以给每个回调类型分配一个序号,并建立一个调用回调函数的函数,测试代码开始执行时,将该函数的指针传递给测试工具,实现类似于:
当然,也可以使用根据回调类型名查询函数指针的方式来实现,不过效率上稍为差一些。此外,也可以将回调函数编译成动态链接库,使用动态链接库的调用机制来调用。
当回调函数用于输入时,调用的是回调装置的前半部分,即根据过渡变量构建目标变量,完成赋值过程;当回调函数用于输出时,调用的是回调装置的后半部分,即根据目标变量构建过渡变量,完成比较过程。
装置106也可以在105中调用,即在测试驱动代码中调用。调用过程与在装置103和装置104调用类似。
类型替换装置107将树表中的类型为回调类型的变量的类型替换为过渡类型。应用了本发明的测试工具,可以将通用的不方便直接表格驱动的类型,预设为回调类型,并提供回调函数的实现给所有用户使用,例如,将Visual C++6.0的CList类、CMap类设为回调类型,对应的过渡类型为TYPE[16]、{CString key;void*pData}。测试工具也可以提供一个界面,供用户指定回调类型和对应的过渡类型。当变量加入树表时,装置107检查变量及其成员的类型是否含回调类型,凡是类型中含有回调类型的,就将回调类型替换为过渡类型,当然,如果涉及到模板类,也要将模板类实例化。例如,假设是CList是预设的回调类型,对应的过渡类型是TYPE*[16],那么,如果变量dataList的类型为CList<DATA*,DATA*>&,则将dataList的类型替换为DATA*[16]&(在这里,&没有什么意义,可以省略),如果变量dataList的类型为CList<DATA*,DATA*>*,则替换为为DATA*[16]*,如果变量dataList的类型为CList<DATA*,DATA*>*[10],则替换为DATA*[16]*[10],如此类推。
本发明还可以增加一个交互装置,用于提供界面,供用户指定回调类型及对应的过渡类型,同时,还可以生成回调函数的模板,如有需要,将生成的回调函数加入前述的调用回调函数的函数,用户只需要填写回调类型与过渡类型的转换代码,进一步增加本发明的实用价值。交互装置只是一个简单的软件界面,生成回调函数的模板及将生成的回调函数加入前述的调用回调函数的函数,通常也只是一些字符串的替换,这是本领域技术人员可以实现的,这里不作详细说明。利用所述交互装置,用户可以针对某些特殊的测试需求指定回调类型并方便地建立对应的回调函数,例如,某些类型的数据通过调用其他代码来生成比在表格中填写更为简单,则可以将这种类型设为回调类型。
下面举例说明回调装置的应用效果。对于前述示例函数usecallback(),其参数为CList<DATA*,DATA*>&dataList,假如要设计一个测试用例,要求dataList中含有DATA的对象指针,这三个指针对象的值分别为:{1,“张三“},{2,“李四”},{3,“王五”},利用本发明,回调函数vcb_CList()作为通用函数,由工具提供,用户不需要编写一行代码,直接在表格中填写数据就可以了。
分配装置108,用于将树表装置中,用约定的符号分隔的系列数据,分配到姐妹单元格,其效果是简化系列数据的编辑与管理工作。例如,被测试函数是:
参数是结构MyData的指针数组,MyData的定义如图2所示。图5是装置108的应用效果示意图,其中,图5A是不使用装置108的效果示意图,图5B是使用了装置108的效果示意图。假如测试需要设定数组中每个如图5A所示的name成员,那么,需要将树表完全展开,找到数组中每一项的name成员并赋值,如单元格501和502,比较麻烦,而且,这些数据分布于树表中的并不相连的多行,也不便于管理。装置108将用约定的符号分隔的系列数据,分配到姐妹单元格,其效果如图5B所示。用户在数组第一项的name成员中填写一系列值,如单元格503,用约定的符号(图5B所用的约定符号是逗号)分隔。装置108按约定符号将数据拆分,并分配给姐妹单元格,即第一个数据分配给数组第一项的name成员,即图5A所示的单元格501,第二个数据分配给数组第二项的name成员,即图5A所示的单元格502,依此类推。分配的实现过程只是一些字符串的拆分与树表项的查找工作,是本领域的技术人员可以实现的,这里不作详述。
转移装置109,用于将树表装置中,含有约定符号的数据,转移到约定符号所指向的单元格,或指向约定符号所代表的变量。装置109实现两方面的效果:值的转移和变量的转移。
值的转移效果如图6A所示,通过约定的符号左箭头,将单元格601的值(NULL)转移到单元格602,其结果是将pData->pChild->pBase设为NULL;用两个左箭头将单元格603的值(NULL)转移到单元格604,其结果是将pData->pChild设为NULL。值的转移用于减少填写数据的行,降低维护测试数据的工作量。值的转移的实现过程只是字符串处理与树表项的查找,是本领域的技术人员可以实现的,这里不作详述。
变量的转移效果如图6B所示,变量ptr是一个三级指针,用例2为了把二级指针设为空指针NULL,使用了约定符号右箭头,用例3为了把三级指针设为空指针NULL,使用了约定符号两个右箭头。为了实现变量的转移,可以在装置103的赋值过程和装置104的比较过程时,根据树表中的转移符号,将赋值或比较的目标变量改为转移符号所指向的变量,例如,图6B所示的用例1,赋值时直接将ptr设为空指针,而对于用例2,则先为ptr申请内存,然后将内存的值设为空指针。
类型修改装置110,用于将树表装置中,修改指定变量的数据类型。例如,被测试函数的形参是void*,测试时要设为int*,装置110提供在树表中直接修改类型的功能,避免修改测试驱动代码。装置110首先提供一个界面,供用户选择要修改类型的变量,以及设定新的类型,然后,将树表中变量的类型改为新的类型,并显示新的变量和成员结点。
表格装置111,用于显示树表装置中,用户填写了输入和/或输出值的行。图7是装置111的应用效果示意图,其中,图7A是用户在树表中选择和填写数据的界面,图7B是切换到表格后的对比效果示意图。如图7B所示,装置111用于只显示用户填写了数据的行。如图7A所示,由于数据类型可能非常复杂,树表的分支可能很深很多,而用户实际上要关注的,可能只是其中的一两行,但用例数可能很多,即在树表中,总的行很多,要用的行不多,而要添加的列则很多,这种情况下,存在大量分支(即大量行)的树表将增加用户新建和维护数据的难度,而另外提供的表格则可以解决这个问题,即用户在建立第一个用例时,使用树表,以便选择需要设定输入和/或输出的行进行填写,然后切换到表格,如图7B所示,表格只显示用户已经填写了数据的行,这样,用户在建立和编辑更多用例时将方便得多。
驱动生成装置112,用于生成装置105。装置112用于生成测试驱动代码,测试驱动代码的示例已在前面说明,这里不再重复。装置112首先解析被测试代码,找出可能需要设置输入和/或输出的变量,如参数、返回值、被测试函数所引用的成员变量和全局变量,然后为变量生成输入和输出代码,以及测试过程可能需要的辅助代码,包括调用被测试函数的代码。具体的生成过程,属于一般的代码解析和字符串处理技术,这里不作详述。
图8是本发明的应用效果示意图,针对图3的示例函数,图8A是使用现有技术的测试驱动代码示例;图8B是使用了本发明后的测试驱动代码示例;图8C是使用现有技术的表格数据示例;图8D是使用了本发明后的表格数据示例。从图8C和图8D可以看出,表格中的用例数据相同或相近,从图8A和图8B可以看出,现有技术的测试驱动代码量和复杂度远远高于本发明。另一方面,现有技术把复合类型分解为基本类型再分别读取表格数据,其生成的测试驱动代码常常存在缺陷,例如,图8A所示的代码需要人工添加代码为某些变量申请内存,否则执行过程中本身会崩溃。利用本发明,测试驱动代码可以由工具完全自动生成自动维护,考虑到现有技术的测试驱动代码的修改、调试和维护成本,本领域的技术人员可以看出,本发明的测试工作效率远远高于现有技术,通常是现有技术的五倍以上。
对于本发明所述的表格驱动的单元测试方法,其实现步骤已包含于前面的说明中,不再重复。
本发明可以不使用树表装置102,而用一般的表格来代替。这是一种次佳方案,也能实现本发明的主要效果,但是,使用表格方式,要么将变量及其所有直接或间接成员全部加入表格,要么只加入变量本身而不加入成员,当数据类型很复杂时,这两种方式对用户都不方便,前者造成表格中行数太多,特别是对于含有指向自身指针的成员的类型,可能造成死循环,后者则填写数据的难度较大。如果采用将变量及其所有直接或间接成员全部加入表格的方式,那么,实施本发明的过程,除装置102部分改为使用表格,其他装置的实施方式是一样的。如果采用只加入变量本身而不加入成员的方式,那么,可以将单元格中的复合数据分解为基本类型的数据,如图4所示的单元格401中的数据,可以先分解成基本类型的数据,这些分解后的数据,与变量的成员是对应的,装置103、104仍然可以按前述的方式进行赋值和比较。
以上实施例仅是本发明的较佳实施方式,仅用以说明本发明而非限制,对本发明进行修改、变形或者等同替换而不脱离本发明的精神和范围,均应涵盖于本发明的范围之内。
Claims (12)
1.一种表格驱动的单元测试系统,其特征在于,包括:
A:类型解析装置,用于解析数据类型定义获得类型信息;
B:树表装置,由树形控件和表格控件组成,用于树状显示变量及其成员,并提供表格供用户填写测试用例的输入值和输出值;
C:赋值装置,用于将所述树表装置中的所述输入值赋给变量,所述变量的数据类型包括基本类型和复合类型;
D:比较装置,用于将所述树表装置中的所述输出值与变量的实际值进行比较,并输出测试失败信息,所述变量的数据类型包括基本类型和复合类型;
E:测试驱动装置,用于调用装置C、被测试代码和装置D,执行测试过程。
2.根据权利要求1所述的表格驱动的单元测试系统,其特征在于,所述类型信息包括:类型名称、内存大小,各成员的成员名称、类型名称、偏移量。
3.根据权利要求1所述的表格驱动的单元测试系统,其特征在于,所述赋值装置包括:递归扫描变量及其成员,对变量或成员初始化,对于对应输入值不为空的变量或成员,拷贝对应输入值;所述对应输入值,是指所述树表装置中,变量或成员对应的当前用例的输入值;所述比较装置包括:递归扫描变量及其成员,对于对应输出值不为空的变量或成员,比较实际值与对应输出值,如比较结果为假,则输出测试失败信息;所述对应输出值,是指所述树表装置中,变量或成员对应的当前用例的输出值。
4.根据权利要求1所述的表格驱动的单元测试系统,其特征在于,进一步包括:
F:回调装置,供装置C、装置D和/或装置E调用,用于根据过渡变量构建目标变量,和/或根据目标变量构建过渡变量,所述过渡变量,是指调用装置C赋值的变量或调用装置D比较的变量,所述目标变量,是指测试过程中需要赋值或比较的变量;
G:类型替换装置,用于对所述树表装置中的,数据类型含有回调类型的变量,将回调类型替换为过渡类型,所述回调类型,是指所述目标变量的数据类型,所述过渡类型,是指所述过渡变量的数据类型。
5.根据权利要求4所述的表格驱动的单元测试系统,其特征在于,根据过渡变量构建目标变量,是指将所述过渡变量的值赋给所述目标变量,和/或以所述过渡变量为参数,调用其他代码生成所述目标变量的值;所述根据目标变量构建过渡变量,是指将所述目标变量的值赋给所述过渡变量,和/或以所述目标变量为参数,调用其他代码生成所述过渡变量的值。
6.根据权利要求5所述的表格驱动的单元测试系统,其特征在于,进一步包括:供用户指定所述回调类型及对应的所述过渡类型的装置,和/或生成装置F的装置。
7.根据权利要求1至6任一权利要求所述的表格驱动的单元测试系统,其特征在于,装置D进一步包括:用于将散列集合与所述对应输出值进行比较的装置,包括:
针对所述散列集合保存的每个变量,与所述散列集合保存的所有变量的所述对应输出值比较,将比较结果为真的基本类型的值的个数最多的所述对应输出值作为变量的对应输出值,针对变量的所述对应输出值,对比较结果为假的所述变量的成员输出测试失败信息。
8.根据权利要求1至6任一权利要求所述的表格驱动的单元测试系统,其特征在于,进一步包括以下装置中的任一装置或以下装置的任意组合:
H:分配装置,用于将所述树表装置中,用约定的符号分隔的系列数据,分配到姐妹单元格;
I:转移装置,用于将所述树表装置中,含有约定符号的数据,转移到所述约定符号所指向的单元格,或指向所述约定符号所代表的变量;
J:类型修改装置,用于为所述树表装置中的指定变量修改数据类型;
K:表格装置,用于显示所述树表装置中,用户填写了输入和/或输出值的行;
L:驱动生成装置,用于生成装置E。
9.一种表格驱动的单元测试方法,其特征在于,包括:
A:类型解析步骤,用于解析数据类型定义获得类型信息;
B:树表步骤,所述树表由树形控件和表格控件组成,用于树状显示变量及其成员,并提供表格供用户填写测试用例的输入值和输出值;
C:赋值步骤,用于将所述树表中的所述输入值赋给变量,所述变量的数据类型包括基本类型和复合类型;
D:比较步骤,用于将所述树表中的所述输出值与变量的实际值进行比较,并输出测试失败信息,所述变量的数据类型包括基本类型和复合类型;
E:测试驱动步骤,用于调用步骤C、被测试代码和步骤D,执行测试过程。
10.根据权利要求9所述的表格驱动的单元测试方法,其特征在于,进一步包括:
F:回调步骤,供步骤C、步骤D和/或步骤E调用,用于根据过渡变量构建目标变量,和/或根据目标变量构建过渡变量,所述过渡变量,是指调用步骤C赋值的变量或调用步骤D比较的变量,所述目标变量,是指测试过程中需要赋值或比较的变量;
G:类型替换步骤,用于对所述树表中的,数据类型含有回调类型的变量,将回调类型替换为过渡类型,所述回调类型,是指所述目标变量的数据类型,所述过渡类型,是指所述过渡变量的数据类型。
11.根据权利要求9或10所述的表格驱动的单元测试方法,其特征在于,进一步包括以下步骤中的任一步骤或以下步骤的任意组合:
H:分配步骤,用于将所述树表中,用约定的符号分隔的系列数据,分配到姐妹单元格;
I:转移步骤,用于将所述树表中,含有约定符号的数据,转移到所述约定符号所指向的单元格,或指向所述约定符号所代表的变量;
J:类型修改步骤,用于为所述树表中的指定变量修改数据类型;
K:表格步骤,用于显示所述树表中,用户填写了输入和/或输出值的行;
L:驱动生成步骤,用于生成步骤E的代码。
12.一种根据要求1所述的表格驱动的单元测试系统,其特征在于,用特征M代替特征B:
M:表格装置,用于供用户填写测试用例的输入值和输出值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310690605.3A CN104714881B (zh) | 2013-12-15 | 2013-12-15 | 一种表格驱动的单元测试系统和方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310690605.3A CN104714881B (zh) | 2013-12-15 | 2013-12-15 | 一种表格驱动的单元测试系统和方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104714881A true CN104714881A (zh) | 2015-06-17 |
CN104714881B CN104714881B (zh) | 2018-10-16 |
Family
ID=53414240
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310690605.3A Active CN104714881B (zh) | 2013-12-15 | 2013-12-15 | 一种表格驱动的单元测试系统和方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104714881B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106202162A (zh) * | 2016-06-24 | 2016-12-07 | 武汉斗鱼网络科技有限公司 | 一种用于测试推荐房间数据列表的测试系统及方法 |
CN108549531A (zh) * | 2018-04-19 | 2018-09-18 | 携程旅游网络技术(上海)有限公司 | 复杂类型数据自动生成方法、装置、电子设备、存储介质 |
CN108874662A (zh) * | 2017-05-15 | 2018-11-23 | 丰田自动车株式会社 | 测试方法和存储程序的非暂态计算机可读介质 |
CN109376082A (zh) * | 2018-09-27 | 2019-02-22 | 北京小米智能科技有限公司 | 漏洞挖掘方法、装置及可读存储介质 |
CN110221956A (zh) * | 2018-03-02 | 2019-09-10 | 富士通株式会社 | 用于生成区块链智能合约的测试用例的方法和设备 |
CN112100049A (zh) * | 2019-06-18 | 2020-12-18 | 北京数聚鑫云信息技术有限公司 | 一种生成测试数据的方法、装置、介质及设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2001093043A1 (en) * | 2000-03-27 | 2001-12-06 | Accenture Llp | System, method, and article of manufacture for an automated scripting solution for enterprise testing |
US6502102B1 (en) * | 2000-03-27 | 2002-12-31 | Accenture Llp | System, method and article of manufacture for a table-driven automated scripting architecture |
WO2003038550A2 (en) * | 2001-10-26 | 2003-05-08 | Capital One Financial Corporation | Systems and methods for table driven automation testing of software programs |
US20080115114A1 (en) * | 2006-11-10 | 2008-05-15 | Sashank Palaparthi | Automated software unit testing |
CN102915242A (zh) * | 2012-09-26 | 2013-02-06 | 北京广利核系统工程有限公司 | 一种利用图形化操作实现代码编程的方法 |
-
2013
- 2013-12-15 CN CN201310690605.3A patent/CN104714881B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2001093043A1 (en) * | 2000-03-27 | 2001-12-06 | Accenture Llp | System, method, and article of manufacture for an automated scripting solution for enterprise testing |
US6502102B1 (en) * | 2000-03-27 | 2002-12-31 | Accenture Llp | System, method and article of manufacture for a table-driven automated scripting architecture |
WO2003038550A2 (en) * | 2001-10-26 | 2003-05-08 | Capital One Financial Corporation | Systems and methods for table driven automation testing of software programs |
US20080115114A1 (en) * | 2006-11-10 | 2008-05-15 | Sashank Palaparthi | Automated software unit testing |
CN102915242A (zh) * | 2012-09-26 | 2013-02-06 | 北京广利核系统工程有限公司 | 一种利用图形化操作实现代码编程的方法 |
Non-Patent Citations (3)
Title |
---|
NIGEL DALEY等: ""A framework for table driven testing of Java classes"", 《SOFTWARE: PRACTICE AND EXPERIENCE》 * |
刘跃勇等: "c/c++单元测试底层模拟技术", 《计算机系统与应用》 * |
郭瑞杰等: ""基于表格驱动的 XML 配置文件解析与生成技术"", 《计算机工程与应用》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106202162A (zh) * | 2016-06-24 | 2016-12-07 | 武汉斗鱼网络科技有限公司 | 一种用于测试推荐房间数据列表的测试系统及方法 |
CN106202162B (zh) * | 2016-06-24 | 2019-07-09 | 武汉斗鱼网络科技有限公司 | 一种用于测试推荐房间数据列表的测试系统及方法 |
CN108874662A (zh) * | 2017-05-15 | 2018-11-23 | 丰田自动车株式会社 | 测试方法和存储程序的非暂态计算机可读介质 |
CN108874662B (zh) * | 2017-05-15 | 2022-03-18 | 丰田自动车株式会社 | 测试方法和存储程序的非暂态计算机可读介质 |
CN110221956A (zh) * | 2018-03-02 | 2019-09-10 | 富士通株式会社 | 用于生成区块链智能合约的测试用例的方法和设备 |
CN108549531A (zh) * | 2018-04-19 | 2018-09-18 | 携程旅游网络技术(上海)有限公司 | 复杂类型数据自动生成方法、装置、电子设备、存储介质 |
CN109376082A (zh) * | 2018-09-27 | 2019-02-22 | 北京小米智能科技有限公司 | 漏洞挖掘方法、装置及可读存储介质 |
CN112100049A (zh) * | 2019-06-18 | 2020-12-18 | 北京数聚鑫云信息技术有限公司 | 一种生成测试数据的方法、装置、介质及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN104714881B (zh) | 2018-10-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104714881A (zh) | 一种表格驱动的单元测试系统和方法 | |
CN101617292B (zh) | 面向生成器图的编程和执行 | |
Antcheva et al. | ROOT—A C++ framework for petabyte data storage, statistical analysis and visualization | |
CN101589366B (zh) | 面向生成器图的编程框架中的并行化和植入 | |
CN109254905B (zh) | 基于工作流的分布式并行自动化测试系统 | |
JP5354603B2 (ja) | シナリオサポートを伴うプロデューサグラフ指向のプログラミングフレームワーク | |
CN103019742B (zh) | 一种多dsp平台上的自动代码生成方法 | |
Smaragdakis et al. | DiSTiL: A Transformation Library for Data Structures. | |
CN102915242A (zh) | 一种利用图形化操作实现代码编程的方法 | |
CN104965761A (zh) | 一种基于gpu/cpu混合架构的流程序多粒度划分与调度方法 | |
CN104662514A (zh) | 基于模型关联关系的遗产软件系统的现代化 | |
CN106030524A (zh) | 用于可视化地实现软件代码的方法和设备 | |
CN101208660A (zh) | 代码转换 | |
CN109299003A (zh) | 一种面向复杂软件的全自动测试用例驱动生成系统 | |
CN111984176A (zh) | 一种软件在线开发平台及开发方法 | |
CN103488537A (zh) | 一种数据抽取、转换和加载etl的执行方法及装置 | |
Yang et al. | Powerstation: Automatically detecting and fixing inefficiencies of database-backed web applications in ide | |
CN113342325A (zh) | 可视化建模方法、系统、电子设备及存储介质 | |
CN114968405B (zh) | 一种自定义工作流引擎配置系统及方法 | |
Suhan et al. | LazyTensor: combining eager execution with domain-specific compilers | |
CN104731695A (zh) | 一种支持表格驱动底层输入的单元测试系统和方法 | |
KR100994070B1 (ko) | 예약된 컴포넌트 컨테이너 기반 소프트웨어 개발 방법 및장치 | |
Sáenz-Adán et al. | Automating provenance capture in software engineering with UML2PROV | |
CN104731700A (zh) | 一种支持表格驱动局部数据的单元测试系统和方法 | |
Ghaibi et al. | A tool support for the adaptation of user interfaces based on a business rules management system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information |
Address after: 510315 UP Chi Chi C2-209, 29, West Road, Hongwei new village, Haizhuqu District, Guangzhou, Guangdong. Applicant after: Guangzhou Kaile Software Technology Co., Ltd. Address before: 510630 303, room 244, five mountain road, Tianhe District, Guangzhou, Guangdong. Applicant before: Guangzhou Kaile Software Technology Co., Ltd. |
|
CB02 | Change of applicant information | ||
GR01 | Patent grant | ||
GR01 | Patent grant |