如何编写测试代码 .

上一篇 / 下一篇  2012-12-04 09:47:43

本文通过介绍简单测试代码的编写来进一步阐述单元测试的基本原理和方法,在实际工作中,测试代码可以由工具生成。

下面用最容易理解和测试的加法函数来介绍测试代码的编写,函数代码如下:

intadd(inta,intb)

{

returna + b;

}

测试代码如下:

voidtest_add()

{

//设定输入

inta = 1;

intb = 1;

//执行被测程序

intret = add(a, b);

//判断输出是否符合预期

TEST_ASSERT(ret == 2);

}

TEST_ASSERT()是一个宏,定义如下:

#defineTEST_ASSERT(exp) test_assert(exp,__FILE__,__LINE__)

这个宏调用了函数test_assert(),定义如下:

intassertCount = 0;

interrorCount = 0;

voidtest_assert(intb,constchar*file,intline)

{

assertCount++;

if(!b)

{

printf("error: %s Line %d!\n", file, line);

errorCount++;

}

}

test_assert()是一个测试断言函数,测试断言的功能是当预期的输出与实际的输出不符时,自动报告错误。test_assert()有三个参数:

intb,传递预期输出的计算结果,0表示false,即测试未通过;

constchar*file,所在文件;

intline,所在行号。

test_assert()函数的功能很简单:统计断言数和错误数,当参数bfalse时,打印一条错误信息。

有了以上定义,就可以用以下代码判断预期输出:

TEST_ASSERT(ret == 2);

现在还有一些问题:多个用例如何比较简单地编写代码?如何便于以后的扩充?例如,每个用例执行前可能要做共同的初始化,执行后要做相同的清理。我们可以定义以下代码:

externvoidsetUp();                 //公共前置操作

externvoidtearDown();              //公共后置操作

#defineCASE_BEGIN()     {setUp();

#defineCASE_END()       tearDown();}

setUp()为公共前置操作,用于初始化,tearDown()为公共后置操作,用于清理数据。

用例代码改为:

CASE_BEGIN()

inta = 1;

intb = 1;

intret = add(a, b);

TEST_ASSERT(ret == 2);

CASE_END();

        现在,用例的前后加了{},每个用例独占一个域,可以使用相同的变量名,更多的用例可以采用拷贝并修改输入输出值的方式建立,下面是第二个用例:

CASE_BEGIN()

inta = 10;

intb = 10;

intret = add(a, b);

TEST_ASSERT(ret == 20);

CASE_END();

      通常,不同的用例之间只是个别输入输出不同,拷贝修改是比较简单高效的方法。



TAG:

 

评分:0

我来说两句

日历

« 2024-05-06  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 6321
  • 日志数: 10
  • 建立时间: 2012-09-25
  • 更新时间: 2012-12-07

RSS订阅

Open Toolbar