[討論] multi-function test 技巧.

看板C_and_CPP作者 (藍影)時間14年前 (2011/12/02 00:13), 編輯推噓2(2012)
留言14則, 5人參與, 最新討論串1/2 (看更多)
顯少看到版上發這類型的討論文,也可能較少人專門做測試這塊。 先提最大疑問: 目前有沒有 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

12/02 00:19, , 1F
int f1_alt(int a, int b, int c){return f1(a);} 這樣如何?
12/02 00:19, 1F

12/02 00:23, , 2F
L大方法有想過,卡在若是測速度的話會拉慢.還有要架構出
12/02 00:23, 2F

12/02 00:23, , 3F
f1_alt~fn_alt 出來 (這應倒還是其次,不會佔太多時間).
12/02 00:23, 3F

12/02 00:30, , 4F
感覺有點危險,多出來的參數不知道會蓋到什麼東西
12/02 00:30, 4F

12/02 02:20, , 5F
3-As pattern, 還有不同的測試像 ECP BVA 都了解一下
12/02 02:20, 5F

12/02 02:20, , 6F
如果三個函式可以被綁在一起測, 那他們就是同一個函式
12/02 02:20, 6F

12/02 02:21, , 7F
這個數值當然不應該儲存起來然後用人眼去比對, 那樣就
12/02 02:21, 7F

12/02 02:21, , 8F
不叫測試了
12/02 02:21, 8F
先謝謝提供 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)

12/02 03:00, , 9F
至於L大說的那個方法, gcc -fipa-sra 不知道可否達成
12/02 03:00, 9F

12/02 03:00, , 10F
加速的需求, 對於 unused parameters
12/02 03:00, 10F

12/02 03:04, , 11F
以 functor 作為引數應該不會太難
12/02 03:04, 11F

12/02 08:48, , 12F
可不可以用int func(int a, int b=0 ,int c=0)這樣呢
12/02 08:48, 12F

12/02 17:44, , 13F
樓上這樣就和原文改原來的 function 一樣了...
12/02 17:44, 13F

12/02 18:56, , 14F
L 大方法配 gcc 參數可行,謝謝提供 :)
12/02 18:56, 14F
文章代碼(AID): #1ErwUDCc (C_and_CPP)
文章代碼(AID): #1ErwUDCc (C_and_CPP)