[問題] 關於Unit Test的疑惑

看板Programming作者 (tylpk)時間18年前 (2007/07/11 00:08), 編輯推噓1(105)
留言6則, 1人參與, 最新討論串1/2 (看更多)
晚安 最近在思考有關程式設計的問題 其中有關Unit Test的部份 小弟一直搞不清楚C或C++在網路上找到的一些Test framwork 有什麼特別的地方嗎? 感覺似乎是幫忙比較測試的結果以及做一個結果的呈現 實際的測試應該還是要自己去寫 舉例來說:假設我今天要寫一個切割字串的函式 我將這些功能寫在一個class CStrToken裡 並提供了一個函數給使用者呼叫 //回傳值 : 一個存放切割字串的二維陣列 //szStr : 要切割的字串內容 //iLen : 要切割的字串長度 //chToken : 切割字串的依據 //piStrCnt : 切割後的字串個數 //piRes : 錯誤代碼(0表示成功,其餘為失敗值) char** GetString(char *szStr, int iLen, char chToken, int *piStrCnt, int *piRes); 底下是我寫的測試程式 #include <stdio.h> #include <stdlib.h> #include "../StrToken.h" //--------------------------------------------------------------------------- //測試用的Token char g_szToken[33] = {' ','!','\"','#','$','%','&','\'','(',')','*','+',',', '-','.','/',':',';','<','=','>','?','@','[','\\',']', '^','_','`','{','|','}','~'}; //判斷是否成功 int g_iOk = 1; //要測試的字串 char *g_pszTest; //Parse後的比較字串 char *g_pszCmp; //要測試的字串長度 int g_iStrSize; //Error寫檔用 FILE *g_f = NULL; //--------------------------------------------------------------------------- void GetTestStr(int iLen, int iCount, char chToken) { memset(g_pszTest, 0x00, g_iStrSize+1); memset(g_pszCmp, 0x00, g_iStrSize+1); int index = 0; for(int i = 0; i < iCount; i++) { for(int j = 0; j < iLen; j++) { g_pszTest[index] = (rand()%95)+32; if(g_pszTest[index] == chToken) j--; else index++; } if((i+1) != iCount) { g_pszTest[index] = chToken; index++; } } } //--------------------------------------------------------------------------- void CompareTest(char chToken) { CStrToken oToken; char **pszStr; int iStrCount = -999; int iRes = -999; pszStr = oToken.GetString(g_pszTest, g_iStrSize, chToken, &iStrCount, &iRes); if(pszStr != NULL) { int k = 0; int iStrLen; for(int i = 0; i < iStrCount; i++) { iStrLen = strlen(pszStr[i]); memcpy(&g_pszCmp[k], pszStr[i], iStrLen); if((i+1) != iStrCount) { g_pszCmp[k+iStrLen] = chToken; k += (iStrLen+1); } } if(strcmp(g_pszTest, g_pszCmp) != 0) { g_iOk = 0; fprintf(g_f, "ErrorTest:\r\n"); fprintf(g_f, "Token = %c\r\n", chToken); fprintf(g_f, "OriStr = %s\r\n", g_pszTest); fprintf(g_f, "CmpStr = %s\r\n\r\n", g_pszCmp); } } else { g_iOk = 0; fprintf(g_f, "ErrorStrToken:\r\n"); fprintf(g_f, "StrCount = %d\r\n", iStrCount); fprintf(g_f, "ErrCode = %d\r\n\r\n", iRes); } } //--------------------------------------------------------------------------- void DeleteFile(void) { g_f = fopen("TestResult.txt", "wb"); if(g_f) { fclose(g_f); } } //--------------------------------------------------------------------------- void InitVar(int iCount, int iLen) { g_iStrSize = (iCount*iLen+iCount-1); g_pszTest = new char[g_iStrSize+1]; g_pszCmp = new char[g_iStrSize+1]; } //--------------------------------------------------------------------------- void ResetVar(void) { if(g_pszTest) { delete g_pszTest; g_pszTest = NULL; } if(g_pszCmp) { delete g_pszCmp; g_pszCmp = NULL; } fclose(g_f); } //--------------------------------------------------------------------------- void ShowResult(void) { if(!g_iOk) printf("Test Fail ! \n\n"); else printf("Test Success ! \n\n"); } //--------------------------------------------------------------------------- int main(int argc, char *argv[]) { srand((unsigned int)time(0)); DeleteFile(); g_f = fopen("TestResult.txt", "ab"); if(g_f == NULL) return 0; int iDo; int iLen; int iCount; printf("請輸入字串的個數 : "); scanf("%d", &iCount); printf("請輸入各字串的長度 : "); scanf("%d", &iLen); printf("請輸入測試的次數 : "); scanf("%d", &iDo); printf("\r\n"); InitVar(iCount, iLen); //開始測試 char chToken; for(int i = 0; i < iDo; i++) { for(int j = 0; j < 33; j++) { chToken = g_szToken[j]; GetTestStr(iLen, iCount, chToken); CompareTest(chToken); } } ResetVar(); ShowResult(); system("PAUSE"); return 0; } //--------------------------------------------------------------------------- 總覺得自己寫的測試程式無法套用在現成的framework上 也或許是自己不是很懂Unit Test 網路上說Unit Test應該要簡單、易懂 所以是我誤會了Unit Test的意義嗎? 不知道有沒有人可以幫我解惑呢? 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.232.211.161

07/11 00:26, , 1F
試試其他的Unit Test framework吧, 不用
07/11 00:26, 1F

07/11 00:27, , 2F
一下很難知道怎樣才叫好用的.
07/11 00:27, 2F

07/11 00:28, , 3F
不過C++嘛... 簡單的function用Assert
07/11 00:28, 3F

07/11 00:28, , 4F
做測試就好?
07/11 00:28, 4F

07/11 00:29, , 5F
雖然無法產生report, 也不可以一次為
07/11 00:29, 5F

07/11 00:30, , 6F
每一項目測試...
07/11 00:30, 6F
文章代碼(AID): #16awxWMP (Programming)
文章代碼(AID): #16awxWMP (Programming)