unitest.h

/******************************************************************************
* *
* This program is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
* or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed *
* under the GNU Lesser General Public License Version 3, 29 June 2007. *
* The complete license can be accessed from the following location: *
* http://opensource.org/licenses/lgpl-3.0.html *
* *
* Author: Yun Li (yunli.open@gmail.com) *
* Date: 03/06/2010 *
* Author: Gavin Ding (gavin_ding@sina.cn / fanfan.ding.ict@gmail.com) *
* Date: 07/07/2013 *
******************************************************************************/ /******************************************************************************
REVISION HISTORY
================ Date Version Name Description
---------- ------------ ---------------- --------------------------------
03/17/2013 V001.000.000 Gavin Ding rewrite this file
---------- ------------ ---------------- -------------------------------- Date Version Name Description
---------- ------------ ---------------- --------------------------------
07/07/2013 V001.001.000 Gavin Ding make it more useful
---------- ------------ ---------------- -------------------------------- ******************************************************************************/ #ifndef __UNITEST_H
#define __UNITEST_H #include <stdio.h>
#include <string.h> static int g_case_total = 0;
static int g_case_succeeded = 0;
static int g_case_failed = 0; #ifndef NULL
#define NULL ((void*)0)
#endif #define INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, _oper) \
printf(" Expected: \""#_a"\" "#_oper" \""#_b"\"\n Result: Succeeded\n")
#define INTERNAL_USE_ONLY_FAILED(_a, _b, _oper) \
printf(" Expected: \""#_a"\" "#_oper" \""#_b"\"\n (X) Result: Failed\n")
#define INTERNAL_USE_ONLY_CASE_SHOW() \
printf("Case %d =====>\n", g_case_total); \
printf(" Location: %s:%d\n", __FILE__, __LINE__); \ #define UNITEST_ERROR(_string) do { \
printf("Error: "#_string"\n"); \
return -1;\
} while (0) #define UNITEST_EQUALS(_a, _b) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ((_a) == (_b)) { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, ==); \
g_case_succeeded++; \
} \
else { \
INTERNAL_USE_ONLY_FAILED(_a, _b, ==); \
g_case_failed++; \
} \
printf("\n"); \
} while (0) #define UNITEST_DIFFERS(_a, _b) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ((_a) == (_b)) { \
INTERNAL_USE_ONLY_FAILED(_a, _b, !=); \
g_case_failed++; \
} \
else { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, !=); \
g_case_succeeded++; \
} \
printf("\n"); \
} while (0) #define UNITEST_LESS_THAN(_a, _b) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ((_a) < (_b)) { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, <); \
g_case_succeeded ++; \
} \
else { \
INTERNAL_USE_ONLY_FAILED(_a, _b, <); \
g_case_failed++; \
} \
printf("\n"); \
} while (0) #define UNITEST_LESS_THAN_EQUALS(_a, _b) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ((_a) <= (_b)) { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, <=); \
g_case_succeeded++; \
} \
else { \
INTERNAL_USE_ONLY_FAILED(_a, _b, <=); \
g_case_failed++; \
} \
printf("\n"); \
} while (0) #define UNITEST_GREATER_THAN(_a, _b) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ((_a) > (_b)) { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, >); \
g_case_succeeded++; \
} \
else { \
INTERNAL_USE_ONLY_FAILED(_a, _b, >); \
g_case_failed++; \
} \
printf("\n"); \
} while (0) #define UNITEST_GREATER_THAN_EQUALS(_a, _b) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ((_a) >= (_b)) { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, >=); \
g_case_succeeded++; \
} \
else { \
INTERNAL_USE_ONLY_FAILED(_a, _b, >=); \
g_case_failed++; \
} \
printf("\n"); \
} while (0) #define UNITEST_STR_EQUALS(_a, _b) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ( NULL == (_a) || NULL == (_b) ) { \
UNITEST_ERROR(ptr should not be NULL); \
} \
if ( !strcmp((_a), (_b)) ) { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, ==); \
g_case_succeeded++; \
} \
else { \
INTERNAL_USE_ONLY_FAILED(_a, _b, ==); \
g_case_failed++; \
} \
printf("\n"); \
} while (0) #define UNITEST_STR_DIFFERS(_a, _b) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ( NULL == (_a) || NULL == (_b) ) { \
UNITEST_ERROR(ptr should not be NULL); \
} \
if ( !strcmp((_a), (_b)) ) { \
INTERNAL_USE_ONLY_FAILED(_a, _b, !=); \
g_case_failed++; \
} \
else { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, !=); \
g_case_succeeded++; \
} \
printf("\n"); \
} while (0) #define UNITEST_MEM_EQUALS(_a, _b, _len) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ( NULL == (_a) || NULL == (_b) ) { \
UNITEST_ERROR(ptr should not be NULL); \
} \
if ( (_len) <= 0 ) { \
UNITEST_ERROR(mem len should be positive); \
} \
if ( !memcmp((void*)(_a),(void*)(_b), (int)(_len)) ) { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, ==); \
g_case_succeeded++; \
} \
else { \
INTERNAL_USE_ONLY_FAILED(_a, _b, ==); \
g_case_failed++; \
} \
printf("\n"); \
} while (0) #define UNITEST_MEM_DIFFERS(_a, _b, _len) do { \
g_case_total++; \
INTERNAL_USE_ONLY_CASE_SHOW(); \
if ( NULL == (_a) || NULL == (_b) ) { \
UNITEST_ERROR(ptr should not be NULL); \
} \
if ( (_len) <= 0 ) { \
UNITEST_ERROR(mem len should be positive); \
} \
if ( !memcmp((void*)(_a), (void*)(_b), (int)(_len)) ) { \
INTERNAL_USE_ONLY_FAILED(_a, _b, !=); \
g_case_failed++; \
} \
else { \
INTERNAL_USE_ONLY_SUCCEEDED(_a, _b, !=); \
g_case_succeeded++; \
} \
printf("\n"); \
} while (0) static void unitest_bar()
{
printf("********************************************************\n");
printf("* Unit Test *\n");
printf("********************************************************\n");
printf("\n");
} static int unitest_report()
{
printf("\n");
printf("********************************************************\n");
printf("* Test Report *\n");
printf("********************************************************\n"); if (0 == g_case_total) {
printf("No test case is run\n");
goto pass;
}
printf(" Total: %d\n", g_case_total);
printf("Succeeded: %d (%d%%)\n", g_case_succeeded, g_case_succeeded * 100 / g_case_total);
printf("********************************************************\n");
printf("\n"); if (g_case_total != g_case_succeeded) {
printf("\n");
printf(":-( Failed\n");
printf("\n");
return -1;
} pass:
printf("\n");
printf(":-) Passed\n");
printf("\n"); return 0;
} #ifndef HAVE_MAIN
extern int unitest_main(int _argc, char *_argv[]); int main(int _argc, char *_argv[])
{
unitest_bar();
unitest_main(_argc, _argv);
return unitest_report();
}
#endif /* end of HAVE_MAIN */ #endif /* end of __UNITEST_H */

