param_test.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Parametrized test cases</title>
  5. <link rel="stylesheet" href="../../../boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../../../index.html" title="Boost.Test">
  8. <link rel="up" href="../test_cases.html" title="Test cases">
  9. <link rel="prev" href="test_organization_templates.html" title="Template test cases">
  10. <link rel="next" href="../test_tree.html" title="Test tree">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
  15. <td align="center"><a href="../../../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="test_organization_templates.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../test_cases.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../test_tree.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h4 class="title">
  27. <a name="boost_test.tests_organization.test_cases.param_test"></a><a class="link" href="param_test.html" title="Parametrized test cases">Parametrized
  28. test cases</a>
  29. </h4></div></div></div>
  30. <div class="caution"><table border="0" summary="Caution">
  31. <tr>
  32. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../doc/src/images/caution.png"></td>
  33. <th align="left">Caution</th>
  34. </tr>
  35. <tr><td align="left" valign="top"><p>
  36. the functionalities presented on this page have been superseded by the
  37. <a class="link" href="test_case_generation.html" title="Data-driven test cases">Data-driven
  38. test case</a> facility.
  39. </p></td></tr>
  40. </table></div>
  41. <p>
  42. Some tests are required to be repeated for a series of different input
  43. parameters. One way to achieve this is manually register a test case for
  44. each parameter as in the previous examples. You can also invoke a test
  45. function with all parameters manually from within your test case, like
  46. this:
  47. </p>
  48. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">single_test</span><span class="special">(</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">)</span>
  49. <span class="special">{</span>
  50. <span class="identifier">BOOST_CHECK</span><span class="special">(</span> <span class="comment">/* test assertion */</span> <span class="special">);</span>
  51. <span class="special">}</span>
  52. <span class="keyword">void</span> <span class="identifier">combined_test</span><span class="special">()</span>
  53. <span class="special">{</span>
  54. <span class="keyword">int</span> <span class="identifier">params</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span> <span class="special">};</span>
  55. <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span> <span class="identifier">params</span><span class="special">,</span> <span class="identifier">params</span><span class="special">+</span><span class="number">5</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">single_test</span> <span class="special">);</span>
  56. <span class="special">}</span>
  57. </pre>
  58. <p>
  59. The <span class="emphasis"><em>Unit Test Framework</em></span> presents a better solution
  60. for this problem: the unary function based test case, also referred as
  61. <span class="emphasis"><em>parametrized test case</em></span>. The unary test function can
  62. be a free function, unary functor (for example created with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code>) or unary method of a class with
  63. bound test class instance). The test function is converted into test case
  64. using the macro <code class="computeroutput"><span class="identifier">BOOST_PARAM_TEST_CASE</span></code>.
  65. The macro expects a collection of parameters (passed as two input iterators)
  66. and an unary test function:
  67. </p>
  68. <pre class="programlisting"><span class="identifier">BOOST_PARAM_TEST_CASE</span><span class="special">(</span><span class="identifier">test_function</span><span class="special">,</span> <span class="identifier">params_begin</span><span class="special">,</span> <span class="identifier">params_end</span><span class="special">);</span>
  69. </pre>
  70. <p>
  71. <code class="computeroutput"><span class="identifier">BOOST_PARAM_TEST_CASE</span></code> creates
  72. an instance of the test case generator. When passed to the method <code class="computeroutput"><a class="link" href="../../../boost/unit_test/test_suite.html#idm46279112866240-bb">test_suite::add</a></code>,
  73. the generator produces a separate sub test case for each parameter in the
  74. parameters collection and registers it immediately in a test suite. Each
  75. test case is based on a test function with the parameter bound by value,
  76. even if the test function expects a parameter by reference. The fact that
  77. parameter value is stored along with bound test function releases you from
  78. necessity to manage parameters lifetime. For example, they can be defined
  79. in the test module initialization function scope.
  80. </p>
  81. <p>
  82. All sub test case names are deduced from the macro argument <code class="computeroutput"><span class="identifier">test_function</span></code>. If you prefer to assign
  83. different names, you have to use the underlying <code class="computeroutput"><a class="link" href="../../../header/boost/test/parameterized_test_hpp.html" title="Header &lt;boost/test/parameterized_test.hpp&gt;">make_test_case</a></code> interface
  84. instead. Both test cases creation and registration are performed in the
  85. test module initialization function.
  86. </p>
  87. <p>
  88. The parametrized test case facility is preferable to the approach in the
  89. example above, since execution of each sub test case is guarded and counted
  90. independently. It produces a better test log/results report (in example
  91. above in case of failure you can't say which parameter is at fault) and
  92. allows you to test against all parameters even if one of them causes termination
  93. a particular sub test case.
  94. </p>
  95. <p>
  96. In comparison with a manual test case registration for each parameter approach
  97. the parametrized test case facility is more concise and easily extensible.
  98. </p>
  99. <p>
  100. In following simple example the same test, implemented in <code class="computeroutput"><span class="identifier">free_test_function</span></code>, is performed for
  101. 5 different parameters. The parameters are defined in the test module initialization
  102. function scope. The master test suite contains 5 independent test cases.
  103. </p>
  104. <h6>
  105. <a name="boost_test.tests_organization.test_cases.param_test.h0"></a>
  106. <span class="phrase"><a name="boost_test.tests_organization.test_cases.param_test.example_descr"></a></span><a class="link" href="param_test.html#boost_test.tests_organization.test_cases.param_test.example_descr">Example:
  107. Unary free function based test case</a>
  108. </h6>
  109. <div class="informaltable"><table class="table">
  110. <colgroup><col></colgroup>
  111. <thead><tr><th>
  112. <p>
  113. Code
  114. </p>
  115. </th></tr></thead>
  116. <tbody><tr><td>
  117. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  118. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">parameterized_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  119. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
  120. <span class="keyword">void</span> <span class="identifier">free_test_function</span><span class="special">(</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">)</span>
  121. <span class="special">{</span>
  122. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="number">4</span> <span class="comment">/* test assertion */</span> <span class="special">);</span>
  123. <span class="special">}</span>
  124. <span class="identifier">test_suite</span><span class="special">*</span> <span class="identifier">init_unit_test_suite</span><span class="special">(</span> <span class="keyword">int</span> <span class="comment">/*argc*/</span><span class="special">,</span> <span class="keyword">char</span><span class="special">*</span> <span class="comment">/*argv*/</span><span class="special">[]</span> <span class="special">)</span>
  125. <span class="special">{</span>
  126. <span class="keyword">int</span> <span class="identifier">params</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span> <span class="special">};</span>
  127. <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span>
  128. <span class="identifier">add</span><span class="special">(</span> <span class="identifier">BOOST_PARAM_TEST_CASE</span><span class="special">(</span> <span class="special">&amp;</span><span class="identifier">free_test_function</span><span class="special">,</span> <span class="identifier">params</span><span class="special">,</span> <span class="identifier">params</span><span class="special">+</span><span class="number">5</span> <span class="special">)</span> <span class="special">);</span>
  129. <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
  130. <span class="special">}</span>
  131. </pre>
  132. </td></tr></tbody>
  133. </table></div>
  134. <div class="informaltable"><table class="table">
  135. <colgroup><col></colgroup>
  136. <thead><tr><th>
  137. <p>
  138. Output
  139. </p>
  140. </th></tr></thead>
  141. <tbody><tr><td>
  142. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">&gt;</span> <span class="identifier">example</span>
  143. <span class="identifier">Running</span> <span class="number">5</span> <span class="identifier">test</span> <span class="identifier">cases</span><span class="special">...</span>
  144. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">15</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"free_test_function"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="number">4</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">4</span> <span class="special">&gt;=</span> <span class="number">4</span><span class="special">]</span>
  145. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">15</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"free_test_function"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="number">4</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">5</span> <span class="special">&gt;=</span> <span class="number">4</span><span class="special">]</span>
  146. <span class="special">***</span> <span class="number">2</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"Master Test Suite"</span>
  147. </pre>
  148. </td></tr></tbody>
  149. </table></div>
  150. <p>
  151. Next example is similar, but instead of a free function it uses a method
  152. of a class. Even though parameters are passed into test method by reference
  153. you can still define them in the test module initialization function scope.
  154. This example employs the alternative test module initialization function
  155. specification.
  156. </p>
  157. <h6>
  158. <a name="boost_test.tests_organization.test_cases.param_test.h1"></a>
  159. <span class="phrase"><a name="boost_test.tests_organization.test_cases.param_test.example_descr0"></a></span><a class="link" href="param_test.html#boost_test.tests_organization.test_cases.param_test.example_descr0">Example:
  160. Unary class method based test case</a>
  161. </h6>
  162. <div class="informaltable"><table class="table">
  163. <colgroup><col></colgroup>
  164. <thead><tr><th>
  165. <p>
  166. Code
  167. </p>
  168. </th></tr></thead>
  169. <tbody><tr><td>
  170. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_ALTERNATIVE_INIT_API</span>
  171. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  172. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">tools</span><span class="special">/</span><span class="identifier">floating_point_comparison</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  173. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">parameterized_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  174. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">bind</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  175. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
  176. <span class="keyword">namespace</span> <span class="identifier">tt</span><span class="special">=</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">;</span>
  177. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">;</span>
  178. <span class="keyword">class</span> <span class="identifier">test_class</span> <span class="special">{</span>
  179. <span class="keyword">public</span><span class="special">:</span>
  180. <span class="keyword">void</span> <span class="identifier">test_method</span><span class="special">(</span> <span class="keyword">double</span> <span class="identifier">d</span> <span class="special">)</span>
  181. <span class="special">{</span>
  182. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="identifier">d</span> <span class="special">*</span> <span class="number">100</span> <span class="special">==</span> <span class="special">(</span><span class="keyword">double</span><span class="special">)(</span><span class="keyword">int</span><span class="special">)(</span><span class="identifier">d</span><span class="special">*</span><span class="number">100</span><span class="special">),</span> <span class="identifier">tt</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.0001</span><span class="special">)</span> <span class="special">);</span>
  183. <span class="special">}</span>
  184. <span class="special">}</span> <span class="identifier">tester</span><span class="special">;</span>
  185. <span class="keyword">bool</span> <span class="identifier">init_unit_test</span><span class="special">()</span>
  186. <span class="special">{</span>
  187. <span class="keyword">double</span> <span class="identifier">params</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span> <span class="number">1.</span><span class="special">,</span> <span class="number">1.1</span><span class="special">,</span> <span class="number">1.01</span><span class="special">,</span> <span class="number">1.001</span><span class="special">,</span> <span class="number">1.0001</span> <span class="special">};</span>
  188. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">function</span><span class="special">&lt;</span><span class="keyword">void</span> <span class="special">(</span><span class="keyword">double</span><span class="special">)&gt;</span> <span class="identifier">test_method</span> <span class="special">=</span> <span class="identifier">bind</span><span class="special">(</span> <span class="special">&amp;</span><span class="identifier">test_class</span><span class="special">::</span><span class="identifier">test_method</span><span class="special">,</span> <span class="special">&amp;</span><span class="identifier">tester</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">);</span>
  189. <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span>
  190. <span class="identifier">add</span><span class="special">(</span> <span class="identifier">BOOST_PARAM_TEST_CASE</span><span class="special">(</span> <span class="identifier">test_method</span><span class="special">,</span> <span class="identifier">params</span><span class="special">,</span> <span class="identifier">params</span><span class="special">+</span><span class="number">5</span> <span class="special">)</span> <span class="special">);</span>
  191. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  192. <span class="special">}</span>
  193. </pre>
  194. </td></tr></tbody>
  195. </table></div>
  196. <div class="informaltable"><table class="table">
  197. <colgroup><col></colgroup>
  198. <thead><tr><th>
  199. <p>
  200. Output
  201. </p>
  202. </th></tr></thead>
  203. <tbody><tr><td>
  204. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">&gt;</span> <span class="identifier">example</span>
  205. <span class="identifier">Running</span> <span class="number">5</span> <span class="identifier">test</span> <span class="identifier">cases</span><span class="special">...</span>
  206. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">23</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_method"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">d</span> <span class="special">*</span> <span class="number">100</span> <span class="special">==</span> <span class="special">(</span><span class="keyword">double</span><span class="special">)(</span><span class="keyword">int</span><span class="special">)(</span><span class="identifier">d</span><span class="special">*</span><span class="number">100</span><span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">1.0001</span> <span class="special">*</span> <span class="number">100</span> <span class="special">!=</span> <span class="number">100</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">exceeds</span> <span class="identifier">tolerance</span> <span class="special">[</span><span class="number">0.001</span> <span class="special">&gt;</span> <span class="number">0.0001</span><span class="special">]</span>
  207. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">23</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_method"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">d</span> <span class="special">*</span> <span class="number">100</span> <span class="special">==</span> <span class="special">(</span><span class="keyword">double</span><span class="special">)(</span><span class="keyword">int</span><span class="special">)(</span><span class="identifier">d</span><span class="special">*</span><span class="number">100</span><span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">1.0001</span> <span class="special">*</span> <span class="number">100</span> <span class="special">!=</span> <span class="number">100</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">exceeds</span> <span class="identifier">tolerance</span> <span class="special">[</span><span class="number">0.0001</span> <span class="special">&gt;</span> <span class="number">0.0001</span><span class="special">]</span>
  208. <span class="special">***</span> <span class="number">2</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"Master Test Suite"</span>
  209. </pre>
  210. </td></tr></tbody>
  211. </table></div>
  212. </div>
  213. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  214. <td align="left"></td>
  215. <td align="right"><div class="copyright-footer">Copyright &#169; 2001-2019 Boost.Test
  216. contributors<p>
  217. Distributed under the Boost Software License, Version 1.0. (See accompanying
  218. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  219. </p>
  220. </div></td>
  221. </tr></table>
  222. <hr>
  223. <div class="spirit-nav">
  224. <a accesskey="p" href="test_organization_templates.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../test_cases.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../test_tree.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  225. </div>
  226. </body>
  227. </html>