极简系列目录
说明:
以除法为例子做一个C的极简单元测试示例,请大家学习,tiny_unit_test.h可直接拿去用。
本次作业的功能是calc,不是div,此处拿div做例子,只是为了给大家一个最基本的单元测试示例。
Java和C#的同学们请使用那些语言的Assert之类的,例如参考这个:http://www.cnblogs.com/greyzeng/p/4439080.html
#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
#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
#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;
}
#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;
}
每种语言都有现成的单元测试框架。但是,无论你是使用那种语言,都应该首先脱离单元测试框架去理解单元测试,比如可以像本文那样自己捣鼓个简易的单元测试感受一下,然后具体使用的话,还是可以找每种语言对应的单元测试框架去用。每种语言推荐一种单元测试框架,这是因为,推荐100种是没用的,理解了并用的好,只要一种就可以用的利索。每种测试框架也只给出官方的文档,这是因为,最好的文档就是官方文档。
assert
我的理解,单元测试就是对一段代码运行时前后条件的断言
。我们都做过数学证明题,我们先假设了一个条件成立,然后基于这个假设做推导。每一行代码都有当前代码能正确执行的假设条件,如果这个假设条件不成立,则代码的运行时正确性就无法保证。单元测试就是在函数级别、类级别、模块级别分别对各个粒度假设的验证
。所以从这个角度来说,并不是有了单元测试,程序的质量就一定得到保证。而是当你的单元测试代码,能把一个函数、一个类、一个模块、一个程序的各种关键性假设
做全面覆盖的测试
,那么当所有单元测试都通过时,程序的正确性就得到了极大的保证。