CUnit用法总结

2023-11-06

简介

CUnit是一个用C语言写的单元测试库,它是一个简单的测试框架,提供了丰富的断言语句来测试常用的数据类型,此外,对于跑测试用例和反馈测试结果,CUnit都有一些不同的接口,它可以编译成动态库或者静态库。

基本框架

CUnit是一个可以跨平台的框架。它只有一个Test Registry, 一次测试(Test Registry)可以运行多个测试包(Test Suite),而每个测试包可以包括多个测试用例(Test Case),每个测试用例又包含一个或者多个断言类的语句。如下图所示
这里写图片描述

基本流程

1)准备好你要测试的函数
2)初始化test注册函数:CU_initialize_registry()
3)添加测试包:CU_add_suite()
4)添加测试用例:CU_add_test()
5)运行测试用例:比如,CU_console_run_tests
6)清除test注册资源:CU_cleanup_registry

测试函数说明(下面CUnit自带的说明)

int maxi(int i1, int i2)
{
  return (i1 > i2) ? i1 : i2;
}

void test_maxi(void)
{
  CU_ASSERT(maxi(0,2) == 2);
  CU_ASSERT(maxi(0,-2) == 0);
  CU_ASSERT(maxi(2,2) == 2);
}
从上面可以看出,我们可以直接用CU_ASSERT这个宏来测试你的函数

demo(下面这个demo是自己写的,用来测试我的链表初始化函数)

    INT32 cunit_link_list_init(void)
    {
        return 0;
    }

    INT32 cunit_link_list_cleanup(void)
    {
        return 0;
    }

    /*********************************************
    ***
    *** Test Func : link_list_is_empty
    ***
    *********************************************/
    void link_list_test_case1(void)
    {
        BOOL retValue, expectValue;

        LINK_LIST_T pList = link_list_init();

        retValue = link_list_is_empty(pList);
        expectValue = TRUE;

        CU_ASSERT(retValue == expectValue);
    }

    void link_list_test_case2(void)
    {
        BOOL retValue, expectValue;

        LINK_LIST_T pList = link_list_init();
        link_list_insert_at_tail(1, pList);

        retValue = link_list_is_empty(pList);
        expectValue = TRUE;    

        CU_ASSERT(retValue == expectValue);
    }

    // test cases
    CU_TestInfo link_list_test_case[] = {
        {"link_list_is_empty_case1", link_list_test_case1},
        {"link_list_is_empty_case2", link_list_test_case2},  
        CU_TEST_INFO_NULL,
    };

    // suite
    CU_SuiteInfo suites[] = 
    {
        { "Test For Linked List", cunit_link_list_init, cunit_link_list_cleanup, NULL, NULL, link_list_test_case },
        CU_SUITE_INFO_NULL,
    };


    int cunit_test_main(void)
    {
        if(CUE_SUCCESS != CU_initialize_registry())
        {
            printf("<CUnit Test> CU_initialize_registry fail!!!\n");
            return CU_get_error();
        }

        if(CUE_SUCCESS != CU_register_suites(suites)) 
        {
            printf("<CUnit Test> CU_register_suites fail!!!\n");
            CU_cleanup_registry();
            return CU_get_error();
        }    

    #if 0
        //output file.xml
        CU_set_output_filename("link_list_test_result");
        CU_automated_run_tests();
    #endif

        CU_basic_set_mode(CU_BRM_VERBOSE);
        CU_basic_run_tests();

        CU_cleanup_registry();

        return CU_get_error();
    }

运行结果如下
这里写图片描述

测试的结果一目了然,很方便。当然如果你觉得这样的输出结果还不够美观,那也可以用xml的方式去查看,如下图
这里写图片描述
要想生成XML文件,需要将上面代码注释的内容打开,也即是添加下面两行代码

    CU_set_output_filename("link_list_test_result");
    CU_automated_run_tests();

生成完XML文件之后,然后再将CUnit-List.dtd、CUnit-List.xsl、CUnit-Run.dtd、CUnit-Run.xsl(这几个文件在CUnit的源码包可以找到)和XML文件放到同一级目录,再用IE浏览器打开,就可以看到像上面的UI界面了。

