美文网首页
一个简约的几十行代码的C语言单元测试框架

一个简约的几十行代码的C语言单元测试框架

作者: boldcautious | 来源:发表于2018-06-07 09:53 被阅读20次

使用几十行代码实现一个简约的C语言单元测试框架。该框架只有一个头文件,使用方法如下:

  1. 引用头文件mcut.h
  2. 编写测试函数(测试case),参数和返回值类型均为void。测试函数中使用mcut_assert、mcut_assert_msg、mcut_assert_int对测试结果进行判断
  3. 调用mcut_run_test方法运行测试函数
  4. 调用mcut_show_statistics,展示统计结果

框架代码,mcut.h:

/* mcut.h: Minimalist C Unit Test framework */
#ifndef __MCUT_H
#define __MCUT_H

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

static int __MCUT_RAN = 0;
static int __MCUT_FAILED = 0;

#define mcut_assert_msg(expr, ...) \
do { \
    __MCUT_RAN++; \
    if (!(expr)) { \
        printf("%s(%d): ", __func__, __LINE__); \
        printf(__VA_ARGS__); \
        printf("\n"); \
        __MCUT_FAILED++; \
    } \
} while (0)

#define mcut_assert(expr) \
    mcut_assert_msg(expr, "Assertion '"#expr"' failed")

/* O may be any comparion operator. */
#define mcut_assert_int(X, O, Y) \
    mcut_assert_msg((X) O (Y), \
                    "Assertion '"#X#O#Y"' failed: "#X"==%d, "#Y"==%d", X, Y)

#define mcut_run_test(test_case) test_case()

#define mcut_show_statistics() \
do { \
    float passed = 0; \
    if (__MCUT_RAN != 0) { \
        passed = (__MCUT_RAN - __MCUT_FAILED) * 100.00 / __MCUT_RAN; \
    } \
    printf("\n---------- Run Summary ----------\n"); \
    printf("Passed: %.2f%%, Ran: %d, Failed: %d\n", \
           passed, __MCUT_RAN, __MCUT_FAILED); \
    if (__MCUT_FAILED) return 1; \
} while (0)

#endif

测试代码,test_sub.c:

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

/* function */
int sub(int a, int b)
{
    return 0;
}

/* test case */
static void test_sub1(void)
{
    mcut_assert(sub(10, 5) == 5);
}

static void test_sub2(void)
{
    mcut_assert_msg(sub(2, 5) == -3, "Error: sub(2, 5) != -3");
}

static void test_sub3(void)
{
    mcut_assert_int(sub(2, 0), ==, 2);
}

static void test_sub4(void)
{
    mcut_assert_int(sub(0, 0), ==, 0);
}

/* run test case */
int main(int argc, char *argv[])
{
    mcut_run_test(test_sub1);
    mcut_run_test(test_sub2);
    mcut_run_test(test_sub3);
    mcut_run_test(test_sub4);

    mcut_show_statistics();
    return 0;
}

编译

# gcc -Wall test_sub.c -o test_sub

运行结果

# ./test_sub 
test_sub1(14): Assertion 'sub(10, 5) == 5' failed
test_sub2(19): Error: sub(2, 5) != -3
test_sub3(24): Assertion 'sub(2, 0)==2' failed: sub(2, 0)==0, 2==2

---------- Run Summary ----------
Passed: 25.00%, Ran: 4, Failed: 3

相关文章

  • 一个简约的几十行代码的C语言单元测试框架

    使用几十行代码实现一个简约的C语言单元测试框架。该框架只有一个头文件,使用方法如下: 引用头文件mcut.h 编写...

  • C 语言测试 - gtest

    C语言的单元测试框架 C语言单元测试框架unitC语言单元测试框架unit的使用_Vincent的专栏-CSDN博...

  • C语言单元测试框架Check

    什么是Check Check是C语言的一个单元测试框架。它提供一个小巧的单元测试接口。测试案例运行在各自独立的地址...

  • C++单元测试框架——gtest

    C++单元测试框架——gtest——v_raw gtest简介 gtest是一个跨平台的C++单元测试框架。它提供...

  • go 单元测试

    单元测试 Go 语言测试框架可以让我们很容易地进行单元测试,但是需要遵循五点规则: 含有单元测试代码的 go 文件...

  • unittest系列(一)unittest简介和示例

    unittest— 单元测试框架 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的...

  • unittest-单元测试框架

    单元测试框架 unittest 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风...

  • 单元测试框架之unittest简介

    一、单元测试的含义 unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他...

  • 背景介绍

    py3.7.1unittest——单元测试框架unittest框架的灵感来源是JUnit,与其他语言的主要单元测试...

  • 用python实现接口测试(九、Unittest测试框架)

    一、单元测试框架 不论对于开发还是测试,都离不开单元测试框架,对于开发而言使用单元测试框架,可以编写测试代码来验证...

网友评论

      本文标题:一个简约的几十行代码的C语言单元测试框架

      本文链接:https://www.haomeiwen.com/subject/cvvwsftx.html