作者tylpk (tylpk)
看板Programming
标题[问题] 关於Unit Test的疑惑
时间Wed Jul 11 00:07:59 2007
晚安
最近在思考有关程式设计的问题
其中有关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
1F:推 leicheong:试试其他的Unit Test framework吧, 不用 58.152.218.98 07/11 00:26
2F:→ leicheong:一下很难知道怎样才叫好用的. 58.152.218.98 07/11 00:27
3F:→ leicheong:不过C++嘛... 简单的function用Assert 58.152.218.98 07/11 00:28
4F:→ leicheong:做测试就好? 58.152.218.98 07/11 00:28
5F:→ leicheong:虽然无法产生report, 也不可以一次为 58.152.218.98 07/11 00:29
6F:→ leicheong:每一项目测试... 58.152.218.98 07/11 00:30