網(wǎng)站首頁 編程語言 正文
前沿
單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。對(duì)于單元測(cè)試中單元的含義,一般來說,要根據(jù)實(shí)際情況去判定其具體含義,如C語言中單元指一個(gè)函數(shù),Java里單元指一個(gè)類,圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等。總的來說,單元就是人為規(guī)定的最小的被測(cè)功能模塊。單元測(cè)試是在軟件開發(fā)過程中要進(jìn)行的最低級(jí)別的測(cè)試活動(dòng),軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測(cè)試。
在網(wǎng)上找了找C語言都沒有類似java 的junit單元測(cè)試 ,反復(fù)測(cè)試自己寫的模塊非常費(fèi)勁,特別是交叉模塊測(cè)試的時(shí)候根本就無法弄
因?yàn)橐粋€(gè)程序只允許一個(gè)main方法,如果其他地方存在了,那么就會(huì)報(bào)錯(cuò),這就導(dǎo)致了測(cè)完A模塊想要測(cè)試B模塊就需要把A模塊測(cè)試的相關(guān)內(nèi)容刪除,這樣會(huì)出現(xiàn)什么問題呢? 如果后期我們對(duì)A模塊的內(nèi)容進(jìn)行了修改,那么是不是需要在重新寫一套測(cè)試Demo, 這樣非常浪費(fèi)時(shí)間和精力 ,沒辦法只能自己開發(fā)一套類似的,來協(xié)助本地開發(fā)進(jìn)行測(cè)試代碼
使用前提
自己必須有集合數(shù)據(jù)結(jié)構(gòu)和hash結(jié)構(gòu)
測(cè)試框架如下
#ifndef STUDY_TESTCORE_H
#define STUDY_TESTCORE_H
#include "../structure/charHash.h"
typedef int boolean;//定義一個(gè)布爾類型
#define TRUE 1
#define FALSE 0
#define EXECUTE_TEST_RUN_METHOD(method) void (*testMethod)() = method;testMethod();
typedef struct testCore{
HashMap *methodAll; // 方法集合
HashMap *methodAllState; //方法狀態(tài)
} 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;
//創(chuàng)建一個(gè)測(cè)試環(huán)境
TestCore *createTestCore() {
TestCore *testCore = (TestCore *) malloc(sizeof(TestCore));
testCore->methodAll = createHashMap(200);
testCore->methodAllState = createHashMap(200);
return testCore;
}
/**
*
* @param hash
* @param methodName 方法名
* @param method 需要運(yùn)行的方法
* @param state 方法狀態(tài)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);
}
/**
* 運(yùn)行指定的測(cè)試方法
* @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)
}
}
/**
* 運(yùn)行所有的測(cè)試方法,如果方法狀態(tài)為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)
}
}
}
測(cè)試方法編寫文件
注意: 測(cè)試文件的方法名稱不要一樣,否則后面會(huì)把前面的給頂替了
#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);
}
驗(yàn)證
#include <stdio.h>
#include "unittest/testcore.h"
#include "unittest/testmethod.h"
int main() {
printf("==============test_Run_MethodAll=============\n");
//批量測(cè)試
test_Run_MethodAll(initMethod);
printf("==============test_Run_Method=============\n");
//點(diǎn)對(duì)點(diǎn)測(cè)試
test_Run_Method("test_1",initMethod);
return (0);
}
現(xiàn)在我就能隨心所欲的測(cè)試了,想測(cè)試那個(gè)模塊就測(cè)試那個(gè)模塊,而且還可批量測(cè)試
原文鏈接:https://blog.csdn.net/weixin_45203607/article/details/126660961
相關(guān)推薦
- 2023-01-19 GO語言的map類型實(shí)例詳解_Golang
- 2022-05-24 Django基礎(chǔ)CBV裝飾器和中間件的應(yīng)用示例_python
- 2022-05-01 WinForm中Application.Idle方法詳解_C#教程
- 2022-05-23 ZooKeeper分布式協(xié)調(diào)服務(wù)設(shè)計(jì)核心概念及安裝配置_zabbix
- 2022-03-27 Android自定義模擬時(shí)鐘控件_Android
- 2023-01-17 C#實(shí)現(xiàn)帶行數(shù)和標(biāo)尺的RichTextBox_C#教程
- 2022-08-04 Android學(xué)習(xí)之Span的使用方法詳解_Android
- 2022-04-01 k8s 1.22 安裝ingress報(bào)錯(cuò)the server could not find the
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支