Cmockery是google开源的一套C语言单元测试框架。

选择原因

正如编写这个框架的动机,选择这个测试框架的原因在于 兼容性好耦合度低不依赖外部库 。总得来说,就是简单!

功能

按照功能,可分为四个模块

test execution 测试运行模块

测试单元用例是以函数形式给出

void test_function(void** state) {
}

然后,将其添加到一个测试单元组当中,测试单元组为一个数组

const UnitTest tests = {
    unit_test(test_function),
};

运行测试

run_tests()

如果出现异常,则程序会中断测试。如果发生错误,输出相关信息后继续执行下一条单元测试用例。

assertion 断言

expect_assert_failure():类似于C语言中的assert

assert_{type}_equal(), assert_{type}_equal:用于检查运行结果。

expect_{type}(),用于函数输入参数和测试用例的检查

Dynamic Memory Allocation 内存泄漏检查

用于宏定义的方式重新定义C运行库的内存管理函数,通过在申请内存时,加入信息头记录在链表当中的方式检测内存泄漏。

Mock 模拟测试

  1. 重写待测试中需要进行模拟测试的函数
  2. 在重写模拟测试函数中调用mock()
  3. 调用函数前,先用will_return()指定,返回值
//1
int* need_to_mock() {
    //2
    return (int*)mock();
}
int* want_to_test_func() {
    return need_to_mock();
void test_function(void** state) {
    //3
    will_return(want_to_test_func, 0x2046);
    assert_true(want_to_test_func() == 1);
}
int main(int, char**) {
    const UnitTest u[] = {
        unit_test(test_function),
    }
    return run_tests(u);
}

State 环境状态

通过unit_test_setup_teardonw可以在单元测试运行之前改变(预装载)和恢复环境状态(测试后卸载)。

Problem 存在的问题

  • 在内存检测部分,没有对realloc函数进行处理,导致在有realloc调用的时候程序崩溃 此问题在cmocka已被解决。
  • free(0),释放一个空指针程序将崩溃,在test_free中加入判空操作。

this is my fork that fixes those problems above

reference

什么是mock测试 用cmockery做mocking测试

标签: c
日期: 2016-03-18 17:30:06, 8 years and 303 days ago
留言

回复不允许使用html标签

通过电子邮件通知我有后续评论.