C语言实现单元测试的示例详解

 更新时间:2022年09月02日 15:03:24   作者:胡安民-独行者  
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。这篇文章主要为大家介绍了C语言实现单元测试的方法,需要的可以参考一下

前沿

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

在网上找了找C语言都没有类似java 的junit单元测试 ,反复测试自己写的模块非常费劲,特别是交叉模块测试的时候根本就无法弄

因为一个程序只允许一个main方法,如果其他地方存在了,那么就会报错,这就导致了测完A模块想要测试B模块就需要把A模块测试的相关内容删除,这样会出现什么问题呢? 如果后期我们对A模块的内容进行了修改,那么是不是需要在重新写一套测试Demo, 这样非常浪费时间和精力 ,没办法只能自己开发一套类似的,来协助本地开发进行测试代码

使用前提

自己必须有集合数据结构和hash结构

测试框架如下

#ifndef STUDY_TESTCORE_H
#define STUDY_TESTCORE_H
#include "../structure/charHash.h"
typedef int boolean;//定义一个布尔类型
#define TRUE 1
#define FALSE 0
#define EXECUTE_TEST_RUN_METHOD(method) void (*testMethod)() = method;testMethod();
typedef  struct testCore{
    HashMap *methodAll;      // 方法集合
    HashMap *methodAllState; //方法状态

} TestCore;
extern  TestCore *testCore;
void   test_Run_MethodAll(void (*initMethod)());
void test_Run_Method(char *methodName,void (*initMethod)());
void addTestMethodName( char *methodName,void *method,boolean state) ;

#endif //STUDY_TESTCORE_H
#include "testcore.h"
#include "malloc.h"
#include "string.h"
TestCore *testCore = NULL;
//创建一个测试环境
TestCore *createTestCore() {
    TestCore *testCore = (TestCore *) malloc(sizeof(TestCore));
    testCore->methodAll = createHashMap(200);
    testCore->methodAllState = createHashMap(200);
    return testCore;
}
/**
 *
 * @param hash
 * @param methodName   方法名
 * @param method     需要运行的方法
 * @param state     方法状态TRUE启用 FALSE禁用
 */
void addTestMethodName( char *methodName,void *method,boolean state) {
    if(testCore == NULL) {
        testCore = createTestCore();
    }
    putHashMap(testCore->methodAll, methodName,method);
    putHashMap(testCore->methodAllState, methodName,state);
}


/**
 * 运行指定的测试方法
 * @param methodName
 * @param initMethod
 */
void test_Run_Method(char *methodName,void (*initMethod)()) {
    initMethod();//初始化方法
    void *method = getHashMap(testCore->methodAll, methodName);
    if(method != NULL) {
        EXECUTE_TEST_RUN_METHOD(method)
    }
}
/**
 * 运行所有的测试方法,如果方法状态为FALSE则跳过
 * @param initMethod
 */
void   test_Run_MethodAll(void (*initMethod)()) {
    initMethod();//初始化方法
    HashMapIterator *pIterator = createHashMapIterator(testCore->methodAllState);
    while(hasNextHashMapIterator(pIterator)) {
        CharKvLinkedNode *pNode = nextHashMapIterator(pIterator);
       if(pNode->value == (void *)TRUE) {
           void *method = getHashMap(testCore->methodAll, pNode->key);
           EXECUTE_TEST_RUN_METHOD(method)
       }
    }
}

测试方法编写文件

注意: 测试文件的方法名称不要一样,否则后面会把前面的给顶替了

#ifndef STUDY_TESTMETHOD_H
#define STUDY_TESTMETHOD_H
#include "testcore.h"
void initMethod();
#endif //STUDY_TESTMETHOD_H
#include <stdio.h>
#include "testmethod.h"

void  test_1(){
    printf("test_1\n");
}
void  test_2(){
    printf("test_2\n");
}
void initMethod(){
    addTestMethodName("test_1",test_1,TRUE);
    addTestMethodName("test_2",test_2,TRUE);
}

验证

#include <stdio.h>
#include "unittest/testcore.h"
#include "unittest/testmethod.h"
int main() {
    printf("==============test_Run_MethodAll=============\n");
    //批量测试
    test_Run_MethodAll(initMethod);
    printf("==============test_Run_Method=============\n");
    //点对点测试
    test_Run_Method("test_1",initMethod);
    return (0);
}

现在我就能随心所欲的测试了,想测试那个模块就测试那个模块,而且还可批量测试

到此这篇关于C语言实现单元测试的示例详解的文章就介绍到这了,更多相关C语言单元测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C语言#define预处理宏定义

    详解C语言#define预处理宏定义

    本文主要介绍了C语言#define预处理宏定义,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • c语言中使用BF-KMP算法实例

    c语言中使用BF-KMP算法实例

    这篇文章主要介绍了c语言中使用BF-KMP算法,大家参考使用
    2013-11-11
  • C++单例模式的懒汉模式和饿汉模式详解

    C++单例模式的懒汉模式和饿汉模式详解

    这篇文章主要为大家详细介绍了C++懒汉模式和饿汉模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 使用UDP协议实现单词翻译服务器

    使用UDP协议实现单词翻译服务器

    这篇文章主要为大家详细介绍了如何使用UDP协议实现英文单词翻译服务器,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-08-08
  • 详解C++11中模板的优化问题

    详解C++11中模板的优化问题

    这篇文章主要介绍了C++11中模板的优化问题,通过实例代码得出结论,当所有模板参数都有默认参数时,函数模板的调用如同一个普通函数,具体示例代码跟随小编一起看看吧
    2021-09-09
  • ubuntu系统下C++调用matlab程序的方法详解

    ubuntu系统下C++调用matlab程序的方法详解

    学习c++与matlab混合编程一般是通过c++调用matlab函数,因为matlab具有强大的数学函数库,然而vc++具有界面设计灵活的优点,下面这篇文章主要给大家介绍了关于在ubuntu系统下C++调用matlab程序的方法,需要的朋友可以参考下。
    2017-08-08
  • C++键盘记录程序代码

    C++键盘记录程序代码

    这篇文章主要介绍了C++键盘记录程序代码,是Windows应用程序开发中非常实用的功能,该功能也常被一些远程操控程序所实用,需要的朋友可以参考下
    2014-10-10
  • win10系统下 VS2019点云库PCL1.12.0的安装与配置教程

    win10系统下 VS2019点云库PCL1.12.0的安装与配置教程

    点云库全称是Point Cloud Library(PCL),是一个独立的、大规模的、开放的2D/3D图像和点云处理项目,这篇文章主要介绍了win10系统下 VS2019点云库PCL1.12.0的安装与配置,需要的朋友可以参考下
    2022-07-07
  • VS2022设置编码方式为utf-8的三种方式小结

    VS2022设置编码方式为utf-8的三种方式小结

    本文主要介绍了VS2022设置编码方式为utf-8的三种方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • C++ LeetCode1812判断国际象棋棋盘格子颜色

    C++ LeetCode1812判断国际象棋棋盘格子颜色

    这篇文章主要为大家介绍了C++ LeetCode1812判断国际象棋棋盘格子颜色, 有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论