?? rcunit_stepbystep.html
字號:
CUNIT_DECL_TEST <span class="keywordtype">void</span> TestSample_Null(){ <span class="keywordtype">int</span> nRet = GetPrime(NULL, 4); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(0, nRet);}</pre></div><p>往 TestSample 測試集中添加測試用例。 <div class="fragment"><pre class="fragment"><a class="code" href="group__rcunit__write__test__suite.html#ga0">CUNIT_TEST_SUITE_BEGIN</a>(TestSample); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_NormalCase); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_Zero); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_Negative); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_One); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_Null);<a class="code" href="group__rcunit__write__test__suite.html#ga4">CUNIT_TEST_SUITE_END</a>();</pre></div><p>注意:兩個測試集名字不能重復,不同測試集的測試用例的名字也不能重復。<h2><a class="anchor" name="analyse_results">分析測試結果</a></h2>到此為止,完成了所有的工作了,編譯整個 TestGetPrime 工程吧! 不過,并不順利,編譯結果如下:<p><div align="center"><img src="rcunit_stepbystep_errors.gif" alt="rcunit_stepbystep_errors.gif"><p><strong>編譯錯誤</strong></p></div> 雙擊錯誤信息,代碼窗口會跳轉到對應的代碼。<p><div align="center"><img src="rcunit_stepbystep_error_code.gif" alt="rcunit_stepbystep_error_code.gif"><p><strong>出錯代碼</strong></p></div> 這個測試用例不能通過,這說明功能函數 GetPrime 的實現有問題。<h2><a class="anchor" name="rectify_errors">修改代碼錯誤</a></h2>仔細的閱讀代碼及 Debug ,找出了代碼錯誤,修改后的代碼如下,在內層 while 循環增加了對 k 復位的操作: <div class="fragment"><pre class="fragment"><span class="keywordtype">int</span> GetPrime(<span class="keywordtype">int</span> arr[],<span class="keywordtype">int</span> nPrime){ <span class="keywordtype">int</span> count; <span class="comment">/*已檢測出是素數的數的個數*/</span> <span class="keywordtype">int</span> currentNumber; <span class="comment">/*當前要檢測是否素數的數*/</span> <span class="keywordtype">int</span> k; <span class="keywordflow">if</span>(arr == NULL) { <span class="keywordflow">return</span> 0; } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nPrime <= 0) { <span class="keywordflow">return</span> 0; } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(nPrime == 1) { arr[0] = 2; <span class="keywordflow">return</span> 1; } <span class="keywordflow">else</span> { ; } arr[0] = 2; count = 1; currentNumber = 3; <span class="keywordflow">while</span>(count < nPrime) { k=0; <span class="keywordflow">while</span>(arr[k] * arr[k] <= currentNumber) { <span class="keywordflow">if</span>(currentNumber % arr[k] == 0) { <span class="comment">/*currentNumber是合數*/</span> currentNumber += 2; k = 0; <span class="comment">/* == 開始新的素數搜索,k需要復位 == */</span> } <span class="keywordflow">else</span> { k++; } } <span class="comment">/*currentNumber是素數*/</span> arr[count++] = currentNumber; currentNumber += 2; } <span class="keywordflow">return</span> nPrime;}</pre></div><p>再次編譯,所有的測試用例通過。<h2><a class="anchor" name="test_suite_resources">測試集的資源申請及釋放</a></h2>在測試中,可能一個測試集中的所有的測試用例都存在某些相同的動作。 例如:運行被測試函數前,申請緩沖區內存,運行完畢之后釋放緩沖區內存。 RCUnit 提供了為了測試集的初始化及資源釋放各提供了一個統一的接口。 要使用這兩個接口,我們需要在測試集中聲明使用該接口,并且實現這個函數。 采用這種方式的完整代碼如下: <div class="fragment"><pre class="fragment"><span class="preprocessor">#ifdef __cplusplus</span><span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> {<span class="preprocessor">#endif</span><span class="preprocessor"></span><span class="preprocessor">#include <malloc.h></span><span class="preprocessor">#include <<a class="code" href="rcunit_8h.html">rcunit/rcunit.h</a>></span><span class="preprocessor">#include "../GetPrime/Primer.h"</span><span class="preprocessor">#define NULL ((void*)0)</span><span class="preprocessor"></span><a class="code" href="group__rcunit__write__test__suite.html#ga0">CUNIT_TEST_SUITE_BEGIN</a>(TestSample); <a class="code" href="group__rcunit__write__test__suite.html#ga1">CUNIT_HANDLE_SET_UP</a>(TestSample_setUp); <a class="code" href="group__rcunit__write__test__suite.html#ga2">CUNIT_HANDLE_TEAR_DOWN</a>(TestSample_tearDown); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_NormalCase); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_Zero); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_Negative); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_One); <a class="code" href="group__rcunit__write__test__suite.html#ga3">CUNIT_TEST</a>(TestSample_Null);<a class="code" href="group__rcunit__write__test__suite.html#ga4">CUNIT_TEST_SUITE_END</a>();<span class="keyword">static</span> <span class="keywordtype">int</span>* _pPrimeArray = NULL;CUNIT_DECL_TEST <span class="keywordtype">void</span> TestSample_setUp(){ _pPrimeArray = (<span class="keywordtype">int</span>*)malloc(<span class="keyword">sizeof</span>(<span class="keywordtype">int</span>)*100);}CUNIT_DECL_TEST <span class="keywordtype">void</span> TestSample_tearDown(){ free(_pPrimeArray);}<span class="comment">/* 測試普通的情況 */</span>CUNIT_DECL_TEST <span class="keywordtype">void</span> TestSample_NormalCase(){ <span class="keywordtype">int</span> nRet = GetPrime(_pPrimeArray, 10); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(10, nRet); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(2, _pPrimeArray[0]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(3, _pPrimeArray[1]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(5, _pPrimeArray[2]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(7, _pPrimeArray[3]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(11, _pPrimeArray[4]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(13, _pPrimeArray[5]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(17, _pPrimeArray[6]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(19, _pPrimeArray[7]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(23, _pPrimeArray[8]); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(29, _pPrimeArray[9]);}<span class="comment">/* 測試n = 0的情況 */</span>CUNIT_DECL_TEST <span class="keywordtype">void</span> TestSample_Zero(){ <span class="keywordtype">int</span> _pPrimeArray[5]; <span class="keywordtype">int</span> nRet = GetPrime(_pPrimeArray, 0); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(0, nRet);}<span class="comment">/* 測試n為負數的情況 */</span>CUNIT_DECL_TEST <span class="keywordtype">void</span> TestSample_Negative(){ <span class="keywordtype">int</span> _pPrimeArray[5]; <span class="keywordtype">int</span> nRet = GetPrime(_pPrimeArray, -2); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(0, nRet);}<span class="comment">/* 測試n = 1的情況 */</span>CUNIT_DECL_TEST <span class="keywordtype">void</span> TestSample_One(){ <span class="keywordtype">int</span> _pPrimeArray[5]; <span class="keywordtype">int</span> nRet = GetPrime(_pPrimeArray, 1); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(1, nRet); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(2, _pPrimeArray[0]);}<span class="comment">/* 測試空指針的情況 */</span>CUNIT_DECL_TEST <span class="keywordtype">void</span> TestSample_Null(){ <span class="keywordtype">int</span> nRet = GetPrime(NULL, 4); <a class="code" href="group__rcunit__making__assertion.html#ga0">CUNIT_ASSERT_EQUAL</a>(0, nRet);}<span class="preprocessor">#ifdef __cplusplus</span><span class="preprocessor"></span>}<span class="preprocessor">#endif</span></pre></div> <hr/><table width="100%"> <tr> <td align="right" valign="center"> 如果對 RCUnit 有任何的疑問或建議,請聯系realdodo (<a href="mailto:realdodo@163.com">realdodo@163.com</a>)。 </td> </tr></table></body> </html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -