C语言单元测试框架——CUnit

文章目录

  • C语言单元测试框架——CUnit
    • 1、CUnit简介
    • 2、CUnit安装
      • 2.1、安装配置——Ubuntu
      • 2.2、安装步骤
      • 2.3、安装文件
    • 3、CUnit使用介绍
      • 3.1、输出方式
      • 3.2、输出方式对应的接口函数
      • 3.3、测试函数的书写
      • 3.4、CUnit 断言
    • 4、CUnit使用实例

1、CUnit简介

CUnit 是一个通过 C 语言编写的用于编写、管理和执行单元测试用例的C语言单元测试框架。

它往往被编成库的形式(静态库或动态库)提供给用户测试代码进行使用,用户编写程序的时候直接链接此静态库就可以了。

它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句支持。
CUnit是平台无关的框架与各种用户接口的组合。核心框架为管理测试注册表,套件和测试用例提供了基本支持。用户接口便于与框架交互以运行测试和查看结果。CUnit的组织结构与传统的单元测试框架类似:
单独的测试用例(Test)被打包到套件(Suite)中,这些套件又被注册到活动测试注册表(Test Registry)里。每个套件都有自己的构造和析构函数,这两个函数将在运行套件测试之前和之后被自动调用。注册表中的所有套件/测试用例,可以通过调用一个函数执行全部测试,也可以有选择性地执行部分测试。

2、CUnit安装

  • CUnit的首页

  • CUnit 的文档手册地址

  • 中文翻译版

  • CUnit 2-1-3下载地址

2.1、安装配置——Ubuntu

软件源中与CUnit相关的包有:

libcunit1 libcunit1-dev libcunit1-doc libcunit1-ncurses libcunit1-ncurses-dev

使用apt-get install安装即可。

2.2、安装步骤

tar -jxvf CUnit-2.1-3.tar.bz2
cd CUnit-2.1-3
libtoolize -f -c -i
aclocal
autoconf
autoheader
automake
chmod u+x configure
./configure –prefix=/opt/cunit
make
make install

2.3、安装文件

cunit安装成功后会生成4个文件夹:doc、include、lib、share

  • doc目录是一些简介以及使用说明。
  • includelib目录中是我们需要的头文件以及库文件。
  • share目录中有Automated模式下需要的文件。

3、CUnit使用介绍

3.1、输出方式

接口 平台 描述
Automated All 非交互式,输出XML文件
Basic All 非交互式,可选输出到stdout
Console All 控制台交互方式,在用户控制下运行
Curses Linux/Unix Curses交互方式(图形界面),在用户控制下运行

如上边所示,后两种主要是interactive的接口,就是我们可以交互式地指定参数,然后观察结果。在我们具体的环境下,我们通常使用上面两种接口,第一种是将结果输出到XML文档中,便于我们生成报告。第二种仅仅是每一次运行结束之后,在standard output中显示,不能保留测试结果数据。

我们可以将前两种输出结合起来,自己测试的时候,使用Basic模式,生成报告的时候,使用Automated模式。

注:在Curse输出模式下需要联接 -lncurses

3.2、输出方式对应的接口函数

模式 使用的接口函数
Basic #include "CUnit/Basic.h"
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();
Automated #include "CUnit/Automated.h"
CU_list_tests_to_file();
CU_automated_run_tests();
Console #include "CUnit/Console.h"
CU_console_run_tests();
Curses #include "CUnit/CUCurses.h"
CU_curses_run_tests();

配置使用Basic模式,运行的结果如下。

配置使用Automated模式,重新编译运行后会生成CUnitAutomated-Listing.xmlCUnitAutomated-Results.xml两个文件。文件名是在不设定的情况下,使用默认文件名。

把项目生成的CUnitAutomated-Listing.xmlCUnitAutomated-Results.xml,与CUnit安装目录下的CUnit-List.dtdCUnit-List.xslCUnit-Run.dtdCUnit-Run.xsl,共六个文件,放到一个文件夹下,拷贝到window系统下,使用IE浏览器打开。

注意,要用IE浏览器进行打开,谷歌浏览器和狐火浏览器都无法正确打开。

TestMax-Results.xml

TestMax-Listing.xml

3.3、测试函数的书写

1) 首先针对被测试的函数书写测试函数。

2) 初始化一个Registry。

3) 将特定的Suite加入到这个Registry中。可以为Suite指定初始化函数和清理函数。

4) 将测试函数加入到一个Suite中,这样,如果该测试函数的运行需要一些初始化条件,那么可以可以将代码加入到Suite的初始化函数中,当然不要忘记最后还要做对应的清理操作。

5) 使用相应的接口将测试结果输出。

6) 最后,清理Registry。

3.4、CUnit 断言

CUnit提供了大量的预定义的断言,针对几乎所有的C的标准类型,我们可以针对具体的需要检查的参数的类型进行选择。

CUnit 对断言定义如下:

