cunit教程linux,linux下CUnit使用

cunit教程linux,linux下CUnit使用4.C++Test1)简介C++Test是一个功能强大的自动化C/C++单元级测试工具,可以自动测试任何C/C++函数、类,自动生成测试用例、测试驱动函数或桩函数,在自动化的环境下极其容易快速的将单元级的测试覆盖率达到100%。2)功能特性即时测试类/函数支持极端编程模式下的代码测试自动建立类/函数的测试驱动程序和桩调用自动建立和执行类/函数的测试用例提供快速加入和执行说明和功能性测试的框架执行自…

大家好,又见面了,我是你们的朋友全栈君。

4.C++Test

1)简介

C++Test是一个功能强大的自动化C/C++单元级测试工具,可以自动测试任何C/C++函数、类,自动生成测试用例、测试驱动函数或桩函数,在自动化的环境下极其容易快速的将单元级的测试覆盖率达到100%。

2)功能特性

即时测试类/函数

支持极端编程模式下的代码测试

自动建立类/函数的测试驱动程序和桩调用

自动建立和执行类/函数的测试用例

提供快速加入和执行说明和功能性测试的框架

执行自动回归测试

执行部件测试(COM)

3)价格

不详

4)相关网站

部分二

转自:http://blog.csdn.net/colin719/archive/2006/11/29/1420583.aspx

C单元测试

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

CuTest — CuTest(Cute Test)是一个非常简单的C语言单元测试工具。在使用它的时候,只需要包含两个文件“CuTest.c CuTest.h”,然后就可以写测试用例,进行测试了。它对用例几乎没有管理功能,报表输出也非常简单,可以用来试验单元测试的基本想法。

CUnit — CUnit是一个轻型的C语言单元测试框架。它提供了设计、管理、运行测试用例的功能。它的报表功能比较强大,但是比较麻烦,更适合于较大一些的项目。

Check — 不错的工具。

在这里()给出了各种软件测试工具,没事可以研究一下。

CUnit

这里主要讲CUnit在Linux平台下的应用。这里有一篇 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使用四种不同的接口,供用户来运行测试和汇报测试结果:

自动输出到XML文件,     非交互式

基本扩展编程方式,        非交互式

控制台方式,              交互式

Curses图形接口,          交互式

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

CUnit测试流程

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

书写代测试的函数(如果必要,需要写suite的init/cleanup函数)

初始化Test Registry – CU_initialize_registry()

把测试包(Test Suites)加入到Test Registry – CU_add_suite()

加入测试用例(Test Case)到测试包当中 – CU_add_test()

使用适当的接口来运行测试测试程序,例如 CU_console_run_tests()

清除Test Registry – CU_cleanup_registry()

CUnit使用范例

CUnit的在线文档是 http://cunit.sourceforge.net/doc/index.html ,上面有着详细的论述。这里以使用自动产生XML文件的接口为例,讲述CUnit-2.1-0在Linux平台下的使用。

我要测试的是整数求最大值的函数maxi,我使用如下文件组织结构:

func.c :定义maxi()函数

test_func.c :定义测试用例和测试包

run_test.c :调用CUnit的Automated接口运行测试

Makefile :生成测试程序。

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

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

1) func.c

ExpandedBlockStart.gif/**

6a9c071a08f1dae2d3e1c512000eef41.png * file: func.c

ExpandedBlockEnd.gif **/None.gif

None.gifintmaxi(inti,intj)

ExpandedBlockStart.gif{

6a9c071a08f1dae2d3e1c512000eef41.png//return i>j?i:j;6a9c071a08f1dae2d3e1c512000eef41.pngreturni;

ExpandedBlockEnd.gif}

2) test_func.c

ExpandedBlockStart.gif/**

6a9c071a08f1dae2d3e1c512000eef41.png * file: test_func.c

ExpandedBlockEnd.gif **/None.gif#includeNone.gif#includeNone.gif#includeNone.gif#include”CUnit/CUnit.h”None.gif#include”CUnit/Automated.h”None.gif

ExpandedBlockStart.gif/*—- functions to be tested ——*/None.gifexternintmaxi(inti,intj); 

