cmockery库详解

1、cmockery库源码的编译链接

下载链接:https://code.google.com/p/cmockery/downloads/list

下载需要FQ,没有条件的可以直接在github上找一篇比较完整的版本。

$ ./configure
$ make clean && make
$ make install prefix=~/share/code/cmockery
$ tree ~/share/code/cmockery
install
├── include
│   └── google
│       └── cmockery.h
├── lib
│   ├── libcmockery.a
│   ├── libcmockery.la
│   ├── libcmockery.so -> libcmockery.so.0.0.0
│   ├── libcmockery.so.0 -> libcmockery.so.0.0.0
│   └── libcmockery.so.0.0.0
└── share
    └── doc
        └── cmockery-0.11
            ├── AUTHORS
            ├── ChangeLog
            ├── COPYING
            ├── index.html
            ├── INSTALL
            ├── NEWS
            └── README

6 directories, 13 files

安装后的目录树如上所示,包括头文件,同时提供了静态库和动态库, 和头文件,还有一些使用手册。

2、cmockery库的使用

cmockery使用不到2000行的代码,实现了对代码的单元测试框架。

首先来浏览一下官方提供的example,总结一下cmockery库的功能:

(1)运行测试 —— 参阅 run_tests.c calculator_test.c

cmockery提供了两种方式添加一个测试用例:

    unit_test(f)
    unit_test_setup_teardown(test, setup, teardown)

使用unit_test_setup_teardown的方式可以分别添加setup函数和teardown函数,可以在test之前进行初始化,测试结束之后释放资源,可以使用NULL表示空函数。

测试框架流程:

    const UnitTest tests[] = {
        unit_test(f),
        unit_test_setup_teardown(test, setup, teardown),
    };
    run_tests(tests);

测试结果显示如下:

test_func: Starting test

test_func: Test completed successfully.

All 1 tests passed

(2)断言测试 —— 参阅 assert_module_test.c assert_macro_test.c

使用cmockery提供的assert函数:

