C语言单元测试

C语言入门:单元测试与调试方法(一) 单元测试作为自动化测试的一部分,能够无缝融入持续集成/持续部署(CI/CD)流程,确保每次代码提交或构建时都能快速验证变更是否引入新的故障,加速反馈循环,增强团队信心。:单元测试应当是可重复执行的,即在相同条件下多次运行应得到一致结果。:单元测试强调对被测单元的隔离性测试,这不仅检验了单元本身的正确性,还揭示了模块间的接口是否清晰、是否有不必要的耦合,促进代码的模块化和可维护性。:CUnit是一个功能齐全的C语言单元测试框架,提供了丰富的断言、测试套件、测试案例组织管理功能,以及详细的测试结果报告。 阅读详情

C语言单元测试

 对于敏捷开发来说,单元测试必不可少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的C语言开发,就没有很好的工具可供使用,可以找到的有这么几个工具:

  1.  CuTest -- CuTest(Cute Test)是一个非常简单的C语言单元测试工具。在使用它的时候,只需要包含两个文件“CuTest.c CuTest.h”,然后就可以写测试用例,进行测试了。它对用例几乎没有管理功能,报表输出也非常简单,可以用来试验单元测试的基本想法。
  2. CUnit -- CUnit是一个轻型的C语言单元测试框架。它提供了设计、管理、运行测试用例的功能。它的报表功能比较强大,但是比较麻烦,更适合于较大一些的项目。
  3. Check -- 不错的工具。
    在这里(http://www.laatuk.com/tools/testing_tools.html)给出了各种软件测试工具,没事可以研究一下。

CUnit

这里主要讲CUnit在Linux平台下的应用。这里有一篇 CUnit测试工具使用 ,另一篇 C单元测试包设计与实现 讲的不错,可以看一下。CUnit的主页是 http://cunit.sourceforge.net/index.html。
CUnit以静态库的形式提供给用户使用,用户编写程序的时候直接链接此静态库就可以了。它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句支持。

CUnit基本架构

                       Test Registry
                            |
             ------------------------------
             |                            |
          Suite '1'      . . . .       Suite 'N'
             |                            |
       ---------------             ---------------
       |             |             |             |
    Test '11' ... Test '1M'     Test 'N1' ... Test 'NM'

一次测试(Test Registry)可以运行多个测试包(Test Suite),而每个测试包可以包括多个测试用例(Test Case),每个测试用例又包含一个或者多个断言类的语句。具体到程序的结构上,一次测试下辖多个Test Suite,它对应于程序中各个独立模块;一个Suite管理多个Test Case,它对应于模块内部函数实现。每个Suite可以含有setup和teardown函数,分别在执行suite的前后调用。

CUnit测试模式

CUnit使用四种不同的接口,供用户来运行测试和汇报测试结果:

  1. 自动输出到XML文件,     非交互式
  2. 基本扩展编程方式,        非交互式
  3. 控制台方式,              交互式
  4. Curses图形接口,          交互式

注意1和2是非交互式的,4只能在Unix下使用,常用console,而且console是可以人机交互的。

CUnit测试流程

使用CUnit进行测试的基本流程如下所示:

  1. 书写代测试的函数(如果必要,需要写suite的init/cleanup函数)
  2. 初始化Test Registry - CU_initialize_registry()
  3. 把测试包(Test Suites)加入到Test Registry - CU_add_suite()
  4. 加入测试用例(Test Case)到测试包当中 - CU_add_test()
  5. 使用适当的接口来运行测试测试程序,例如 CU_console_run_tests()
  6. 清除Test Registry - CU_cleanup_registry()

CUnit使用范例

CUnit的在线文档是 http://cunit.sourceforge.net/doc/index.html ,上面有着详细的论述。这里以使用自动产生XML文件的接口为例,讲述CUnit-2.1-0在Linux平台下的使用。
我要测试的是整数求最大值的函数maxi,我使用如下文件组织结构:

  1. func.c :定义maxi()函数
  2. test_func.c :定义测试用例和测试包
  3. run_test.c :调用CUnit的Automated接口运行测试
  4. Makefile :生成测试程序。

这样组织的好处是,我们可以把各个功能分离,当要改变待测试函数的定义的时候,我们只需要修改func.c,而要增减、修改测试用例,只修改test_func.c就可以了,要使用CUnit提供的别的API,那就修改run_test.c。

它们的内容分别如下所示:

1) func.c

/**
 * file: func.c
 *
*/