PS:关于CUnit的安装说明请参考下面这篇文章
Ubuntu 14.04 安装CUnit

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUnit用法总结 的相关文章

  • 如何重命名 .tar.gz 文件而不提取内容并在 UBUNTU 中创建新的 .tar.gz 文件?

    我有一个命令将创建一个新的 tar gz现有文件中的文件 sudo tar zcvf Existing tar gz New tar gz 该命令将创建一个新的New tar gz从现有的文件Existing tar gz file 谁能告
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • Python将文件从Linux复制到WIndows

    我正在构建一个网站 该网站有一个表单 可以捕获用户数据并在用户数据上运行一些cgi cgi 的第一步是需要将文件从 Linux Web 服务器复制到 Windows 计算机 服务器将使用 Active Directory 角色帐户作为复制凭
  • 裸机交叉编译器输入

    裸机交叉编译器的输入限制是什么 比如它不编译带有指针或 malloc 的程序 或者任何需要比底层硬件更多的东西 以及如何才能找到这些限制 我还想问 我为目标 mips 构建了一个交叉编译器 我需要使用这个交叉编译器创建一个 mips 可执行
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • 为什么使用signalfd无法捕获SIGSEGV?

    我的系统是ubuntu 12 04 我将示例修改为man 2 signalfd 并添加sigaddset mask SIGSEGV 在示例中 但我无法得到输出SIGSEGV被生成 这是一个错误吗glibc 源代码片段如下 sigemptys
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • BeagleBone Black 如何用作大容量存储设备?

    是否可以使用 BB 作为大容量存储设备 我希望将其连接到可以从 USB 连接 例如 USB 闪存驱动器 读取文件的音频播放器并充当包含一个特定文件夹的数据存储设备 及其子文件夹 从文件系统 如果可能 在连接到开发板的闪存驱动器上 正如设备规

