作者tropical72 (藍影)
看板C_and_CPP
標題[討論] multi-function test 技巧.
時間Fri Dec 2 00:12:57 2011
顯少看到版上發這類型的討論文,也可能較少人專門做測試這塊。
先提最大疑問:
目前有沒有 tool 可以自動生成測資,
測試程式直接 redirect 至該 file 即可?
每次自己寫的 function 自己測,要完整測試所花時間,
根本和開發時間沒什麼兩樣
Orz..
接下來提的例子算有點特例,有一批作用目的相同,方法不同之 function,
要測其準確性,像是
int f1(int);
int f2(int);
...
int fn(int);
這方式要手動測不難,
typedef int (*pFunc)(int);
pFunc p[] = {f1, f2, ..fn};
int y[MAX]={0};
for(i=0; i<sizeof(p)/sizeof(*p); ++i)
for(j=low; j<=up; j+=step) {
y[j] = p[i](j);
/* log y[j] */
}
比較常見到的是,裡面需要「額外」的幾個引數
( 這也是前提,是 extension,不是 different)
int f1(int a);
int f2(int a, int b); // 多了 b
int f3(int a, int b, int c); // 又多了 c
這時候要測就有不少可議性,
最沒問題的方法是一個一個測,但如果有近 10 個方法,就要寫 10 次測試函式,
於是想出了異想天開的方式, 拿最長的引數為基準,其它的全都擴出去,也就是
int fa(int a, int b, int c); // b, c 沒用
int fb(int a, int b, int c); // c 沒用
int fc(int a, int b, int c); // 都用
再以 function pointer 方式呼叫,不過這樣下來就改到了原 function,不好。
於是嚐試了較危險的作法,以上述 f1, f2, f3 為例。
typedef int (*pfLong)(int, int , int); // 定義最長的引數
pfLong p[] = {(pfLong)f1, (pfLong)f2, f3}; /* 硬轉型 */
int y[MAX]={0};
for(i=0; i<sizeof(p)/sizeof(*p); ++i)
for(j=low; j<=up; j+=step) {
y[j] = p[i](j,j,j); /* 沒用到的塞 garbge */
/* log y[j] */
}
目前這作法試過 vc, gcc, 是沒什麼大問題, 只怕到時會出包,
所以也不敢建議有相同困擾之同好以此法解決。
不知各位版友對於是否也有類似的測試經驗可提出一起討論?
( 小弟也蠻好奇 c++ 那塊有沒有較特殊的作法 )
謝謝各位細心閱讀,最後懇請不吝賜教。
--
No matter how gifted you are,
alone, can not change the world.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41
推 LPH66:int f1_alt(int a, int b, int c){return f1(a);} 這樣如何? 12/02 00:19
→ tropical72:L大方法有想過,卡在若是測速度的話會拉慢.還有要架構出 12/02 00:23
→ tropical72:f1_alt~fn_alt 出來 (這應倒還是其次,不會佔太多時間). 12/02 00:23
→ yan12125:感覺有點危險,多出來的參數不知道會蓋到什麼東西 12/02 00:30
→ loveme00835:3-As pattern, 還有不同的測試像 ECP BVA 都了解一下 12/02 02:20
→ loveme00835:如果三個函式可以被綁在一起測, 那他們就是同一個函式 12/02 02:20
→ loveme00835:這個數值當然不應該儲存起來然後用人眼去比對, 那樣就 12/02 02:21
→ loveme00835:不叫測試了 12/02 02:21
先謝謝提供 keyword, 但 3-As pattern 指的是 ?
指的是先將 n 個 function 引數模式為 m 類,再寫 m 份測試 pattern 嗎?
我該舉個例子,這和大多之 ECP, BVA 舉的 username / password 不同,
假設寫了一份 C(m,n),和另一份 fastC(m,n,eps),
這目的應都屬相同,參數不同,引數、精準度也不同,
(在一些場合裡根本用不到那麼高精準度,只需要速度),
在測試時我想是可被綁在一起測的,以正確性而言,只是裡面要紀錄的是
max_err_x / max_err_y,原文裡全都用 log y[j] 確實不合適。
※ 編輯: tropical72 來自: 180.177.78.41 (12/02 03:01)
→ loveme00835:至於L大說的那個方法, gcc -fipa-sra 不知道可否達成 12/02 03:00
→ loveme00835:加速的需求, 對於 unused parameters 12/02 03:00
→ loveme00835:以 functor 作為引數應該不會太難 12/02 03:04
→ x000032001:可不可以用int func(int a, int b=0 ,int c=0)這樣呢 12/02 08:48
推 LPH66:樓上這樣就和原文改原來的 function 一樣了... 12/02 17:44
→ tropical72:L 大方法配 gcc 參數可行,謝謝提供 :) 12/02 18:56