int  maxi( int  i,  int  j)
{
        
//return i>j?i:j;
        return i;
}

2) test_func.c

/**
 * file: test_func.c
 *
*/

#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< assert.h >
#include 
" CUnit/CUnit.h "
#include 
" CUnit/Automated.h "  

/*---- functions to be tested ------*/
extern   int  maxi( int  i,  int  j); 

/*---- test cases ------------------*/
void  testIQJ()
{
        CU_ASSERT_EQUAL(maxi(
1,1),1);
        CU_ASSERT_EQUAL(maxi(
0,-0),0);
}

 
void  testIGJ()
{
        CU_ASSERT_EQUAL(maxi(
2,1),2);
        CU_ASSERT_EQUAL(maxi(
0,-1),0);
        CU_ASSERT_EQUAL(maxi(
-1,-2),-1);
}

 
void  testILJ()
{
        CU_ASSERT_EQUAL(maxi(
1,2),2);
        CU_ASSERT_EQUAL(maxi(
-1,0),0);
        CU_ASSERT_EQUAL(maxi(
-2,-1),-1);
}
 

CU_TestInfo testcases[] 
=   {
        
{"Testing i equals j:", testIQJ},
        
{"Testing i greater than j:", testIGJ},
        
{"Testing i less than j:", testILJ},
        CU_TEST_INFO_NULL
}
;
 

/*---- test suites ------------------*/
int  suite_success_init( void )  { return 0; }
int  suite_success_clean( void )  { return 0; }  

CU_SuiteInfo suites[] 
=   {
        
{"Testing the function maxi:", suite_success_init, suite_success_clean, testcases},
        CU_SUITE_INFO_NULL
}
;
 

/*---- setting enviroment -----------*/

void  AddTests( void )
{
        assert(NULL 
!= CU_get_registry());
        assert(
!CU_is_test_running());
        
/* shortcut regitry */

        
if(CUE_SUCCESS != CU_register_suites(suites)){
                fprintf(stderr, 
"Register suites failed - %s ", CU_get_error_msg());
                exit(EXIT_FAILURE);
        }

}

 3) run_test.c

/**
 * file: run_test.c
 *
*/


#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< assert.h >

int  main(  int  argc,  char   * argv[] )
{
       
if(CU_initialize_registry()){
                fprintf(stderr, 
" Initialization of Test Registry failed. ");
                exit(EXIT_FAILURE);
        }
else{
                AddTests();
                CU_set_output_filename(
"TestMax");
                CU_list_tests_to_file();
                CU_automated_run_tests();
                CU_cleanup_registry();
        }

        
return 0;
}

4) Makefile 

INC = -I / home / lirui / local / include
LIB
= -L / home / lirui / local / lib

all: func
. c test_func . c run_test . c
        gcc -o test 
$( INC )   $( LIB ) -lcunit -lcurses -static  $ ^

由于CUnit是以库的形式提供的,所以我们在编译和链接的时候需要指明头文件和库所在的位置,又由于使用了Curses库,所以也要指定这个。

测试报告

 运行上面产生的test程序,会在当前目录下产生两个xml文件:

  1. TestMax-Listing.xml :对测试用例的报告
  2. TestMax-Results.xml :对测试结果的报告

要查看这两个文件,需要使用如下xsl和dtd文件:CUnit-List.dtd和CUnit-List.xsl用于解析列表文件, CUnit-Run.dtd和CUnit-Run.xsl用于解析结果文件。这四个文件在CUnit包里面有提供,安装之后在$(PREFIX) /share/CUnit目录下,在我的配置当中,它在/home/lirui/local/share/CUnit目录下。在查看结果之前,需要把这六个文件:TestMax-Listing.xml, TestMax-Results.xml, CUnit-List.dtd, CUnit-List.xsl, CUnit-Run.dtd, CUnit-Run.xsl拷贝到一个目录下,然后用浏览器打开两个结果的xml文件就可以了。

1) TestMax-Listing.xml在IE当中显示如下:

list cases

2) TestMax-Results.xml在IE当中显示如下:

results

C语言单元测试框架——CUnit入门 CUnit介绍及入门 阅读详情

相关推荐

C语言:用CuTest写单元测试的简易示例【视频介绍】

C语言:单元测试工具CuTest介绍

胡凯旋的个人技术博客 3338

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

