适合于嵌入式系统的C语言单元测试框架:Scunit

适合于嵌入式系统的C语言单元测试框架:Scunit

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

介绍

Scunit: Simple C Language Unit Test Framework.适合于C语言的简单测试框架。

主流语言都有测试框架,在嵌入式领域特别是资源紧缺的单片机工程中没有合适的测试框架。Scunit是一种简单的C语言测试框架,可以应用于嵌入式领域。

开源

API

// max print message len
#define SCUNIT_PRINT_SIZE_MAX 128   

typedef void (*ScunitPrintFunc)(char *format, ...);
typedef void (*ScunitFunc)(void);

// ScunitLoad module load
void ScunitLoad(ScunitPrintFunc func);

// ScunitAddSuite add suite
void ScunitAddSuite(char *name);

// ScunitAddTest add test case
void ScunitAddTest(char *name, ScunitFunc func);

// ScunitAssert assert
void ScunitAssert(bool condition, char *tag);

// ScunitAssertMessage assert with message
void ScunitAssertMessage(bool condition, char *tag, char *message);

// ScunitPrint print message
void ScunitPrint(char *format, ...);

测试

#include <stdio.h>
#include "scunit.h"

static void testCase0(void);
static void testCase1(void);

int main() {
    ScunitLoad((ScunitPrintFunc)printf);
    ScunitAddSuite("test_routing_table");
    ScunitAddTest("case0", testCase0);
    ScunitAddTest("case1", testCase1);
    return 0;
}

static void testCase0(void) {
    ScunitAssert(1 == 1, "1");
    ScunitAssert(1 == 2, "2");
}

static void testCase1(void) {
    ScunitPrint("test case2!");
    ScunitAssertMessage(1 == 1, "1", "message1");
    ScunitAssertMessage(1 == 2, "2", "message2");
}

输出:


Suite:test_routing_table
-------------------->case:case0 begin
case0 tag:1 SCUNIT_ASSERT pass
case0 tag:2 SCUNIT_ASSERT fail
-------------------->case:case0 end
-------------------->case:case1 begin
test case2!
case1 tag:1 SCUNIT_ASSERT pass
case1 tag:2 SCUNIT_ASSERT fail:message2
-------------------->case:case1 end

源码

最新代码请查看github/gitee仓库。

scunit.h

// Copyright 2019-2021 The jdh99 Authors. All rights reserved.
// Unit test for C
// Authors: jdh99 <jdh821@163.com>

#ifndef SCUNIT_H
#define SCUNIT_H

#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>            
#include <stdarg.h>

// max print message len
#define SCUNIT_PRINT_SIZE_MAX 128    

typedef void (*ScunitPrintFunc)(char *format, ...);
typedef void (*ScunitFunc)(void);

// ScunitLoad module load
void ScunitLoad(ScunitPrintFunc func);

// ScunitAddSuite add suite
void ScunitAddSuite(char *name);

// ScunitAddTest add test case
void ScunitAddTest(char *name, ScunitFunc func);

// ScunitAssert assert
void ScunitAssert(bool condition, char *tag);

// ScunitAssertMessage assert with message
void ScunitAssertMessage(bool condition, char *tag, char *message);

// ScunitPrint print message
void ScunitPrint(char *format, ...);

#endif

scunit.c

// Copyright 2019-2021 The jdh99 Authors. All rights reserved.
// Unit test for C
// Authors: jdh99 <jdh821@163.com>

#include "scunit.h"                  

static ScunitPrintFunc print = NULL;
static char *func_name = NULL;

// ScunitLoad module load
void ScunitLoad(ScunitPrintFunc func) {
    print = func;
}

// ScunitAddSuite add suite
void ScunitAddSuite(char *name) {
    print("\nSuite:%s\n", name);
}

// ScunitAddTest add test case
void ScunitAddTest(char *name, ScunitFunc func) {
    func_name = name;
    print("-------------------->case:%s begin\n", func_name);
    func();
    print("-------------------->case:%s end\n", func_name);
}    

// ScunitAssert assert
void ScunitAssert(bool condition, char *tag) {
   if (condition) {
       print("%s tag:%s SCUNIT_ASSERT pass\n", func_name, tag);
   } else {
       print("%s tag:%s SCUNIT_ASSERT fail\n", func_name, tag);
   }
}

// ScunitAssertMessage assert with message
void ScunitAssertMessage(bool condition, char *tag, char *message) {
    if (condition) {
       print("%s tag:%s SCUNIT_ASSERT pass\n", func_name, tag);
   } else {
       print("%s tag:%s SCUNIT_ASSERT fail:%s\n", func_name, tag, message);
   }
}

// ScunitPrint print message
void ScunitPrint(char *format, ...) {
    static char buf[SCUNIT_PRINT_SIZE_MAX];
    
	va_list args;
	va_start(args, format);
    
    int length = vsnprintf(buf, sizeof(buf) - 1, format, args);
    if (length > SCUNIT_PRINT_SIZE_MAX - 1) {
        length = SCUNIT_PRINT_SIZE_MAX - 1;
    }
    buf[length] = 0;
    
    print(buf);
    print("\n");
    
	va_end(args);
}
  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值