测试(1): 极简单元测试
示例说明:
以除法为例子做一个C的极简单元测试示例,请大家学习,tiny_unit_test.h可直接拿去用。
本次作业的功能是calc,不是div,此处拿div做例子,只是为了给大家一个最基本的单元测试示例。
Java和C#的同学们请使用那些语言的Assert之类的,例如参考这个:http://www.cnblogs.com/greyzeng/p/4439080.html
单元测试工具
每一种语言都有对应的做单元测试的框架和工具,此处写一个最简单单元测试工具宏tiny_unit_test.h,用以帮助理解
#ifndef __TINY_UNIT_TEST_H__
#define __TINY_UNIT_TEST_H__
#define FAIL() printf("\nfailure in %s() line %d\n", __FUNCTION__, __LINE__)
#define tut_assert(test) do { if (!(test)) { FAIL(); return 1; }} while(0)
#endif
编写核心计算模块API
除法API头文件:div.h
#ifndef __DIV_H__
#define __DIV_H__
#include <stdio.h>
#include <stdlib.h>
#define RESULT_SUCCESS 0
#define RESULT_FAILED 1
// 除法计算
// 如果计算成功,使用r返回计算结果,否则不改变r的指
// 如果计算正常,则返回RESULT_SUCCESS
// 如果出现b为0,则返回RESULT_FAILED
// 如果除不尽,则返回RESULT_FAILED
int div(int a,int b, int* r);
#endif
除法API实现:div.cpp
#include "div.h"
int div(int a,int b, int* r)
{
if(b==0)
{
return RESULT_FAILED;
}
int rem = a%b;
if(rem!=0)
{
return RESULT_FAILED;
}
*r = a/b;
return RESULT_SUCCESS;
}
使用单元测试工具对API测试
使用tiny_unit_test.h的测试宏为除法API做单元测试:test_div.cpp
#include <stdio.h>
#include <stdlib.h>
#include "tiny_unit_test.h"
#include "div.h"
int test_div()
{
int result=0;
int ret=RESULT_FAILED;
printf("->测试相同的数相除\n");
ret = div(-100,-100,&result);
tut_assert(ret==RESULT_SUCCESS);
tut_assert(result==1);
printf("->测试0除任何数\n");
ret = div(0,1,&result);
tut_assert(ret==RESULT_SUCCESS);
tut_assert(result==0);
printf("->测试被除数为0\n");
ret = div(20,0,&result);
tut_assert(ret==RESULT_FAILED);
printf("->测试除不尽的情况\n");
ret = div(10,7,&result);
tut_assert(ret==RESULT_FAILED);
//下面的语句将触发单元测试失败
tut_assert(result==1);
return 0;
}
// 本文件只做单元测试程序
// 用以测试目标API,此处指div
// 应用程序请另写
int main(int argc,char** argv)
{
if(test_div()==0)
{
printf("成功,除法单元测试通过。");
}
else
{
printf("错误,除法单元测试未通过。");
}
system("pause");
return 0;
}
编译,并运行单元测试程序(注意,应用程序请另外写,单元测试程序只是用来做API的测试)