unitest_demo.c

/******************************************************************************
* *
* This program is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
* or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed *
* under the GNU Lesser General Public License Version 3, 29 June 2007. *
* The complete license can be accessed from the following location: *
* http://opensource.org/licenses/lgpl-3.0.html *
* *
* Author: Gavin Ding (gavin_ding@sina.cn / fanfan.ding.ict@gmail.com) *
* Date: 07/07/2013 *
* *
******************************************************************************/ /******************************************************************************
REVISION HISTORY
================ Date Version Name Description
-------- ------- ------------ -------------------------------------------- -------- ------- ------------ -------------------------------------------- ******************************************************************************/
#include "unitest.h"
#include <stdlib.h> #define UNUSED(param) ((param) = (param)) int unitest_main (int argc, char *argv[])
{
char *str1 = "YT";
char *str2 = "HW";
char *str3 = "HW";
void *p1 = NULL;
void *p2 = NULL; UNUSED(argc);
UNUSED(argv); UNITEST_EQUALS(87, 87); UNITEST_DIFFERS(10, 13); UNITEST_LESS_THAN(41, 70); UNITEST_LESS_THAN_EQUALS(8, 8);
UNITEST_LESS_THAN_EQUALS(7, 8); UNITEST_GREATER_THAN(70, 41); UNITEST_GREATER_THAN_EQUALS(8, 8);
UNITEST_GREATER_THAN_EQUALS(8, 7); UNITEST_STR_EQUALS(str2, str3); UNITEST_STR_DIFFERS(str1, str2); p1 = malloc(10);
memset(p1, 2, 10); p2 = malloc(10);
memset(p2, 2, 10); UNITEST_MEM_EQUALS(p1, p2, 10); memset(p2, 5, 10);
UNITEST_MEM_DIFFERS(p1, p2, 10); free(p1);
p1 = NULL; free(p2);
p2 = NULL; return 0;
}

unitest_demo.result

./unitest/unitest_demo.exe
********************************************************
* Unit Test *
******************************************************** Case 1 =====>
Location: unitest_demo.c:41
Expected: "87" == "87"
Result: Succeeded Case 2 =====>
Location: unitest_demo.c:43
Expected: "10" != "13"
Result: Succeeded Case 3 =====>
Location: unitest_demo.c:45
Expected: "41" < "70"
Result: Succeeded Case 4 =====>
Location: unitest_demo.c:47
Expected: "8" <= "8"
Result: Succeeded Case 5 =====>
Location: unitest_demo.c:48
Expected: "7" <= "8"
Result: Succeeded Case 6 =====>
Location: unitest_demo.c:50
Expected: "70" > "41"
Result: Succeeded Case 7 =====>
Location: unitest_demo.c:52
Expected: "8" >= "8"
Result: Succeeded Case 8 =====>
Location: unitest_demo.c:53
Expected: "8" >= "7"
Result: Succeeded Case 9 =====>
Location: unitest_demo.c:55
Expected: "str2" == "str3"
Result: Succeeded Case 10 =====>
Location: unitest_demo.c:57
Expected: "str1" != "str2"
Result: Succeeded Case 11 =====>
Location: unitest_demo.c:65
Expected: "p1" == "p2"
Result: Succeeded Case 12 =====>
Location: unitest_demo.c:68
Expected: "p1" != "p2"
Result: Succeeded ********************************************************
* Test Report *
********************************************************
Total: 12
Succeeded: 12 (100%)
******************************************************** :-) Passed

