日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cxxtest单元测试框架源码分析(二):所有对外功能实现分析

發布時間:2023/11/29 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cxxtest单元测试框架源码分析(二):所有对外功能实现分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?? ?CxxTest的大部分診斷功能都是通過宏定義實現的,而且這部分的定義以及所有測試套的基類CxxTest:TestSuite定義和實現都在TestSuite.h和TestSuite.cpp里面。下面我們將通過分析這兩個文件來分析CxxTest的對外功能體現。

??1?//所有的類以及定義都是在CxxTest名稱空間中
??2?namespace?CxxTest??
??3?{
??4?????//下面是測試套的定義,三個虛函數;在TestSuite.cpp中有實現,不過在你寫的測試套中可以重載它
??5?????class?TestSuite??
??6?????{
??7?????public:
??8?????????virtual?~TestSuite();
??9?????????virtual?void?setUp();????//在該測試套的每個用例的執行之前運行,可以用于建立初始環境
?10?????????virtual?void?tearDown();?//在該測試套的每個用例的執行之后運行,可以用于恢復初始環境
?11?????};
?12?????
?13?????class?AbortTest?{};?????????//用于拋出測試終止異常,在定義了_CXXTEST_HAVE_EH時有效
?14?????void?doAbortTest();
?15?#???define?TS_ABORT()?CxxTest::doAbortTest()
?16?????
?17?????//下面這兩個接口分別用于控制當診斷失敗時,是否繼續運行,默認為繼續運行
?18?????bool?abortTestOnFail();
?19?????void?setAbortTestOnFail(?bool?value?=?CXXTEST_DEFAULT_ABORT?);
?20?
?21?????//下面兩個接口用于設置最大Dump的大小
?22?????unsigned?maxDumpSize();
?23?????void?setMaxDumpSize(?unsigned?value?=?CXXTEST_MAX_DUMP_SIZE?);
?24?
?25?????//下面的接口對應到TS_TRACE,用于跟蹤信息
?26?????void?doTrace(?const?char?*file,?unsigned?line,?const?char?*message?);
?27?
?28?????//下面的接口對應到TS_WARN,用于打印to-do?list
?29?????void?doWarn(?const?char?*file,?unsigned?line,?const?char?*message?);
?30?
?31?????//下面的接口對應TS_FAIL宏,直接診斷失敗
?32?????void?doFailTest(?const?char?*file,?unsigned?line,?const?char?*message?);
?33?
?34?????//下面的接口對應TS_ASSERT宏,直接表達式是否為真
?35?????void?doFailAssert(?const?char?*file,?unsigned?line,?const?char?*expression,?const?char?*message?);
?36?????
?37?????//下面的接口對應TS_ASSERT_EQUALS宏,用于判斷兩個值是否相等。因為涉及不同的基本類型,所以這里定義是函數模板
?38?????template<class?X,?class?Y>
?39?????bool?equals(?X?x,?Y?y?)
?40?????{
?41?????????return?(x?==?y);
?42?????}
?43?
?44?????template<class?X,?class?Y>
?45?????void?doAssertEquals(?const?char?*file,?unsigned?line,
?46??????????????????????????const?char?*xExpr,?X?x,
?47??????????????????????????const?char?*yExpr,?Y?y,
?48??????????????????????????const?char?*message?)
?49?????{
?50?????????if?(?!equals(?x,?y?)?)?{
?51?????????????if?(?message?)
?52?????????????????tracker().failedTest(?file,?line,?message?);
?53?????????????tracker().failedAssertEquals(?file,?line,?xExpr,?yExpr,?TS_AS_STRING(x),?TS_AS_STRING(y)?);
?54?????????????TS_ABORT();
?55?????????}
?56?????}
?57?
?58?????//下面的接口對應TS_ASSERT_SAME_DATA宏,用于判斷給定大小的兩段數據是否相等。
?59?????void?doAssertSameData(?const?char?*file,?unsigned?line,
?60????????????????????????????const?char?*xExpr,?const?void?*x,
?61????????????????????????????const?char?*yExpr,?const?void?*y,
?62????????????????????????????const?char?*sizeExpr,?unsigned?size,
?63????????????????????????????const?char?*message?);
?64?
?65??????//下面的接口對應TS_ASSERT_DIFFERS宏,用于診斷兩個值不相等,同樣定義為函數模板。
?66?????template<class?X,?class?Y>
?67?????bool?differs(?X?x,?Y?y?)
?68?????{
?69?????????return?!(x?==?y);
?70?????}
?71?
?72?????template<class?X,?class?Y>
?73?????void?doAssertDiffers(?const?char?*file,?unsigned?line,
?74???????????????????????????const?char?*xExpr,?X?x,
?75???????????????????????????const?char?*yExpr,?Y?y,
?76???????????????????????????const?char?*message?)
?77?????{
?78?????????if?(?!differs(?x,?y?)?)?{
?79?????????????if?(?message?)
?80?????????????????tracker().failedTest(?file,?line,?message?);
?81?????????????tracker().failedAssertDiffers(?file,?line,?xExpr,?yExpr,?TS_AS_STRING(x)?);
?82?????????????TS_ABORT();
?83?????????}
?84?????}
?85?
?86?????//下面的接口對應TS_ASSERT_LESS_THAN宏,用于診斷兩個值是否為滿足<,同樣定義為函數模板。
?87?????template<class?X,?class?Y>
?88?????bool?lessThan(?X?x,?Y?y?)
?89?????{
?90?????????return?(x?<?y);
?91?????}
?92?
?93?????template<class?X,?class?Y>
?94?????void?doAssertLessThan(?const?char?*file,?unsigned?line,
?95????????????????????????????const?char?*xExpr,?X?x,
?96????????????????????????????const?char?*yExpr,?Y?y,
?97????????????????????????????const?char?*message?)
?98?????{
?99?????????if?(?!lessThan(x,?y)?)?{
100?????????????if?(?message?)
101?????????????????tracker().failedTest(?file,?line,?message?);
102?????????????tracker().failedAssertLessThan(?file,?line,?xExpr,?yExpr,?TS_AS_STRING(x),?TS_AS_STRING(y)?);
103?????????????TS_ABORT();
104?????????}
105?????}
106?
107????//下面的接口對應TS_ASSERT_LESS_THAN_EQUALS宏,用于診斷兩個值是否為滿足<=,同樣定義為函數模板。
108?????template<class?X,?class?Y>
109?????bool?lessThanEquals(?X?x,?Y?y?)
110?????{
111?????????return?(x?<=?y);
112?????}
113?
114?????template<class?X,?class?Y>
115?????void?doAssertLessThanEquals(?const?char?*file,?unsigned?line,
116??????????????????????????????????const?char?*xExpr,?X?x,
117??????????????????????????????????const?char?*yExpr,?Y?y,
118??????????????????????????????????const?char?*message?)
119?????{
120?????????if?(?!lessThanEquals(?x,?y?)?)?{
121?????????????if?(?message?)
122?????????????????tracker().failedTest(?file,?line,?message?);
123?????????????tracker().failedAssertLessThanEquals(?file,?line,?xExpr,?yExpr,?TS_AS_STRING(x),?TS_AS_STRING(y)?);
124?????????????TS_ABORT();
125?????????}
126?????}
127?
128????//下面的接口對應TS_ASSERT_PREDICATE宏,用于診斷P(x)表達式,同樣定義為函數模板。
129?????template<class?X,?class?P>
130?????void?doAssertPredicate(?const?char?*file,?unsigned?line,
131?????????????????????????????const?char?*pExpr,?const?P?&p,
132?????????????????????????????const?char?*xExpr,?X?x,
133?????????????????????????????const?char?*message?)
134?????{
135?????????if?(?!p(?x?)?)?{
136?????????????if?(?message?)
137?????????????????tracker().failedTest(?file,?line,?message?);
138?????????????tracker().failedAssertPredicate(?file,?line,?pExpr,?xExpr,?TS_AS_STRING(x)?);
139?????????????TS_ABORT();
140?????????}
141?????}
142?
143????//下面的接口對應TS_ASSERT_RELATION宏,用于診斷R(x,y)表達式,同樣定義為函數模板。
144?????template<class?X,?class?Y,?class?R>
145?????void?doAssertRelation(?const?char?*file,?unsigned?line,
146????????????????????????????const?char?*rExpr,?const?R?&r,?
147????????????????????????????const?char?*xExpr,?X?x,
148????????????????????????????const?char?*yExpr,?Y?y,
149????????????????????????????const?char?*message?)
150?????{
151?????????if?(?!r(?x,?y?)?)?{
152?????????????if?(?message?)
153?????????????????tracker().failedTest(?file,?line,?message?);
154?????????????tracker().failedAssertRelation(?file,?line,?rExpr,?xExpr,?yExpr,?TS_AS_STRING(x),?TS_AS_STRING(y)?);
155?????????????TS_ABORT();
156?????????}
157?????}
158?
159????//下面的接口對應TS_ASSERT_DELTA宏,用于診斷(y?>=?x?-?d)?&&?(y?<=?x?+?d)表達式,同樣定義為函數模板。
160?????template<class?X,?class?Y,?class?D>
161?????bool?delta(?X?x,?Y?y,?D?d?)
162?????{
163?????????return?((y?>=?x?-?d)?&&?(y?<=?x?+?d));
164?????}
165?
166?????template<class?X,?class?Y,?class?D>
167?????void?doAssertDelta(?const?char?*file,?unsigned?line,
168?????????????????????????const?char?*xExpr,?X?x,
169?????????????????????????const?char?*yExpr,?Y?y,
170?????????????????????????const?char?*dExpr,?D?d,
171?????????????????????????const?char?*message?)
172?????{
173?????????if?(?!delta(?x,?y,?d?)?)?{
174?????????????if?(?message?)
175?????????????????tracker().failedTest(?file,?line,?message?);
176?????????????
177?????????????tracker().failedAssertDelta(?file,?line,?xExpr,?yExpr,?dExpr,
178??????????????????????????????????????????TS_AS_STRING(x),?TS_AS_STRING(y),?TS_AS_STRING(d)?);
179?????????????TS_ABORT();
180?????????}
181?????}
182?
183????//下面的接口對應除TS_ASSERT_THROWS_NOTHING宏以外的所有對外異常宏診斷。
184?????void?doFailAssertThrows(?const?char?*file,?unsigned?line,
185??????????????????????????????const?char?*expr,?const?char?*type,
186??????????????????????????????bool?otherThrown,
187??????????????????????????????const?char?*message?);
188?????
189????//下面的接口對應TS_ASSERT_THROWS_NOTHING宏,用于診斷沒有拋出任何異常。
190?????void?doFailAssertThrowsNot(?const?char?*file,?unsigned?line,
191?????????????????????????????????const?char?*expression,?const?char?*message?);
192?
193????//下面的接口對應TS_ASSERT_SAME_FILES宏,用于診斷兩個文件是否相等(這個功能還沒有發布)。
194?????void?doAssertSameFiles(?const?char*?file,?unsigned?line,
195?????????????????????????????const?char*?file1,?const?char*?file2,
196?????????????????????????????const?char*?message);
197?
198????//下面這里定義了兩組異常相關的宏,如果沒有定義_CXXTEST_HAVE_EH,則全部為空
199?#???ifdef?_CXXTEST_HAVE_EH
200?#???????define?_TS_TRY?try
201?#???????define?_TS_CATCH_TYPE(t,?b)?catch?t?b
202?#???????define?_TS_CATCH_ABORT(b)?_TS_CATCH_TYPE(?(const?CxxTest::AbortTest?&),?b?)
203?#???????define?_TS_LAST_CATCH(b)?_TS_CATCH_TYPE(?(),?b?)
204?#???????define?_TSM_LAST_CATCH(f,l,m)?_TS_LAST_CATCH(?{?(CxxTest::tracker()).failedTest(f,l,m);?}?)
205?????????//下面根據是否定義了使用標準庫宏,來決定是否加入std::exception異常的捕獲處理
206?#???????ifdef?_CXXTEST_HAVE_STD
207?#???????????define?___TSM_CATCH(f,l,m)?\
208?????????????????????catch(const?std::exception?&e)?{?(CxxTest::tracker()).failedTest(f,l,e.what());?}?\
209?????????????????????_TSM_LAST_CATCH(f,l,m)
210?#???????else?//?!_CXXTEST_HAVE_STD
211?#???????????define?___TSM_CATCH(f,l,m)?_TSM_LAST_CATCH(f,l,m)
212?#???????endif?//?_CXXTEST_HAVE_STD
213?#???????define?__TSM_CATCH(f,l,m)?\
214?????????????????_TS_CATCH_ABORT(?{?throw;?}?)?\
215?????????????????___TSM_CATCH(f,l,m)
216?#???????define?__TS_CATCH(f,l)?__TSM_CATCH(f,l,"Unhandled?exception")
217?#???????define?_TS_CATCH?__TS_CATCH(__FILE__,__LINE__)
218?#???else?//?!_CXXTEST_HAVE_EH
219?#???????define?_TS_TRY
220?#???????define?___TSM_CATCH(f,l,m)
221?#???????define?__TSM_CATCH(f,l,m)
222?#???????define?__TS_CATCH(f,l)
223?#???????define?_TS_CATCH
224?#???????define?_TS_CATCH_TYPE(t,?b)
225?#???????define?_TS_LAST_CATCH(b)
226?#???????define?_TS_CATCH_ABORT(b)
227?#???endif?//?_CXXTEST_HAVE_EH
228?
229?????//下面就是所有對外的診斷宏定義,對于基本的診斷包含了四類:
230?????//1、標準的診斷?TS_ASSERT_XXX形式命名,如:TS_ASSERT(e)
231?????//2、定義自己異常處理診斷?ETS_ASSERT_XXX形式命名,如:ETS_ASSERT(e)?
232?????//3、帶了消息的打印的診斷?TSM_ASSERT_XXX形式命名,如:TSM_ASSERT(m,e)
233?????//4、既自己處理異常又帶有消息的診斷?ETSM_ASSERT_XXX形式命名,如:ETSM_ASSERT(m,e)
234?
235?????//?TS_TRACE
236?#???define?_TS_TRACE(f,l,e)?CxxTest::doTrace(?(f),?(l),?TS_AS_STRING(e)?)
237?#???define?TS_TRACE(e)?_TS_TRACE(?__FILE__,?__LINE__,?e?)
238?
239?????//?TS_WARN
240?#???define?_TS_WARN(f,l,e)?CxxTest::doWarn(?(f),?(l),?TS_AS_STRING(e)?)
241?#???define?TS_WARN(e)?_TS_WARN(?__FILE__,?__LINE__,?e?)
242?
243?????。。。。這部分都是對外宏定義,這里省略,大家一看應該就明白
244??

245?}?

在TestSuite.cpp主要實現了在TestSuite.h中定義的非模板函數,都比較簡單,所有這里就不再解析了。這里主要分析一個函數,關于診斷失敗時是否退出的處理函數,?

1?????void?doAbortTest()//實現在診斷失敗時是否停止該用例的執行
2?????{
3???????//從這里可以看出_CXXTEST_HAVE_EH和CXXTEST_ABORT_TEST_ON_FAIL為什么要一起使用了吧
4???????#if??defined(_CXXTEST_HAVE_EH)
5??????????if?(?currentAbortTestOnFail?)
6???????????????throw?AbortTest();
7???????#endif?//?_CXXTEST_HAVE_EH9????

8?????}

OK,本文就分析到這里。

(PS:今天發這個帖子寫了兩遍,第一次剛寫完Google瀏覽器就掛了,暈倒!!!!)?

版權說明

轉載改文章請指明出處http://www.cnblogs.com/xiaocheng,多謝!

Author: Elvis.Chen?

轉載于:https://www.cnblogs.com/xiaocheng/archive/2009/06/17/1505391.html

總結

以上是生活随笔為你收集整理的cxxtest单元测试框架源码分析(二):所有对外功能实现分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。