C语言单元测试框架unit的使用
针对C语言的测试框架相比其他语言要少一些,本文简单介绍一下Cunit框架的基本使用方法,权当备忘吧。Cunit的组织框架如下图所示:
将单个测试用例打包到一个suite中,这些suite在Registry中注册。registry中的所有suite/tests可以使用单个函数调用运行,也可以运行选定的套件或测试。下面看一个例子
首先我们新建文件,写一个待测试函数,这里以一个字符串转换数字函数为例,这是我们的第一版实现
// convert.c
// 版本1
int
str_to_int(char* s)
{int sum = 0;char *p = s;while (*p != 0) {sum = sum * 10 + *p -'0';p++;}return sum;
}
显然这个函数是有很多问题的,我们写一个测试函数来测试它。
void
TEST_str_to_int()
{int ans;char *p;char *ps[] = { "123", "-123", "0", "siahideib", "2147483648", "2147483647", "-1-2", " -2147483647", " -2147483648aaaa"};int real[] = {123, -123, 0, 0, 0, 2147483647, -1, -2147483647, -2147483648};int i = 0;for (i = 0; i < sizeof(real)/sizeof(real[0]); i++) {ans = str_to_int(ps[i]);CU_ASSERT_EQUAL(ans,real[i]);}
}
测试函数和被测函数写好之后,我们就可以定义一个registry 和一个suite,在suite中添加被测函数,并在registry中注册。
addTestModule()
{CU_pSuite pSuite = NULL;// 添加suitepSuite = CU_add_suite("str_to_int测试模块", suite_success_init, suite_success_clean); if (pSuite == NULL) {return -1;}// 在suite中添加被测函数if (NULL == CU_add_test(pSuite,"str_to_int",TEST_str_to_int)) {return -1;}return 0;
}
Cunit提供了三种模式查看单元测试结果,分别是控制台模式,基本模式和报表模式
void
run_test()
{if (CU_initialize_registry()) {printf("error");return ;} assert(NULL != CU_get_registry());assert(!CU_is_test_running()); if (0 != addTestModule()) {CU_cleanup_registry();return ;}// 报表模式// 设置输出文件名称CU_set_output_filename("str_to_int_test_report");CU_list_tests_to_file();CU_automated_run_tests();// 基本模式// CU_basic_set_mode(CU_BRM_VERBOSE);// CU_basic_run_tests(); // 控制台模式// CU_console_run_tests(); // CU_console_run_tests();CU_cleanup_registry();
}
最后写一个main函数来调用测试函数
#include<stdio.h>
#include "test.h"
int
main()
{run_test();return 0;
}
编译运行
gcc -g convert.c main.c test.c -lcunit
./a.out
运行完成后,在当前目录下可以看到生成了两个xml文件,这两个文件就是得到的测试结果。
str_to_int_test_report-Listing.xml
str_to_int_test_report-Results.xml
不过这两个文件不能直接打开,需要把cunit安装目录下的另外四个文件复制过来。如果默认安装的话,这四个文件一般在/usr/local/share/CUnit目录下
CUnit-List.dtd
CUnit-List.xsl
CUnit-Run.dtd
CUnit-Run.xsl
把这6个文件拷贝到同一路径下,就可以通过IE或者Edge浏览器查看输出结果。
可以看到,9个测试用例有3个没有通过。改进一下被测函数
// convert.c
// 版本2
int
str_to_int(char* s)
{int sign = 1;char *p = s;long sum = 0;// 指针判空if (!s) {return 0;}// 排除空格while (*p == ' ')p++;//控制符号if (*p == '-') {sign = -1;p++;} else if (*p == '+') {sign = 1;p++;}while (*p >= '0' && *p <= '9') {// 左移比乘法效率高,注意优先级sum = (sum << 3) + (sum << 1) + *p -'0';// 处理溢出if ((sum > INT_MAX && sign == 1) || sum > (long)INT_MAX + 1 && sign == -1) {sum = 0;break;}p++;}return (int)sum * sign;
}
重新编译,运行,看一下测试结果,这一次9个case全部通过
C语言单元测试框架unit的使用相关推荐
- c语言语法sc,适合于嵌入式系统的C语言单元测试框架:SCUNIT
说明 主流语言都有测试框架,在嵌入式领域特别是资源紧缺的单片机工程中没有合适的测试框架.本文发布一种简单的C语言测试框架SCUNIT,可以应用于嵌入式领域. 测试环境 本框架是基于标准C语言编写,对平 ...
- C语言单元测试框架——CUnit
C语言单元测试框架--CUnit 文章目录 C语言单元测试框架--CUnit 1.CUnit简介 2.CUnit安装 2.1.安装配置--Ubuntu 2.2.安装步骤 2.3.安装文件 3.CUni ...
- c语言的自动测试工具,C语言单元测试框架--check工具
C语言单元测试框架--check工具 虽然在UNIX上用C语言做开发已经有一段时间了,但是我不得不承认,自己单元测试做的并不好.恰好最近有新的开发任务,就学习了一些关于测试驱动开发的知识,准备改进自己 ...
- C语言单元测试框架详解:第一篇
目录 一.单元测试定义 二.C语言单元测试框架汇总 三.C语言测试推荐书籍 一.单元测试定义 单元测试是指对软件中的最小可测试单元进行检查和验证,如C语言中单元指一个函数,Java里单元指一个类.单元 ...
- 【嵌入式单元测试】C语言单元测试框架搭建
cmocka cmocka交叉编译 源码下载 编译准备 源码修改 指定编译器 编译 cmocka使用示例 常见问题 参考 单元测试框架是一个软件包,它能够让开发者比较方便的表达产品代码需要表现出什么样 ...
- c语言测试框架设计,C语言单元测试框架Check
什么是Check Check是C语言的一个单元测试框架.它提供一个小巧的单元测试接口.测试案例运行在各自独立的地址空间,所以断言失败和代码错误造成的段错误或者其他的信号可以被捕捉到.另外,测试的结果显 ...
- C语言单元测试框架——CUnit 安装(windows和Linux)及使用
目录 CUnit CUnit Windows 安装 CUnit Linux(Ubuntu) 安装 一键把cunit测试结果(Basic)和gcov覆盖率结果合并 gcov python代码 bat代码 ...
- C语言单元测试框架-cmocka示例
#include <cmocka.h> //Google自动化测试static void test_1(void **state) {//code }static void test_2( ...
- C语言单元测试embUnit入门学习
本人原创,转载请注明出处. 目录 学习目标 2.c语言面向对象编程 2.1c语言继承实现 2.1.1子类结构体包含父类结构体 2.1.2子类结构体包含父类结构中的指针 2.1.3结构体和指针有何不同 ...
最新文章
- Linux系统下如何安装软件包
- 搞懂这些框架源码,带你吊打面试官
- mysql 定义存储过程_mysql——定义——存储过程和函数——概念
- macOS新版本终于删掉自带Python2,这波操作连Python死忠粉都叫好
- RabbitMQ之消息持久化
- python 线程死锁_python线程死锁与递归锁
- arthas案例:哪个controller处理了请求?每个请求的调用参数和返回值是多少?
- 【02】CC - 有意义的命名
- html5 coverflow,使用FancyCoverFlow实现3D无限循环切换视图
- oracle查询字段嵌套子查询,Oracle通过嵌套子查询连接
- Ctrl + R 后,悲剧咯、、、、
- Android-蓝牙AVRCP功能实现【转】
- 倪光南李开复景鲲等15位产业领袖纵论中国AI现状:价值重估,落地为王
- outlook邮件撤回操作
- 分享一个实用的自媒体一键多发平台,关键是能免费用
- 如何检索IDC研究报告?
- 修改iOS工程的Organization Name
- E152A03EIOA 3AXD50000032633驱动器
- Python 爬虫二 requests模块
- openSUSE桌面环境日常软件推荐
热门文章
- Tesla都使用什么编程语言?
- 人脸检测/识别的API、库和软件--转载
- JS(微信小程序)处理银行卡号
- uSurvival 1.41多人在线生存逃杀吃鸡类游戏源码
- 模拟进程创建、终止、阻塞、唤醒原语(操作系统原理实验)
- Python量化交易学习笔记(20)——保护点卖出策略
- Cache的基本原理以及简单操作
- 缺少对象 index.php 行123,Microsoft VBScript 运行时错误 (0x800A01A8)缺少对象: ''
- 为什么天才容易患阅读障碍症_阅读障碍症说不定好处更大的原因是什么?
- android前台渲染图片,自定义View