None.gif

ExpandedBlockStart.gif/*—- test cases ——————*/None.gifvoidtestIQJ()

ExpandedBlockStart.gif{

6a9c071a08f1dae2d3e1c512000eef41.png        CU_ASSERT_EQUAL(maxi(1,1),1);

6a9c071a08f1dae2d3e1c512000eef41.png        CU_ASSERT_EQUAL(maxi(0,-0),0);

ExpandedBlockEnd.gif}None.gif 

None.gifvoidtestIGJ()

ExpandedBlockStart.gif{

6a9c071a08f1dae2d3e1c512000eef41.png        CU_ASSERT_EQUAL(maxi(2,1),2);

6a9c071a08f1dae2d3e1c512000eef41.png        CU_ASSERT_EQUAL(maxi(0,-1),0);

6a9c071a08f1dae2d3e1c512000eef41.png        CU_ASSERT_EQUAL(maxi(-1,-2),-1);

ExpandedBlockEnd.gif}None.gif 

None.gifvoidtestILJ()

ExpandedBlockStart.gif{

6a9c071a08f1dae2d3e1c512000eef41.png        CU_ASSERT_EQUAL(maxi(1,2),2);

6a9c071a08f1dae2d3e1c512000eef41.png        CU_ASSERT_EQUAL(maxi(-1,0),0);

6a9c071a08f1dae2d3e1c512000eef41.png        CU_ASSERT_EQUAL(maxi(-2,-1),-1);

ExpandedBlockEnd.gif}None.gif

ExpandedBlockStart.gifCU_TestInfo testcases[]={

ExpandedSubBlockStart.gif{“Testing i equals j:”, testIQJ},

ExpandedSubBlockStart.gif{“Testing i greater than j:”, testIGJ},

ExpandedSubBlockStart.gif{“Testing i less than j:”, testILJ},

6a9c071a08f1dae2d3e1c512000eef41.png        CU_TEST_INFO_NULL

ExpandedBlockEnd.gif};

None.gif 

None.gif

ExpandedBlockStart.gif/*—- test suites ——————*/ExpandedBlockStart.gifintsuite_success_init(void){return0; }ExpandedBlockStart.gifintsuite_success_clean(void){return0; }None.gif

ExpandedBlockStart.gifCU_SuiteInfo suites[]={

ExpandedSubBlockStart.gif{“Testing the function maxi:”, suite_success_init, suite_success_clean, testcases},

6a9c071a08f1dae2d3e1c512000eef41.png        CU_SUITE_INFO_NULL

ExpandedBlockEnd.gif};

None.gif 

None.gif

ExpandedBlockStart.gif/*—- setting enviroment ———–*/None.gif

None.gifvoidAddTests(void)

ExpandedBlockStart.gif{

6a9c071a08f1dae2d3e1c512000eef41.png        assert(NULL!=CU_get_registry());

6a9c071a08f1dae2d3e1c512000eef41.png        assert(!CU_is_test_running());

ExpandedSubBlockStart.gif/*shortcut regitry*/6a9c071a08f1dae2d3e1c512000eef41.png

ExpandedSubBlockStart.gifif(CUE_SUCCESS!=CU_register_suites(suites)){

6a9c071a08f1dae2d3e1c512000eef41.png                fprintf(stderr,”Register suites failed – %s”, CU_get_error_msg());

6a9c071a08f1dae2d3e1c512000eef41.png                exit(EXIT_FAILURE);

ExpandedSubBlockEnd.gif        }ExpandedBlockEnd.gif}

3) run_test.c

ExpandedBlockStart.gif/**

6a9c071a08f1dae2d3e1c512000eef41.png * file: run_test.c

ExpandedBlockEnd.gif **/None.gif

None.gif#includeNone.gif#includeNone.gif#includeNone.gif

None.gifintmain(intargc,char*argv[] )