CUnit 是一个通过 C 语言编写的用于编写、管理和执行单元测试用例的C语言单元测试框架。它往往被编成库的形式(静态库或动态库)提供给用户测试代码进行使用,用户编写程序的时候直接链接此静态库就可以了。它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句支持。CUnit是平台无关的框架与各种用户接口的组合。核心框架为管理测试注册表,套件和测试用例提供了基本支持。用户接口便于与框架交互以运行测试和查看结果。

weixin_46048542的博客 4966

C语言单元测试工具check

C语言单元测试工具check实例 关于check的概念性描述,我在这里就不多少了,主要就是分享一下我在学习使用了check后的一些问题。 安装完check(我是在github上下载的源码安装的),在你的 /usr/local/ 目录下会有check的头文件(check.h)静态库文件,动态库文件等相关文件。 在使用check的时候就可以用check.h头文件了,和生成的库文件了。 使用的时...

小豹Miss鲍的博客 5196

CUnit(单元测试框架)

CUnit是一个用C语言编写、管理和运行单元测试的轻量级系统,它为C程序员提供了具有灵活多样用户界面的基本测试功能。 CUnit是作为一个静态库构建的,它与用户的测试代码链接在一起。它使用一个简单的框架来构建测试结构,并为测试公共数据类型提供了一组丰富的断言。此外,还为运行测试和报告结果提供了几个不同的接口。这些接口目前包括: 1.自动输出到xml文件 2.非交互式基本灵活编程界面 3.非交互式控...

Major_S的博客 3117

基于python的unittest单元测试C语言代码

关于单元测试Python也给我们提供了相应的模块(unittest),单元测试,并可以生成测试报告 1、了解单元测试的原理与框架 1.1 单元测试原理 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元

csdn_wql_的博客 2114

Android GNSS 模块分析(三)JNI 层

Android GNSS;定位服务;GPS;NMEA协议;LocationManagerService;导航;

Yang_Mao_Shan的博客 5156

C语言的单元测试

单元测试是对软件系统中最小单位进行验证的测试过程。这个最小单元通常是一个特定的函数或方法。单元测试的主要目的是为了验证每个单元是否能够按照设计正常工作,从而降低系统的缺陷率,确保代码的质量。

2501_91048963的博客 830

工程师必看:如何用MINITAB快速计算传感器寿命(附详细步骤)

本文为工程师提供了使用MINITAB软件快速计算传感器寿命的详细实战指南。文章重点阐述了如何通过数据预处理、回归分析拟合阿伦尼斯模型,并最终预测平均寿命与置信区间,帮助工程师高效处理加速寿命试验数据,提升可靠性分析工作的准确性与效率。

weixin_29296241的博客 246

C 语言常用单元测试框架

