Check—强大的C语言单元测试框架

1. 前言

在看基数树源码时,发现源码里面有个deps的依赖文件夹,deps里是一个叫Check的源码安装包,Google之后发现Check原来是C语言单元测试框架。关于单元测试,Wikipedia的介绍点这里

Check 最主要的优点是对于每一个测试用例的运行都 fork 一个子进程,这么做的原因是因为 C 语言的独特性:

(1) 其它语言如 Java,Python,Ruby等,单元测试出错最多不过是抛出异常;

(2) C 语言如果指针操作错误,乱指一气,可是会 coredump的。测试框架因此直接退出,用户是看不到任何返回的,只有郁闷的 coredump;

(3) Check 的单元测试运行在 fork 的子进程中,可以避免测试框架由于 coredump 而崩溃。

网上介绍Check的使用基本都是同一例子,但如何使用没有说明,下面就详细介绍下如何利用Check进行单元测试。


2. Check简单使用

在使用Check前要安装Check,可以直接在终端输入:sudo apt-get install check进行安装,也可以使用源码包安装,源码具体安装方法可以参考官网

我们现在也是要做一个只做加法的工程,整个工程的文件目录如下图所示,具体代码参考Github。工程文件夹里的TestAdd.c文件是将整个工程都放到了一个文件中,可以直接在终端运行:gcc TestAdd.c -lcheck进行编译,然后运行./test

