如何编写单元测试代码
2017-04-21 10:15
141 查看
如何编写单元测试代码
本文通过介绍简单测试代码的编写来进一步阐述单元测试的基本原理和方法,下面用最容易理解和测试的加法函数来介绍测试代码的编写,函数代码如下:
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();
通常,不同的用例之间只是个别输入输出不同,拷贝修改是比较简单高效的方法。
本文通过介绍简单测试代码的编写来进一步阐述单元测试的基本原理和方法,下面用最容易理解和测试的加法函数来介绍测试代码的编写,函数代码如下:
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();
通常,不同的用例之间只是个别输入输出不同,拷贝修改是比较简单高效的方法。
相关文章推荐
- 在VS2010单元测试中,Assert断言主要有那些功能?如何去编写代码测试?
- 从《从架构的角度看,如何写好代码?》中来看如何编写单元测试代码
- 如何编写高质量的VB代码(转自雪中漫步的专栏)
- 如何成功把EXCEL表的数据导入到SQL数据库,代码如何编写
- 如何编写异常安全的C++代码
- 如何编写高质量的VB代码
- 如何编写高质量的VB代码 ...[ 2005-07-12 | 转载作者:cnzx219 ]
- 如何编写高质量的VB代码(2)
- 如何用C语言编写幂运算的代码?救急!!!
- 如何编写异常安全的C++代码
- oracle中如何编写树级代码
- 如何编写安全的Java代码
- 如何编写高质量的代码
- 如何编写异常安全的C++代码
- 如何编写异常安全的C++代码
- [精华]如何编写高质量的VB代码
- 如何编写高质量的VB代码(1)
- 如何编写高质量的VB代码
- 编写高质量的代码---单元测试Nunit+NCover
- 如何编写高质量的VB代码