断言 描述
CU_ASSERT (int expression)
CU_ASSERT_FATAL (int expression)
CU_TEST (int expression)
CU_TEST_FATAL (int expression)
断言表达 expression 是 CU_TRUE(非零)
CU_ASSERT_TRUE (value)
CU_ASSERT_TRUE_FATAL (value)
断言值 value 是 CU_TRUE(非零)
CU_ASSERT_FALSE (value)
CU_ASSERT_FALSE_FATAL (value)
断言值 value 是 CU_FALSE(零)
CU_ASSERT_EQUAL (actual, expected)
CU_ASSERT_EQUAL_FATAL (actual, expected)
断言 actual (实际) == expected (预期)
CU_ASSERT_NOT_EQUAL(actual, expected)
CU_ASSERT_NOT_EQUAL_FATAL (actual,expected)
断言 actual (实际) != expected(预期)
CU_ASSERT_PTR_EQUAL (actual, expected)
CU_ASSERT_PTR_EQUAL_FATAL (actual,expected)
断言 指针 actual(实际) == expected (预期)
CU_ASSERT_PTR_NOT_EQUAL (actual,expected)
CU_ASSERT_PTR_NOT_EQUAL_FATAL (actual, expected)
断言 指针 actual(实际) != expected (预期)
CU_ASSERT_PTR_NULL (value)
CU_ASSERT_PTR_NULL_FATAL (value)
断言 指针 value == NULL
CU_ASSERT_PTR_NOT_NULL (value)
CU_ASSERT_PTR_NOT_NULL_FATAL (value)
断言 指针 value != NULL
CU_ASSERT_STRING_EQUAL (actual,expected)
CU_ASSERT_STRING_EQUAL_FATAL (actual, expected)
断言的实际和预期的字符串是等价的
strcmp
CU_ASSERT_STRING_NOT_EQUAL
(actual,expected)
CU_ASSERT_STRING_NOT_EQUAL_FATAL
(actual, expected)
断言字符串的实际和预期不同
CU_ASSERT_NSTRING_EQUAL (actual,expected, count)
CU_ASSERT_NSTRING_EQUAL_FATAL
(actual, expected, count)
断言的实际和预期的前count个字符是相同的
strncmp
CU_ASSERT_NSTRING_NOT_EQUAL
(actual,expected, count)
CU_ASSERT_NSTRING_NOT_EQUAL_FATAL
(actual, expected, count)
断言前count个字符的实际和预期的不同
CU_ASSERT_DOUBLE_EQUAL
(actual,expected, granularity)
CU_ASSERT_DOUBLE_EQUAL_FATAL
(actual, expected, granularity)
Assert that fabs(actual - expected) <= fabs(granularity)
Math library must be linked in for this assertion
CU_ASSERT_DOUBLE_NOT_EQUAL
(actual,expected, granularity)
CU_ASSERT_DOUBLE_NOT_EQUAL_FATAL
(actual, expected, granularity)
Assert that fabs(actual - expected) >fabs(granularity)
Math library must be linked in for this assertion
CU_PASS (message) 注册一个指定的通过断言的消息。不可进行逻辑测试。
CU_FAIL (message)
CU_FAIL_FATAL (message)
注册一个指定的失败断言的消息。不可进行逻辑测试。

可以看到,每一种类型的断言都有FATAL和非FATAL两个函数,他们的区别是,非FATAL断言失败的时候,程序继续运行,而FATAL类型的断言失败之后,程序马上中止。通常我们使用非FATAL就可以了。

注意在我们的程序中,需要对返回值,out参数进行判断,对于是否是预想结果的判断的时候,一定要使用断言,而不要使用printf等等函数,一方面printf缺乏灵活性,另一方面,只有使用断言,结果报告中才会有对应的输出项。

CU_PASSCU_FAIL这两个断言比较特殊,它们仅仅表示测试程序运行到了这个地方。比如,在某些测试函数中,被测试的函数没有任何返回值等,我们为了证明这个函数已经被运行到了,我们使用以上两个函数。它们仅仅打印出一条消息,代表执行过。还有就是,它们也被输出。

4、CUnit使用实例