ExpandedBlockStart.gif{

ExpandedSubBlockStart.gifif(CU_initialize_registry()){

6a9c071a08f1dae2d3e1c512000eef41.png                fprintf(stderr,”Initialization of Test Registry failed.”);

6a9c071a08f1dae2d3e1c512000eef41.png                exit(EXIT_FAILURE);

ExpandedSubBlockStart.gif        }else{

6a9c071a08f1dae2d3e1c512000eef41.png                AddTests();

6a9c071a08f1dae2d3e1c512000eef41.png                CU_set_output_filename(“TestMax”);

6a9c071a08f1dae2d3e1c512000eef41.png                CU_list_tests_to_file();

6a9c071a08f1dae2d3e1c512000eef41.png                CU_automated_run_tests();

6a9c071a08f1dae2d3e1c512000eef41.png                CU_cleanup_registry();

ExpandedSubBlockEnd.gif        }6a9c071a08f1dae2d3e1c512000eef41.pngreturn0;

ExpandedBlockEnd.gif}

4) Makefile

None.gifINC=-I/home/lirui/local/include

None.gifLIB=-L/home/lirui/local/lib

None.gif

None.gifall: func.c test_func.c run_test.c

None.gif        gcc -o test$(INC)$(LIB)-lcunit -lcurses -static$^

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

测试报告

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

TestMax-Listing.xml :对测试用例的报告

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.gif

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

results.gif

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149979.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月17日 下午5:16
下一篇 2022年6月17日 下午5:16


相关推荐

  • mysql索引是什么 优点和缺点_MySQL索引优缺点、使用原则及种类介绍「建议收藏」

    mysql索引是什么 优点和缺点_MySQL索引优缺点、使用原则及种类介绍「建议收藏」一、索引简介1、索引简介索引(Index)是帮助MySQL高效获取数据的数据结构。在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。MyISAM和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎支持HASH和BTREE索引。2、索引的优点A、提高数据检索效率,降低数据库的IO成本。B、通过索引对数据进行排序,降低数据排序的成本降低了CPU的消…

    2022年5月26日
    44
  • n8n:免费+开源的自动化神器,比dify更简单,比Make更强大!

    n8n:免费+开源的自动化神器,比dify更简单,比Make更强大!

    2026年3月13日
    4
  • 计算机网络——DNS协议

    计算机网络——DNS协议文章目录 DNS 协议 DNS 提供的服务 DNS 简介服务 DNS 工作原理概述 DNS 服务器分类根 DNS 服务器顶级域 TLD DNS 服务器权威 DNS 服务器本地 DNS 服务器一趟 DNS 查询过程解析递归查询迭代查询实际中遵循的查询模式 DNS 缓存 DNS 记录和报文 DNS 记录 DNS 报文 DNS 报文解析 DNS 协议 DNS 提供的服务 DNS 简介由于 IP 地址较为难记 因此引入了 DNS 协议 DNS DomainNameSy

    2026年3月17日
    2
  • CAP 理论

    CAP 理论CAP 是分布式系统中典型的基础理论 它主要表达 C A P 不存在三全其美的的选择 CAP 是分布式系统中三个特性的英文首字母组合 分别对应 一致性 Consistency 可用性 Availability 分区容错性 Partitiontol 在这个理论中 最多只能同时做到其中的两个特性 要么满足 CA 要么满足 CP 要么满足 AP 同时满足 CAP 是不可能的 一致性 C 在分布式系统完成某写操作后再进行任何读操作 都应该获取到该写操作写入的那个最新的值

    2026年3月16日
    2
  • docker(12)使用Dockerfile创建jenkins+python3+pytest环境

    docker(12)使用Dockerfile创建jenkins+python3+pytest环境前言之前我们用docker手动安装了jenkins环境,在jenkins中又安装了python3环境和各种安装包,如果我们想要在其他3台机器上安装,又是重复操作,重复劳动,那会显得很low,这里可以

    2022年7月30日
    7
  • Oracle DBA认证考试

    Oracle DBA认证考试要获得 10gOCP 认证 必须满足两个条件 1 学员必须通过所有 OCP 三门认证考试 具体考试科目见下表 2 学员必须在 Oracle 大学参原厂培训 推荐培训科目见前面的下表 所有科目列表请查看 http wenwen soso com z UrlAlertPage e sp Shttp 3A 2F 2Feducation oracle com 2Fpls 2Fweb prod

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号