TestAdd.c文件

    #include <stdio.h>
    #include "check.h"
    #include <stdlib.h>

    int add(int x1, int x2) {
        return 0;
    }

    START_TEST(test_add) {
        fail_unless(add(2, 3) == 5, "error, 2 + 3 != 5");
    }
    END_TEST

    Suite * make_add_suite(void) {
        Suite *s = suite_create("add");
        TCase *tc_add = tcase_create("add");
        suite_add_tcase(s, tc_add);
        tcase_add_test(tc_add, test_add);
        return s;
    }

    int main(void) {
        int n;
        SRunner *sr;
        sr = srunner_create(make_add_suite());
        srunner_run_all(sr, CK_NORMAL);
        n = srunner_ntests_failed(sr);
        srunner_free(sr);
        return (n == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

下面介绍下工程中的文件夹功能,add目录下是功能函数,include中是头文件,测试文件在unit_test文件夹,makefile是整个项目的make文件。

makefile文件

    vpath %.h include  #vpath 指定搜索路径
    vpath %.c add
    vpath %.c unit_test

    objects = add.o test_add.o
    test: test_main.c $(objects)
        gcc -I include $^ -o test -lcheck 

    all: $(objects)
    $(objects): %.o: %.c
        gcc -c -I include $< -o [email protected]

    .PHONY: clean
    clean:
        rm *.o test
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

add.c文件

    #include "add.h"
    int add(int x1, int x2) {
        return 0;
    }
  • 1
  • 2
  • 3
  • 4

add.h文件

    #ifndef _ADD_H
    #define _ADD_H
    int add(int x1, int x2);
    #endif
  • 1
  • 2
  • 3
  • 4

uni_test.h文件

    #ifndef _UNI_TEST_H
    #define _UNI_TEST_H
    #include "check.h"
    Suite *make_add_suite(void);
    #endif
  • 1
  • 2
  • 3
  • 4
  • 5

test_add.c文件

    #include "check.h"
    #include "uni_test.h"
    #include "add.h"
    START_TEST(test_add) {
        fail_unless(add(2, 3) == 5, "error, 2 + 3 != 5"); // "error, 2 + 3 != 5"是出错提示信息
    }
    END_TEST

    Suite * make_add_suite(void) {
        Suite *s = suite_create("add");       // 建立Suite
        TCase *tc_add = tcase_create("add");  // 建立测试用例集
        suite_add_tcase(s, tc_add);           // 将测试用例加到Suite中
        tcase_add_test(tc_add, test_add);     // 测试用例加到测试集中
        return s;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

test_main.c文件

    #include "uni_test.h"
    #include <stdlib.h>

    int main(void) {
        int n;
        SRunner *sr;
        sr = srunner_create(make_add_suite()); // 将Suite加入到SRunner
        srunner_run_all(sr, CK_NORMAL);
        n = srunner_ntests_failed(sr);         // 运行所有测试用例
        srunner_free(sr);
        return (n == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

make test 可以编译生成可执行文件test./test 运行单元测试程序。



【完】

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed

原文地址:https://www.cnblogs.com/djuwcnhwbx/p/10164707.html

时间: 2024-10-08 06:00:25

Check—强大的C语言单元测试框架的相关文章

c语言单元测试框架--CuTest

1.简介 CuTest是一款微小的C语言单元测试框,是我迄今为止见到的最简洁的测试框架之一,只有2个文件,CuTest.c和CuTest.h,全部代码加起来不到一千行.麻雀虽小,五脏俱全,测试的构建.测试的管理.测试语句,都全部包含在内. 2.CuTest剖析 2.1 断言 一个测试case是否通过落到代码实处,就是对测试值与期待值之间进行比较,这就要用到断言. #define CuAssertStrEquals(tc,ex,ac) CuAssertStrEquals_LineMsg((tc),

编译C语言单元测试框架CUnit库的方法

/*********************************************************************  * Author  : Samson  * Date    : 06/04/2015  * Test platform:  *              gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2  *              GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu)

Java单元测试框架 JUnit

Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一个. JUnit有它自己的JUnit扩展生态圈.多数Java的开发环境都已经集成了JUnit作为单元测试的工具. 在线Javadoc:http://ww...更多JUnit信息 最近更新: JUnit 4.12 发布,Java 单元测试框架 发布于4个月前 C++模拟测试框架 Google Mock

Android &amp;Swift iOS开发:语言与框架对比

转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text 从Android到Swift iOS开发:语言与框架对比 我从2009年开始做Android开发,开始接触Swift是在2014年底,当时组里曾经做过一个Demo App,感觉技术还

Python单元测试框架 unittest

Python单元测试框架 作者: Steve Purcell, <stephen_purcell at yahoo dot com>翻译: Heiz, <heiz dot yuan at gmail dot com>项目网站: http://pyunit.sourceforge.net/ 目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代

CPPUTest 单元测试框架(针对 C 单元测试的使用说明)

CPPUTest 虽然名称上看起来是 C++ 的单元测试框架, 其实它也是支持测试 C 代码的. 本文主要介绍用CPPUTest来测试 C 代码. (C++没用过, 平时主要用的是C) C++相关的内容都省略了. 本文基于 debian v7.6 x86_64. 1. CPPUTest 安装 现在各个Linux的发行版的源都有丰富的软件资源, 而且安装方便. 但是如果想要在第一时间使用最新版本的开源软件, 还是得从源码安装. debian系统为了追求稳定性, apt源中的软件一般都比较旧. 所以

Python 单元测试框架 —— PyUnit

转载自http://www.oschina.net/question/12_27127#GUI 目录 概况 系统要求 使用PyUnit构建自己的测试   安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的放置位置 交互式运行测试 从命令行运行测试 在用户界面窗口运行测试 为测试编写文档 更多关于测试条件 测试相等性 测试异常 通过PyUnit复用旧测试代码 在JPython和Jython中使用PyUn

μCUnit,微控制器的单元测试框架

在MCU on Eclipse网站上看到Erich Styger在8月26日发布的博文,一篇关于微控制器单元测试的文章,有很高的参考价值,特将其翻译过来以备学习.原文网址:https://mcuoneclipse.com/2018/08/26/tutorial-%CE%BCcunit-a-unit-test-framework-for-microcontrollers/ 单元测试是主机开发的常见做法.但对于嵌入式开发,这似乎仍然是一个"空白"领域.主要是因为嵌入式工程师不习惯单元测试,

单元测试框架之unittest(一)

一.单元测试的含义 unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他语言的单元测试框架风格相类似,支持自动化测试.为测试共享setUp和shutDown.它可以在将测试用例聚合到一起形成一个集合一起执行的同时在测试报告中展示独立的测试结果. 为了达到此目的,unittest支持几个重要的面向对象式的概念: 1.test fixture 一个test fixture所做的事情是执行单个或多个测试用例时的准备工作和执行结束后的一些相关清理工作,这包括:创