// If unit testing is enabled override assert with mock_assert().
#if UNIT_TESTING
extern void mock_assert(const int result, const char* const expression,const char * const file, const int line);
#undef assert
#define assert(expression) \
    mock_assert((int)(expression), #expression, __FILE__, __LINE__);
#endif // UNIT_TESTING

cmockery库提供了以下断言函数:

assert_true(c)
assert_false(c)
assert_int_equal(a, b)
assert_int_not_equal(a, b)
assert_string_equal(a, b)
assert_string_not_equal(a, b)
assert_memory_equal(a, b, size)
assert_memory_not_equal(a, b, size)
assert_in_range(value, minimum, maximum)
assert_not_in_range(value, minimum, maximum)
assert_in_set(value, values, number_of_values)
assert_not_in_set(value, values, number_of_values) 

在测试代码时,可以适当且大量的使用断言以确保代码的可靠性。

断言出错,将打印出错误提示,如下实例:

get_status_code_string_test: Starting test

"Connection dropped" != "Connection timed out"

ERROR: src/example/assert_macro_test.c:29 Failure!

get_status_code_string_test: Test failed.

string_to_status_code_test: Starting test

2 != 1

(3)内存申请和释放测试 —— 参阅 allocate_module.c allocate_module_test.c

同样需要使用cmockery提供的malloc、calloc和free函数

#if UNIT_TESTING
extern void* _test_malloc(const size_t size, const char* file, const int line);
extern void* _test_calloc(const size_t number_of_elements, const size_t size,const char* file, const int line);
extern void _test_free(void* const ptr, const char* file, const int line);
#define malloc(size) _test_malloc(size, __FILE__, __LINE__)
#define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__)
#define free(ptr) _test_free(ptr, __FILE__, __LINE__)
#endif // UNIT_TESTING

当内存操作不当或者malloc错误会打印出错误信息,如下实例所示:

buffer_overflow_test: Starting test

Guard block of 0x088e90e8 size=4 allocated by src/example/allocate_module.c:41 at 0x088e90ec is corrupt

ERROR: src/example/allocate_module.c:43 Failure!

buffer_overflow_test: Test failed.

1 out of 1 tests failed!

buffer_overflow_test

Blocks allocated...

0x088e90b0 : src/example/allocate_module.c:41

Guard block of 0x088e90e8 size=4 allocated by src/example/allocate_module.c:41 at 0x088e90ec is corrupt

ERROR: src/cmockery.c:1463 Failure!

(4)模拟测试 —— 参阅 product_database_test.c customer_database_test.c

通过expect_value和check_expected可以判断传入函数的值是不是期望的值,而will_return和mock则是对应的关系,will_return会将值放入到队列中,而每次调用mock都会取到队列前端的值。

int test(int value, char *string)
{
    check_expected(value);
    check_expected(string);
    return (int)mock();
}
void test_for_mock(void **state) {
    expect_value(test, value, 1);
    expect_string(test, string, "test");
    will_return(test, 0x123456);
    assert_int_equal(test(1, "test"), 0x123456);
}
时间: 2024-10-23 08:10:13

cmockery库详解的相关文章

Struts标签库详解【3】

struts2标签库详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts-tags" %> If elseif  else 描述: 执行基本的条件流转. 参数: 名称 必需 默认 类型 描述 备注 test 是 boolean 决定标志里的内容是否显示的表达式 else标志没有这个参数 id 否 Object/String 用来标识元素的

Lua的协程和协程库详解

我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thread.每一个线程都代表一个执行序列. 当我们在程序中创建多线程的时候,看起来,同一时刻多个线程是同时执行的,不过实质上多个线程是并发的,因为只有一个CPU,所以实质上同一个时刻只有一个线程在执行. 在一个时间片内执行哪个线程是不确定的,我们可以控制线程的优先级,不过真正的线程调度由CPU的调度决定.

php中的PDO函数库详解

PHP中的PDO函数库详解 PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,PDO更高效.目前而言,实现“数据库抽象层”任重而道远,使用PDO这样的“数据库访问抽象层”是一个不错的选择. PDO中包含三个预定义的类 PDO中包含三个预定义的类,它们分别是 PDO.PDOStatement 和 PDOException. 一.PDO PDO->beginTransaction(

struts2标签库详解

原文:struts2标签库详解 源代码下载地址:http://www.zuidaima.com/share/1781606927846400.htm 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts-tags" %> If elseif  else 描述: 执行基本的条件流转. 参数: 名称 必需 默认 类型 描述 备注 test 是 bo

C++11 std::chrono库详解

所谓的详解只不过是参考www.cplusplus.com的说明整理了一下,因为没发现别人有详细讲解. chrono是一个time library, 源于boost,现在已经是C++标准.话说今年似乎又要出新标准了,好期待啊! 要使用chrono库,需要#include<chrono>,其所有实现均在std::chrono namespace下.注意标准库里面的每个命名空间代表了一个独立的概念.所以下文中的概念均以命名空间的名字表示! chrono是一个模版库,使用简单,功能强大,只需要理解三个

PHP PDO函数库详解

文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/565 PDO是一个"数据库访问抽象层",作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,PDO更高效. 目前而言,实现"数据库抽象层"任重而道远,使用PDO这样的"数据库访问抽象层"是一个不错的选择. 目前而言,实现"数据库抽象层"

python WEB接口自动化测试之requests库详解

1.Get请求 前提: requests库是python的第三方库,需要提前安装哦,可以直接用pip命令:`python –m pip install requests` 按照惯例,先将requests库的属性打印出来,看看哪些属性. >>> import requests >>> dir(requests) #查看requests库的属性 ['ConnectionError', 'HTTPError', 'NullHandler', 'PreparedRequest'

Struts标签库详解【1】

struts2标签详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri="/struts-tags" %> If elseif  else 描述: 执行基本的条件流转. 参数: 名称 必需 默认 类型 描述 备注 test 是 boolean 决定标志里的内容是否显示的表达式 else标志没有这个参数 id 否 Object/String 用来标识元素的i

Python--urllib3库详解1

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3.Urllib3提供了很多python标准库里所没有的重要特性: 1. 线程安全 2. 连接池 3. 客户端SSL/TLS验证 4. 文件分部编码上传 5. 协助处理重复请求和HTTP重定位 6. 支持压缩编码 7. 支持HTTP和SOCKS代理 8. 100%测试覆盖率 Urllib3功能非常强大,但是用起来却十分简单: 安装: Urllib3 能通过pip来安装: