本文通过介绍简单测试代码的编写来进一步阐述单元测试的基本原理和方法,在实际工作中,测试代码可以由工具生成。
下面用最容易理解和测试的加法函数来介绍测试代码的编写,函数代码如下:
int add(int a,int b)
{
return a + b;
}
测试代码如下:
void test_add()
{
//设定输入
int a = 1;
int b = 1;
//执行被测程序
int ret = add(a, b);
//判断输出是否符合预期
TEST_ASSERT(ret == 2);
}
TEST_ASSERT()是一个宏,定义如下:
#define TEST_ASSERT(exp) test_assert(exp,__FILE__,__LINE__)
这个宏调用了函数test_assert(),定义如下:
int assertCount = 0;
int errorCount = 0;
void test_assert(int b, constchar *file,int line)
{
assertCount++;
if(!b)
{
printf("error: %s Line %d!\n", file, line);
errorCount++;
}
}
test_assert()是一个测试断言函数,测试断言的功能是当预期的输出与实际的输出不符时,自动报告错误。test_assert()有三个参数:
int b,传递预期输出的计算结果,0表示false,即测试未通过;
constchar *file,所在文件;
int line,所在行号。
test_assert()函数的功能很简单:统计断言数和错误数,当参数b为false时,打印一条错误信息。
有了以上定义,就可以用以下代码判断预期输出:
TEST_ASSERT(ret == 2);
现在还有一些问题:多个用例如何比较简单地编写代码?如何便于以后的扩充?例如,每个用例执行前可能要做共同的初始化,执行后要做相同的清理。我们可以定义以下代码:
externvoid setUp(); //公共前置操作
externvoid tearDown(); //公共后置操作
#define CASE_BEGIN() {setUp();
#define CASE_END() tearDown();}
setUp()为公共前置操作,用于初始化,tearDown()为公共后置操作,用于清理数据。
用例代码改为:
CASE_BEGIN()
int a = 1;
int b = 1;
int ret = add(a, b);
TEST_ASSERT(ret == 2);
CASE_END();
现在,用例的前后加了{},每个用例独占一个域,可以使用相同的变量名,更多的用例可以采用拷贝并修改输入输出值的方式建立,下面是第二个用例:
CASE_BEGIN()
int a = 10;
int b = 10;
int ret = add(a, b);
TEST_ASSERT(ret == 20);
CASE_END();
通常,不同的用例之间只是个别输入输出不同,拷贝修改是比较简单高效的方法。
更多推荐
如何编写测试代码
发布评论