2010-03-25 38 views
1

我正在使用劫持函數調用並測試預期輸出值的單元測試套件。爲單元測試編寫一個複雜的預處理器宏

正常的佈局需要一個單元測試代碼塊的每個期望值。

由於我的代碼使用了大量的枚舉,我想用一些for循環/宏魔法自動執行自動測試,並且我正在尋找一些寫它的建議。

下面是測試代碼塊,我需要重複x次:

START_TEST("test_CallbackFn"); 

EXPECTED_CALLS("{{function1(param_type)#default}{function2(param_type)#default}}"); 

CallbackFn(); 

END_CALLS(); 
END_TEST(); 

現在,這裏是我會設想發生的歷史

for (int i = 0; i < 10; i++) 
{ 
    RUN_TEST(i) 
} 

現在,我想用我上面提到的代碼來定義RUN_TEST,除了我需要替換字符串默認與當前值。拋出我的是現有的EXPECTED_CALLS宏中存在的引號和#。

回答

2

我想我會考慮使用一個單獨的宏處理器,而不是試圖擊敗提交的C預處理器。人們指出的經典示例是m4,但是對於此,您可能會用awkperlpython或類似的東西做得更好。

+0

同意,我們使用python從配置文件中生成大量的鍋爐板C代碼 - 我們現在可以使用模板完成所有工作,但很高興能夠看到代碼是什麼實際上在消失到編譯器之前生成 – 2010-03-25 15:50:06

0

我不確定我是否完全理解這個問題,但是如果您希望EXPECTED_CALLS收到一個字符串,其中默認值被替換爲任何默認值的字符串值,您需要從字符串中刪除#default。即

EXPECTED_CALLS("{{function1(param_type)#default}{function2(param_type)#default}}"); 

應該

EXPECTED_CALLS("{{function1(param_type)"#default"}{function2(param_type)"#default"}}"); 
1

在我的經驗, 「複雜」 + 「宏」= 「不這樣做!」 C預處理器並沒有設計用來做任何強大的事情。雖然你可能能夠做一些功夫並且一起破解一些可行的功能,但使用腳本語言爲你生成C代碼會容易得多(因爲你可以讀取生成的代碼,所以它也更容易調試,確保它是正確的)。就我個人而言,我已經使用過Ruby多次,但Python,Perl,bash(等等)也應該工作。

0

它可能是:Boost.Preprocessor是相當令人印象深刻的,因爲它是。

對於enum可能有點困難,但也有在Boost.Preprocessor每個迴路等。

使用外部腳本的生成方法的問題是,它可能需要更多的外部化不僅僅是測試。除非你打算實施一個C++解析器,這個解析器在最好的時候被稱爲棘手......

所以你需要生成枚舉(將它們存儲在以json爲例),以便能夠生成測試這些枚舉之後...和事情開始變得毛茸茸的:/