📄 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 + -