#include <signal.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include <CUnit/Automated.h>
#include <CUnit/Basic.h>
#include <CUnit/CUnit.h>
#include <CUnit/Console.h>
#include <CUnit/TestDB.h>
#include <assert.h>int suite_success_init(void){return 0;
}int suite_success_clean(void){return 0;
}
void test_fun1(void){//测试函数编写
}
void test_fun2(void){//测试函数编写
}
CU_TestInfo test_cases1[] = {{"test1", test_fun1}, {"test2", test_fun2},CU_TEST_INFO_NULL
};
CU_TestInfo test_cases2[] = {CU_TEST_INFO_NULL
};CU_SuiteInfo suites[] = {{"test_cases1:", suite_success_init, suite_success_clean, NULL, NULL, test_cases1},{"test_cases2:", suite_success_init, suite_success_clean, NULL, NULL, test_cases2},CU_SUITE_INFO_NULL
};int main(int argc, char **argv)
{if (CU_initialize_registry()) {fprintf(stderr, " Initialization of Test Registry failed. ");exit(EXIT_FAILURE);} else {assert(NULL != CU_get_registry());assert(!CU_is_test_running());if (CUE_SUCCESS != CU_register_suites(suites)) {exit(EXIT_FAILURE);}
#if 0/**** Automated Mode *****************/CU_set_output_filename("TestMax");CU_automated_run_tests();CU_list_tests_to_file();
#else//***** Basice Mode *******************CU_basic_set_mode(CU_BRM_VERBOSE);CU_basic_run_tests();
#endifCU_cleanup_registry();return CU_get_error();}return 0;
}

makefile

all:gcc -o test testcase.c -I./include -L./lib -lcunit

C语言单元测试框架——CUnit相关推荐

  1. C语言单元测试框架——CUnit 安装(windows和Linux)及使用

    目录 CUnit CUnit Windows 安装 CUnit Linux(Ubuntu) 安装 一键把cunit测试结果(Basic)和gcov覆盖率结果合并 gcov python代码 bat代码 ...

  2. c语言语法sc,适合于嵌入式系统的C语言单元测试框架:SCUNIT

    说明 主流语言都有测试框架,在嵌入式领域特别是资源紧缺的单片机工程中没有合适的测试框架.本文发布一种简单的C语言测试框架SCUNIT,可以应用于嵌入式领域. 测试环境 本框架是基于标准C语言编写,对平 ...

  3. C语言单元测试框架详解:第一篇

    目录 一.单元测试定义 二.C语言单元测试框架汇总 三.C语言测试推荐书籍 一.单元测试定义 单元测试是指对软件中的最小可测试单元进行检查和验证,如C语言中单元指一个函数,Java里单元指一个类.单元 ...

  4. c语言的自动测试工具,C语言单元测试框架--check工具

    C语言单元测试框架--check工具 虽然在UNIX上用C语言做开发已经有一段时间了,但是我不得不承认,自己单元测试做的并不好.恰好最近有新的开发任务,就学习了一些关于测试驱动开发的知识,准备改进自己 ...

  5. 【嵌入式单元测试】C语言单元测试框架搭建

    cmocka cmocka交叉编译 源码下载 编译准备 源码修改 指定编译器 编译 cmocka使用示例 常见问题 参考 单元测试框架是一个软件包,它能够让开发者比较方便的表达产品代码需要表现出什么样 ...

  6. c语言测试框架设计,C语言单元测试框架Check

    什么是Check Check是C语言的一个单元测试框架.它提供一个小巧的单元测试接口.测试案例运行在各自独立的地址空间,所以断言失败和代码错误造成的段错误或者其他的信号可以被捕捉到.另外,测试的结果显 ...

  7. C语言单元测试框架unit的使用

    针对C语言的测试框架相比其他语言要少一些,本文简单介绍一下Cunit框架的基本使用方法,权当备忘吧.Cunit的组织框架如下图所示: 将单个测试用例打包到一个suite中,这些suite在Regist ...

  8. c语言单元测试(cunit)打桩,如何写打桩文件

    /*** COPYRIGHT NOTICE* Copyright (c) 2010,* ALL rights reserved.**@file stub_test.c*本文件定义了malloc() r ...

  9. C语言单元测试框架-cmocka示例

    #include <cmocka.h> //Google自动化测试static void test_1(void **state) {//code }static void test_2( ...

最新文章

  1. 将ubuntu系统设置静态ip及ssh
  2. 理解JSON.stringify()高级用法
  3. 一元建站-基于函数计算 wordpress 构建 serverless 网站
  4. php获取微信收款记录,微信公众号开发之微信支付代码记录的实现
  5. SAP Spartacus Sample Data Extension
  6. java 输出编码_从代码看java输入输出中的编码和解码
  7. VMware Workstation 12新建虚拟机
  8. 学习笔记之数据可视化(二)——页面布局(上)
  9. 常见条码及其相关概念简介
  10. 【渝粤教育】电大中专电商运营实操 (5)作业 题库
  11. 苹果安卓最新看片神器各种实用功能,帮你一年省下上千块!
  12. 必装 6 款超神的 GitHub 插件
  13. html左侧浮动广告代码,纯js网页浮动广告代码
  14. vscode通过ssh远程连接服务器
  15. 【在线学习版】欢迎使用Markdown编辑器(可以多开网页看着编辑)
  16. linux设置法语键盘布局,法语键盘布局图;
  17. iis aspnet_iisreg.exe 0x8007000B
  18. Tomcat-幽灵猫GhostCat漏洞复现
  19. 和菜鸟一起学产品之交互式设计
  20. 对3D体感试衣镜的看法

热门文章

  1. Android给图片加水印
  2. excel如何把多张表合并成一个表_如何将多个excel文件合并成一个文件-多个excel文件合并成一个excel表的方法 - 河东软件园...
  3. Win10系统补丁卸载工具
  4. sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表
  5. 报错package xxx is not in GOROOT or GOPATH 或者 cannot find package “xxx“ in any of
  6. CQUPT WEEKLY TRAINING (3)解题报告
  7. flume采集数据到hdfs
  8. 使用Pyqt5制作IT7321仪器测试软件
  9. 基于TIA博途的一阶滞后滤波+中位值滤波+堆栈平均值滤波算法SCL语言程序(封装FB库)
  10. css两个冒号什么意思