随机推荐

  • 物业小区管理系统登录页面以及逻辑实现

    学习vue3和springboot那肯定是少不了写项目的 在各个项目中肯定是离不开登录和注册的事情的 这也是一个项目起步的需求 接下来我们来看看我们所写的项目起步 首先搭建vue3和springboot的项目环境 这些搭建大家自行完成即可
  • 《Centos7——实战-完全备份和增量备份》

    目录 完全备份和增量备份 1 需要开启log bin日志 2 增量和全备脚本 3 计划任务 模拟数据丢失 1 新增数据 2 数据备份 3 删除数据 4 数据的恢复 完全备份和增量备份 一般都三种备份种类 完全备份 差异备份 增量备份 完全备
  • Android中的延时工作队列——WorkQueue教程

    Android中的延时工作队列 WorkQueue教程 工作队列是Android开发中常用的一种机制 它允许我们按照一定的顺序和延时执行任务 在本教程中 我们将介绍如何使用Android的WorkQueue来创建延时工作队列 并提供相应的源
  • 云计算————系统部署

    云计算基础篇 前言 云计算 cloud computing 是基于互联网的相关服务的增加 使用和交付模式 通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源 云是网络 互联网的一种比喻说法 过去在图中往往用云来表示电信网 后来也用来表示
  • hibernate的insert数据正常,但是update数据乱码问题解决

    在做项目是发现 hibernate的insert数据正常 但是update数据是却出现乱码 解决办法 在tomcat的conf server xml中找到下面代码的位置
  • Java JUnit 单元测试小结

    测试类型 单元测试 Unit test 单元测试关注单一的类 它们存在的目的是检查这个类中的代码是否按照期望正确运行 集成测试 Integration test 集成测试是检查开发的模块和其他模块整合时是否正常工作 虽然集成测试的代码影响范
  • 【JavaScript基础】你真正了解如今的Js数组吗,看这篇就(Go)够了

    JavaScript基础 你真正了解如今的Js数组吗 看这篇就 Go 够了 博客说明 文章所涉及的部分资料来自互联网整理 当然还有自己个人的总结和看法 分享的目的在于共建社区和巩固自己 引用的资料如有侵权 请联系本人删除 幸好我在 感谢你来
  • 虚拟化原理之KVM

    2 1 kvm技术基础 KVM kernel based virtual machine 的名字 基于kernel的虚拟机 已经很准确的说出了kvm的设计思路 也就是依赖linux内核 完全利用linux内核来实现cpu的调度 内存管理的功
  • laravel 简介

    Laravel是一款基于MVC设计模式的PHP框架 提供了一系列便捷的API接口 包括数据库 路由 表单验证等等 使PHP开发更为快速和优雅 一言以蔽 Laravel为WEB艺术家而生 1 安装 先保证你已经安装好了PHP 接下来 你可以直
  • 调试osgEarth(三十三)分页瓦片卸载器子节点的作用--(3)渲染遍历的帧号和时间设置-TerrainCuller类 的构造函数--visitorData

    继续调试 每天调试一点点 又不累 又能够细品 这里似乎是存储visitorData临时数据的东东 很明显 这个为空 返回false isSpy false 也就是说visitorData的 dataStore里面的 table里面不存在cu
  • 毕设:基于CNN卷积神经网络的猫狗识别、狗品种识别(Tensorflow、Keras、Kaggle竞赛)

    基于卷积神经网络的图像识别算法及其应用研究 毕业快一年了 拿出来分享给大家 我和网上唯一的区别就是 我能够同时实现两个方案 猫狗识别和狗品种识别 我当时也是网上各种查 花了2 3个月的时间 一个萝卜一个坑走过来的 深度学习真的是深似海呀 不
  • 梅森素数(C语言求解)

    梅森数 Mersenne Prime 指的是形如 1的正整数 其中指数 n 是素数 如果一个梅森数是素数 则称其为梅森素数 另外 由因式分解法可以证明 如果 1 是素数 则 n 也一定是素数 例如 当 n 2 3 5 7 时 1 都是素数
  • 基于径向基神经网络RBF多输入多输出预测,RBF多变量回归预测,matlab代码。评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据 xlsx 数据分析 num size 0 8 训练集占数据集比例 ou
  • AI新阶段:认知智能加速工业制造智能转型

    作者 工业互联网周刊 周宝冰 伴随全球数字化进程加快 人工智能技术与产业融合程度逐渐加深 能思考 会判断 的认知智能技术逐步应用于智能客服 智能推荐 智能营销 智能分析等诸多场景 不断释放产业应用价值 近期 华院计算技术 上海 股份有限公司
  • Centos 7安装Harbor

    Harbor 对于docker版本及docker compose版本有要求 根据需要安装 一 Docker搭建 安装最新版 1 安装docker wget qO https get docker com sh 2 配置加速器 cd etc
  • 关于脚本中使用nohup启动项目的问题

    1 在Jenkins中配置了sh home dubbo service bin start sh 使用以下脚本 usr bin env bash 省略 nohup java JAVA OPTS JAVA MEM OPTS JAVA DEBU
  • 小程序中关于红包雨的实现

    一 原型依据 在我这个项目中小程序端所需要实现的只有红包雨的下落动画和通屏背景图的兼容 关于红包点击金额的计算是由后端实现的 首先来看下需要实现的效果图 二 实现代码 首先是第一次进入的页面 在这个页面的时候会进行静默登录 静默登录成功的话
  • webpack : 无法加载文件 C:\Program Files\nodejs\webpack.ps1

    webpack 无法加载文件 C Program Files nodejs webpack ps1 1 问题 2 解决办法 1 问题 使用webpack打包是报错如下 webpack 无法加载文件 C Program Files nodej
  • LINUX系统下:Cuda+Cudnn+Tensorflow-GPU环境配置学习总结

    1 cuda cudnn安装 1 1下载cuda 1 1 1查看系统支持的cuda版本 可以安装低于该版本的 不能超过该版本 nvidia smi 1 1 2下载cuda cuda历史版下载 1 2 3安装 1 找到下载的cuda文件所在的
  • CUnit用法总结

    简介 CUnit是一个用C语言写的单元测试库 它是一个简单的测试框架 提供了丰富的断言语句来测试常用的数据类型 此外 对于跑测试用例和反馈测试结果 CUnit都有一些不同的接口 它可以编译成动态库或者静态库 基本框架 CUnit是一个可以跨