对于资源有限的环境,比如 C 语言嵌入式系统,常用的单元测试框架会带来大量的资源消耗,并且嵌入式更多侧重功能测试,完善的框架实现并非必要。MinUnit 使用 C 语言编写,非常小型的单元测试框架。编译时未引用头文件中定义的宏函数,并不占会用内存。extremely— 摘自[JTN002 — Jera Design LLC](https://jera.com/techinfo/jtns/jtn002)CUnit 是一个编写、管理和运行 C 语言单元测试架构,会通过静态库链接在用户编写的测试代码中。

生活需要深度 2425

无人机基本组成部件

无人机基本组成部件

qq_37410522的博客 1万+

CenterPoint 工程复现

CenterPoint 工程复现,本文中使用版本:BEVerse工程下的mmdet3d (`MMDet3d v0.17.3`)版本,MMDetection3D中其他版本的使用`大同小异`。

Darchan的博客 5663

常用C语言单元测试工具介绍

单元测试是保证软件质量非常有效的手段,无论是从测试理论早期介入测试的理念来看或是从单元测试不受UI影响可以高速批量验证的特性,所以业界所倡导的测试驱动开发,这个里面提到的测试驱动更多的就是指单元测试驱动。但一般开发团队还是很少的系统化的执行单元测试,针对应用软件的测试更多是由专业测试团队来执行黑盒测试。单元测试的最大的难点不在于无法确定输入输出,这毕竟是模块开发阶段就已经定好的,而在于单元测试用例的编写会耗费开发人员大量的工时,按照相关统计单元测试用例的时间甚至会远超过功能本身开发的时间。

扬起你的笑脸~把影子藏在身后 1900

【异常】‘build.plugins.plugin.version‘ for org.apache.maven.plugins:maven-resources-plugin is missing

maven-compiler-plugin 插件版本信息没有指定导致了错误提示如下字面意思就是没有指定版本信息。

奶爸的编程之路,也就一周冷个三天 4599

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

目录 一、单元测试定义 二、C语言单元测试框架汇总 一、单元测试定义 单元测试是指对软件中的最小可测试单元进行检查和验证,如C语言中单元指一个函数,Java里单元指一个类。单元测试像一个古董,时间越久价值越大。 二、C语言单元测试框架汇总 不同编程语言的测试框架不同,C语言常见单元测试框架有: 1、Check 2、Gtest(Google Test) 3、CuTest 4、Cunit 5、CppUTest(Microsoft Cppunittest) 6、C++Test

魏波 7610

“华为杯”研究生数学建模竞赛2017年-【华为杯】B题:面向下一代光通信的 VCSEL 激光器仿真模型

得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰值向。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状。方案,包括可能的数学公式,不同温度和偏置电流下的带宽响应曲线,并与问题。线,得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状逐渐变得。得的激光器特性曲线和模型中仿真得到的特性曲线,之后,可以将两组曲线的差。说明的是,由于数值优化算法的成功与否很大程度上依赖于初始参数的猜测,参。

getusushu的博客 97

全志F1C100S/F1C200S学习笔记(1)——基础简介及资料

资料: 荔枝派资料下载站 荔枝派github 荔枝派中文论坛 荔枝派DIY-github资料 荔枝派Nano 全流程指南 芒果派 坑网

丨晋丨 1万+

单元测试及C语言的几个例子

单元测试是软件开发中的一种测试方式,它主要是对代码中最小可测试单元进行检查和验证。通常来说,单元测试的实施应该在整个软件开发周期的早期就开始,最好是在代码编写过程中就边写边测试,以及在执行集成和系统测试之前启动。下面是单元测试的详解:单元测试的目的:单元测试的主要目的是验证代码的正确性,从而尽早地捕获并消除缺陷,提高代码的质量、可读性、可维护性和可扩展性。通过单元测试,可以解决一些问题,例如改善软件架构、减少代码重构、优化代码性能等。

嵌入式之斋 2541

【深度学习新浪潮】OpenClaw跟机器人行业有哪些很好的研究结合点?

OpenClaw正通过"AI大脑+机器人肢体"的深度融合,重新定义机器人与人类的交互方式和自主操作能力。近期ROSClaw框架发布、人形机器人集成和空间计算试验等进展,标志着OpenClaw已从概念验证阶段进入实际应用落地期,为机器人行业带来了自然语言控制普及化具身智能平民化和跨平台开发标准化三大变革机遇。

专注:太空算力、AI infra、异构调度、大模型成本工程 228

c语言单元测试及答案,C语言程序设计单元测试答案

C语言程序设计 菏泽学院 黄复贤1【单选题】若定义pf为指向float类型变量f的指针,下列语句中__是正确的。A、float f, *pf = f;B、float f, *pf = &f;C、float *pf = &f, f;D、float f, *pf =0.0;正确答案:B2【单选题】若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, ( )是正确的。A、p2...

weixin_39615499的博客 2271

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言单元测试框架

一、Google Test gtest是一个跨平台的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。 //编译升级到设备中去。 可以参考的网址: 1、使用说明翻译 ...

zhang_yin_liang的博客 4814

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c语言单元测试标准,强大的c语言单元测试框架:Check

C 语言的单元测试框架,上 WikiPedia 可以查到很多。经过一番比较之后,选定 check 作为 c 语言的单元测试框架。Check 最主要的优点是对于每一个测试用例的运行都 fork 一个子进程,这么做的原因是因为 C 语言的独特性:* 其它语言如 Java,Python,Ruby等,单元测试出错最多不过是抛出异常* C 语言如果指针操作错误,乱指一气,可是会 coredump的。测试框架...

weixin_35681614的博客 776

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

c 语言单元测试代码,编写单元测试C代码

我是一名C ++开发人员,在测试时,通过注入依赖项,覆盖成员函数等来测试类很容易,这样您就可以轻松地测试边缘案例。 但是,在C中,您无法使用这些精彩的功能。 我发现很难将单元测试添加到代码中,因为编写C代码的一些"标准"方法。 解决以下问题的最佳方法是:传递一个大的'context'结构指针:void some_func( global_context_t *ctx, .... ){/* lots...

weixin_36231030的博客 1088
上一篇: Linux 调试技术
下一篇: curl命令
htt9931
博客等级 码龄24年 43粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值