表格驱动的单元测试技术(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直接完成。

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

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

你可能感兴趣的:(编程,技术,单元测试,测试,单元测试工具)