表格驱动的单元测试技术(1)

【摘要】本文分析了传统单元测试技术的不足,提出了表格驱动的单元测试技术,新技术可以大幅降低单元测试的难度及综合成本,用户不需要编写测试代码,测试工作效率通常是现有技术的五倍以上。新技术已在C/C++单元测试工具Visual Unit 4中成功应用。这是第一节。


一、传梳单元测试技术的缺陷分析

    单元测试是软件开发过程中保证代码质量,提升开发产能的重要手段。

    单元测试的基本方法是利用测试驱动代码,设定输入和预期输出,执行被测试程序,自动判断实际输出是否符合预期。输入数据和预期输出称为测试用例,也就是测试数据,这是单元测试工作的基本要素,而对输入的赋值过程和判断输出的比较过程,则是单元测试执行过程的核心。

    传统的单元测试过程是:手工编写或使用工具生成测试驱动代码来执行测试,由测试驱动代码给变量赋输入值,并由测试驱动代码判断输出是否符合预期,也就是说,对输入的赋值过程和判断输出的比较过程,是由测试驱动代码直接完成的。例如下面的C++语言代码:

int add(int a, int b)
{
    return a + b;
}

void add_test()
{
    //用例1
    TEST_ASSERT(add(1,2) == 3);

    //用例2
    int a = 1;
    int b = 2;
    int ret = add(a, b);
    TEST_ASSERT(ret == 3);
}

    其中add()是被测试函数,add_test()是测试函数,TEST_ASSERT是一个宏,其参数为一个布尔表达式,当该布尔表达式的计算结果为假时,表示被测试函数的实际计算结果不符合预期,向用户输出测试失败信息。

    add_test()的两个用例意义是一样的,只是写法不同,后一种更清晰地划分了输入和输出。现在以用例2做进一步说明:用例的输入是:a=1b=2,通过测试驱动代码直接赋值,而预期输出是:返回值为3,判断实际输出是否符合预期的比较过程,则通过表达式ret == 3直接完成。

    以上是传统单元测试的工作过程示例,其中,对输入的赋值过程和判断输出的比较过程是由测试驱动代码直接完成的,单元测试已有几十年历史,出现了大量的开源或商业单元测试工具,但赋值和比较过程,基本上都采用这种方式。对传统赋值和比较过程的一个改进思路是:使用宏语法对测试驱动代码进行封装,这种方式不适合于没有预处理特性的语言,且赋值和比较过程仍然是由测试驱动代码完成的,也无法满足对复杂对象的处理。

   传统单元测试方式下,测试数据混合在测试驱动代码中,而测试驱动代码的数量往往是产品代码的二至五倍,且测试驱动代码本身也需要调试和维护,导致单元测试的综合成本很高。如果将单元测试过程改为表格驱动,由表格来决定哪些变量需要设定输入值及设定什么值,由表格来确定哪些变量需要判断预期输出以及预期输出的值,那么,用户只要在数据表格中建立和编辑测试数据,就可以高效地建立大量用例,测试数据也更易于维护和重用。同时,将减少和简化测试驱动代码,使测试驱动代码更易以由工具生成,对于工具完全自动生成的测试驱动代码,当产品代码更新时,工具也可以自动刷新,用户不需编写、调试和维护大量的测试驱动代码。总之,表格驱动的单元测试方式可以显著降低单元测试的综合成本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
子系统名:单元测试实例 模 块 名:单元测试实例模块 计划编号 用例编号 创建日期 测试要点描述 执行状态 数据输入、结果输出 预期结果 测试代码 是否通过 BUG号 覆盖率快照文件 覆盖率% 签名 PL-UT-MyCode-estimate UTC-MyCode-estimate-01 2005-7-31 id正确等价类:65535 未完成 "输入:id=65535 输出:return 1" 1 TestMyCode.testEstimatet1() 通过 / PL-UT-MyCode-estimate.jpc 100.00% 张三 UTC-MyCode-estimate-02 2005-7-31 id边界值:0 未完成 "输入:id=0 输出:return 0" 0 TestMyCode.testEstimatet2() 通过 / 张三 UTC-MyCode-estimate-03 2005-7-31 id边界值:1 未完成 "输入:id=1 输出:return 1" 1 TestMyCode.testEstimatet3() 通过 / 张三 UTC-MyCode-estimate-04 2005-7-31 id错误等价类:a 未完成 "输入:id=""a"" 输出:return 0" 0 TestMyCode.testEstimatet4() 通过 / 张三 UTC-MyCode-estimate-05 2005-7-31 id错误等价类:空 未完成 "输入:id="""" 输出:return 0" 0 TestMyCode.testEstimatet5() 通过 / 张三 PL-UT-MyCode-insertData UTC-MyCode-insertData-01 2005-7-31 增加记录正常 未完成 "输入:""2"",""111"",""m"" 输出:0" flag=0 TestMyCode.testinsertData1() 通过 / PL-UT-MyCode-insertData.jpc 83.10% 张三 UTC-MyCode-insertData-02 2005-7-31 id为空,insert失败 未完成 "输入:"""", ""111"", ""m"" 输出:1" flag=1 TestMyCode.testinsertData2() 通过 / 张三 UTC-MyCode-insertData-03 2005-7-31 id为1,重复,insert失败 未完成 "输入:""1"",""222"",""f"" 输出:2" flag=2 TestMyCode.testinsertData3() 通过 / 张三 UTC-MyCode-insertData-04 2005-7-31 name为空,insert失败 未完成 "输入:""3"", """", ""f"" 输出:3" flag=3 TestMyCode.testinsertData4() 通过 / 张三 UTC-MyCode-insertData-05 2005-7-31 sex不是m或f,insert失败 未完成 "输入:""4"", ""ggg"", ""h"" 输出:4" flag=4 TestMyCode.testinsertData5() 通过 / 张三 "填写说明: 1.该页面由开发人员填写 2.开发人员根据开发组长所填写的第二个sheet的内容设计单元测试用例,即,完成该sheet蓝色区域的填写。 3.开发人员执行测试用例,并执行过程中填写该sheet的紫色区域。"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EasyTDD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值