适合于嵌入式系统的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);
}