[置顶] C语言单元测试框架的更多相关文章

  1. C语言单元测试框架--EmbedUnit

    1.简介 Embedded Unit是个纯标准c构建的单元测试框架,主要用在嵌入式c的单体测试上,其主要特点是不依赖于任何C的标准库,所有的对象都是静态分配. 最早这个项目托管在SourceForge ...

  2. c语言单元测试框架--CuTest

    1.简介 CuTest是一款微小的C语言单元测试框,是我迄今为止见到的最简洁的测试框架之一,只有2个文件,CuTest.c和CuTest.h,全部代码加起来不到一千行.麻雀虽小,五脏俱全,测试的构建. ...

  3. [置顶] EasyMock构建单元测试

    1. 背景 单元测试作为程序的基本保障.很多时候构建测试场景是一件令人头疼的事.因为之前的单元测试都是内部代码引用的,环境自给自足.开发到了一定程度,你不得不到开始调用外部的接口来完成你的功能.而外部 ...

  4. [置顶] 轻量级语言Lua入门

    作为一个脚本爱好者,而且是脚本(Perl)起家的我,一有空就喜欢学习下这些脚本语言.据说魔兽世界.愤怒小鸟都用到了它,所以今天研究下Lua这个叫法有点奇特的脚本 [转载请注明出处:http://blo ...

  5. [置顶] CSS语言精粹

    本文主要是对CSS中一些比较重要的高级部分作了一些整理,这些内容也许不是经常使用,但是都很强大.本文将长期更新. 边框 CSS2.1 规定:元素的背景是内容.内边距和边框区的背景.设置背景颜色时是没有 ...

  6. [置顶] 滴滴插件化框架VirtualAPK原理解析(一)之插件Activity管理

    上周末,滴滴与360都开源了各自的插件化框架,VirtualAPK与RePlugin,作为一个插件化方面的狂热研究者,在周末就迫不及待的下载了Virtualapk框架来进行研究,本篇博客带来的是Vir ...

  7. [置顶] C语言学习入门

    编译文件:cc -c one.c two.c  生成.o目标文件 链接文件:cc one.o two.o     默认生成 a.out 执行文件 指定生成的可执行文件名   cc -o one one ...

  8. [置顶] C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * str); [函数说明]ato ...

  9. 编C语言单元测试框架CUnit方法库

    /*********************************************************************  * Author  : Samson  * Date   ...

随机推荐

  1. Codeforces 474F - Ant colony

    注意到每个区间生存下来的蚂蚁的长度等于区间的gcd 于是可以先预处理出区间的gcd 然后二分查找就好了 预处理gcd我这里用的是倍增法 总的时间复杂度O(NlogN) /* Cf 271F 倍增求区间 ...

  2. 第五篇、 WebSphere8.5的安装

    一.前言 WebSphere Application  Server 是IBM企业级应用服务器,与WAS6,WAS7相比较而言 WAS8发生了很大的改变,其安装介质和以前截然不同,该篇章中对于不同的安 ...

  3. [转载]ecshop 实现订单导出功能 指定订单导出 EXCEL 数据文件

    当下很多功能都觉得理所当然,但是实际作为2012年停更的ECSHOP来说,很多功能其实都是缺少的,好比今天的要说的功能 订单导出 这个功能对于现在的产品设计来说,应该属于一个比较常规的功能,但是ECS ...

  4. PHP面向对象(OOP):PHP5接口技术(interface)

    PHP与大多数面向对象编程语言一样,不支持多重继承.也就是说每个类只能继承一个父类.为了解决这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列方法.接口是一种特殊的抽象 ...

  5. MySQL查询优化:连接查询排序limit

    MySQL查询优化:连接查询排序limit(join.order by.limit语句) 2013-02-27      个评论       收藏    我要投稿   MySQL查询优化:连接查询排序 ...

  6. pycharm console 控制台乱码的解决

  7. GNU PID

    多进程编程 写在前面的话 本文主要根据本人在UNIX系统上的编程实践经验总结而成, 既做为自己在 一个时期内编程实践的部分总结, 又可成为文章发表. 对UNIX程序员初学者来 说是一个小小的经验, 仅 ...

  8. BZOJ 1023 仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回 ...

  9. Browsing History

    hdu4464:http://acm.hdu.edu.cn/showproblem.php?pid=4464 题意:就是统计n个字符串中每个字符串每个字符对印的Asci,然后输出最大的长度. 题解:水 ...

  10. Arbitrage

    Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit o ...