表格驱动的单元测试技术(1)
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=1,b=2,通过测试驱动代码直接赋值,而预期输出是:返回值为3,判断实际输出是否符合预期的比较过程,则通过表达式ret == 3直接完成。
以上是传统单元测试的工作过程示例,其中,对输入的赋值过程和判断输出的比较过程是由测试驱动代码直接完成的,单元测试已有几十年历史,出现了大量的开源或商业单元测试工具,但赋值和比较过程,基本上都采用这种方式。对传统赋值和比较过程的一个改进思路是:使用宏语法对测试驱动代码进行封装,这种方式不适合于没有预处理特性的语言,且赋值和比较过程仍然是由测试驱动代码完成的,也无法满足对复杂对象的处理。
传统单元测试方式下,测试数据混合在测试驱动代码中,而测试驱动代码的数量往往是产品代码的二至五倍,且测试驱动代码本身也需要调试和维护,导致单元测试的综合成本很高。如果将单元测试过程改为表格驱动,由表格来决定哪些变量需要设定输入值及设定什么值,由表格来确定哪些变量需要判断预期输出以及预期输出的值,那么,用户只要在数据表格中建立和编辑测试数据,就可以高效地建立大量用例,测试数据也更易于维护和重用。同时,将减少和简化测试驱动代码,使测试驱动代码更易以由工具生成,对于工具完全自动生成的测试驱动代码,当产品代码更新时,工具也可以自动刷新,用户不需编写、调试和维护大量的测试驱动代码。总之,表格驱动的单元测试方式可以显著降低单元测试的综合成本。