output_stream_testing.html 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Output streams testing tool</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="../testing_tools.html" title="Writing unit tests">
  9. <link rel="prev" href="custom_predicates.html" title="Custom predicate support">
  10. <link rel="next" href="internal_details.html" title="BOOST_TEST: details on expressions">
  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="custom_predicates.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../testing_tools.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="internal_details.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h3 class="title">
  27. <a name="boost_test.testing_tools.output_stream_testing"></a><a class="link" href="output_stream_testing.html" title="Output streams testing tool">Output
  28. streams testing tool</a>
  29. </h3></div></div></div>
  30. <p>
  31. How would you perform correctness test for
  32. </p>
  33. <pre class="programlisting"><span class="keyword">operator</span><span class="special">&lt;&lt;</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span> <span class="special">&amp;,</span> <span class="special">...</span> <span class="special">)</span></pre>
  34. <p>
  35. operations?
  36. </p>
  37. <p>
  38. You can print into the standard output stream and manually check that it
  39. is matching your expectations. Unfortunately, this is not really acceptable
  40. for the regression testing and doesn't serve a long term purpose of a unit
  41. test.
  42. </p>
  43. <p>
  44. You can use <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span></code> and compare resulting output
  45. buffer with the expected pattern string, but you are required to perform
  46. several additional operations with every check you do. So it becomes tedious
  47. very fast.
  48. </p>
  49. <p>
  50. The class <code class="computeroutput"><a class="link" href="../../boost/test_tools/output_test_stream.html" title="Class output_test_stream">boost::test_tools::output_test_stream</a></code>
  51. is designed to automate these tasks for you. This is a simple, but powerful
  52. tool for testing standard <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span></code>
  53. based output operation. The class <code class="computeroutput"><span class="identifier">output_test_stream</span></code>
  54. complies to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span></code> interface so it can be used in
  55. place of any <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">ostream</span></code> parameter. It provides several
  56. test methods to validate output content, including test for match to expected
  57. output content or test for expected output length. Flushing, synchronizing,
  58. string comparison and error message generation is automated by the tool implementation.
  59. </p>
  60. <p>
  61. All <code class="computeroutput"><span class="identifier">output_test_stream</span></code> validation
  62. member functions by default flush the stream once the check is performed.
  63. If you want to perform several checks with the same output, specify parameter
  64. <code class="computeroutput"><span class="identifier">flush_stream</span></code> with value
  65. <code class="computeroutput"><span class="keyword">false</span></code> <a href="#ftn.boost_test.testing_tools.output_stream_testing.f0" class="footnote" name="boost_test.testing_tools.output_stream_testing.f0"><sup class="footnote">[16]</sup></a>.
  66. </p>
  67. <p>
  68. In some cases manual generation of expected output is either too time consuming
  69. or is impossible at all because of sheer volume. A possible way to address
  70. that issue is to split the test in two steps:
  71. </p>
  72. <div class="orderedlist"><ol class="orderedlist" type="1">
  73. <li class="listitem">
  74. first by checking the expected output manually
  75. </li>
  76. <li class="listitem">
  77. second to save this output to ensure that future checks produce the same
  78. output
  79. </li>
  80. </ol></div>
  81. <p>
  82. The class <code class="computeroutput"><span class="identifier">output_test_stream</span></code>
  83. allows both the matching of the output content versus a <span class="emphasis"><em>pattern
  84. file</em></span> and generation of this pattern file. The command line parameter
  85. <a class="link" href="../utf_reference/rt_param_reference/save_pattern.html" title="save_pattern"><code class="computeroutput"><span class="identifier">save_pattern</span></code></a> may be used to either
  86. generate a new pattern file, or to check against an existing pattern.
  87. </p>
  88. <h4>
  89. <a name="boost_test.testing_tools.output_stream_testing.h0"></a>
  90. <span class="phrase"><a name="boost_test.testing_tools.output_stream_testing.usages"></a></span><a class="link" href="output_stream_testing.html#boost_test.testing_tools.output_stream_testing.usages">Usage</a>
  91. </h4>
  92. <p>
  93. There are two ways to employ the class <code class="computeroutput"><span class="identifier">output_test_stream</span></code>:
  94. </p>
  95. <div class="orderedlist"><ol class="orderedlist" type="1">
  96. <li class="listitem">
  97. explicit output checks and
  98. </li>
  99. <li class="listitem">
  100. pattern file matching
  101. </li>
  102. </ol></div>
  103. <h5>
  104. <a name="boost_test.testing_tools.output_stream_testing.h1"></a>
  105. <span class="phrase"><a name="boost_test.testing_tools.output_stream_testing.explicit_output_checks"></a></span><a class="link" href="output_stream_testing.html#boost_test.testing_tools.output_stream_testing.explicit_output_checks">Explicit
  106. output checks</a>
  107. </h5>
  108. <p>
  109. Use the instance of class <code class="computeroutput"><span class="identifier">output_test_stream</span></code>
  110. as an output stream and check output content using tool's methods.
  111. </p>
  112. <h6>
  113. <a name="boost_test.testing_tools.output_stream_testing.h2"></a>
  114. <span class="phrase"><a name="boost_test.testing_tools.output_stream_testing.example_descr"></a></span><a class="link" href="output_stream_testing.html#boost_test.testing_tools.output_stream_testing.example_descr">Example:
  115. Explicit output checks with <code class="computeroutput"><span class="identifier">output_test_stream</span></code></a>
  116. </h6>
  117. <div class="informaltable"><table class="table">
  118. <colgroup><col></colgroup>
  119. <thead><tr><th>
  120. <p>
  121. Code
  122. </p>
  123. </th></tr></thead>
  124. <tbody><tr><td>
  125. <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_MODULE</span> <span class="identifier">example</span>
  126. <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>
  127. <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">output_test_stream</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  128. <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">::</span><span class="identifier">output_test_stream</span><span class="special">;</span>
  129. <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span> <span class="identifier">test</span> <span class="special">)</span>
  130. <span class="special">{</span>
  131. <span class="identifier">output_test_stream</span> <span class="identifier">output</span><span class="special">;</span>
  132. <span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="number">2</span><span class="special">;</span>
  133. <span class="identifier">output</span> <span class="special">&lt;&lt;</span> <span class="string">"i="</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span><span class="special">;</span>
  134. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="special">!</span><span class="identifier">output</span><span class="special">.</span><span class="identifier">is_empty</span><span class="special">(</span> <span class="keyword">false</span> <span class="special">)</span> <span class="special">);</span>
  135. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="identifier">output</span><span class="special">.</span><span class="identifier">check_length</span><span class="special">(</span> <span class="number">3</span><span class="special">,</span> <span class="keyword">false</span> <span class="special">)</span> <span class="special">);</span>
  136. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="identifier">output</span><span class="special">.</span><span class="identifier">is_equal</span><span class="special">(</span> <span class="string">"i=3"</span> <span class="special">)</span> <span class="special">);</span>
  137. <span class="special">}</span>
  138. </pre>
  139. </td></tr></tbody>
  140. </table></div>
  141. <div class="informaltable"><table class="table">
  142. <colgroup><col></colgroup>
  143. <thead><tr><th>
  144. <p>
  145. Output
  146. </p>
  147. </th></tr></thead>
  148. <tbody><tr><td>
  149. <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>
  150. <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
  151. <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="identifier">in</span> <span class="string">"test"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">output</span><span class="special">.</span><span class="identifier">is_equal</span><span class="special">(</span> <span class="string">"i=3"</span> <span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span><span class="special">.</span> <span class="identifier">Output</span> <span class="identifier">content</span><span class="special">:</span> <span class="string">"i=2"</span>
  152. <span class="special">***</span> <span class="number">1</span> <span class="identifier">failures</span> <span class="identifier">is</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">test</span> <span class="identifier">suite</span> <span class="string">"example"</span>
  153. </pre>
  154. </td></tr></tbody>
  155. </table></div>
  156. <div class="note"><table border="0" summary="Note">
  157. <tr>
  158. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
  159. <th align="left">Note</th>
  160. </tr>
  161. <tr><td align="left" valign="top"><p>
  162. Use of <code class="computeroutput"><span class="keyword">false</span></code> to prevent output
  163. flushing in first two invocation of check functions. Unless you want to
  164. perform several different checks for the same output you wouldn't need
  165. to use it though. Your test will look like a sequence of output operators
  166. followed by one check.
  167. </p></td></tr>
  168. </table></div>
  169. <div class="tip"><table border="0" summary="Tip">
  170. <tr>
  171. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../doc/src/images/tip.png"></td>
  172. <th align="left">Tip</th>
  173. </tr>
  174. <tr><td align="left" valign="top"><p>
  175. Try to perform checks as frequently as possible. It not only simplifies
  176. patterns you compare with, but also allows you to more closely identify
  177. possible source of failure.
  178. </p></td></tr>
  179. </table></div>
  180. <h5>
  181. <a name="boost_test.testing_tools.output_stream_testing.h3"></a>
  182. <span class="phrase"><a name="boost_test.testing_tools.output_stream_testing.pattern_file_matching"></a></span><a class="link" href="output_stream_testing.html#boost_test.testing_tools.output_stream_testing.pattern_file_matching">Pattern
  183. file matching</a>
  184. </h5>
  185. <p>
  186. The <span class="emphasis"><em>pattern file</em></span> is a companion file containing the
  187. patterns that the stream should match. Your testing will look like a series
  188. of output operators followed by match pattern checks repeated several times.
  189. </p>
  190. <p>
  191. In the example below, the file <code class="computeroutput"><span class="identifier">pattern_file</span></code>
  192. contains the patterns that should match.
  193. </p>
  194. <pre class="programlisting">i=2
  195. File: test.cpp Line:XXX
  196. </pre>
  197. <h6>
  198. <a name="boost_test.testing_tools.output_stream_testing.h4"></a>
  199. <span class="phrase"><a name="boost_test.testing_tools.output_stream_testing.example_descr0"></a></span><a class="link" href="output_stream_testing.html#boost_test.testing_tools.output_stream_testing.example_descr0">Example:
  200. Pattern file matching with <code class="computeroutput"><span class="identifier">output_test_stream</span></code></a>
  201. </h6>
  202. <div class="informaltable"><table class="table">
  203. <colgroup><col></colgroup>
  204. <thead><tr><th>
  205. <p>
  206. Code
  207. </p>
  208. </th></tr></thead>
  209. <tbody><tr><td>
  210. <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_MODULE</span> <span class="identifier">example</span>
  211. <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>
  212. <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">output_test_stream</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  213. <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">::</span><span class="identifier">output_test_stream</span><span class="special">;</span>
  214. <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span> <span class="identifier">test</span> <span class="special">)</span>
  215. <span class="special">{</span>
  216. <span class="identifier">output_test_stream</span> <span class="identifier">output</span><span class="special">(</span> <span class="string">"pattern_file"</span><span class="special">,</span> <span class="special">!</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">runtime_config</span><span class="special">::</span><span class="identifier">save_pattern</span><span class="special">()</span> <span class="special">);</span>
  217. <span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="number">2</span><span class="special">;</span>
  218. <span class="identifier">output</span> <span class="special">&lt;&lt;</span> <span class="string">"i="</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span><span class="special">;</span>
  219. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="identifier">output</span><span class="special">.</span><span class="identifier">match_pattern</span><span class="special">()</span> <span class="special">);</span>
  220. <span class="identifier">output</span> <span class="special">&lt;&lt;</span> <span class="string">"\nFile: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">__FILE__</span> <span class="special">&lt;&lt;</span> <span class="string">" Line:YYY"</span><span class="special">;</span>
  221. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="identifier">output</span><span class="special">.</span><span class="identifier">match_pattern</span><span class="special">()</span> <span class="special">);</span> <a class="co" name="boost_test.testing_tools.output_stream_testing.c0" href="output_stream_testing.html#boost_test.testing_tools.output_stream_testing.c1"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a>
  222. <span class="special">}</span>
  223. </pre>
  224. <div class="calloutlist"><table border="0" summary="Callout list"><tr>
  225. <td width="5%" valign="top" align="left"><p><a name="boost_test.testing_tools.output_stream_testing.c1"></a><a href="#boost_test.testing_tools.output_stream_testing.c0"><img src="../../../../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td>
  226. <td valign="top" align="left"><p>
  227. This line generates the error Line:YYY != Line:XXX
  228. </p></td>
  229. </tr></table></div>
  230. </td></tr></tbody>
  231. </table></div>
  232. <div class="informaltable"><table class="table">
  233. <colgroup><col></colgroup>
  234. <thead><tr><th>
  235. <p>
  236. Output
  237. </p>
  238. </th></tr></thead>
  239. <tbody><tr><td>
  240. <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>
  241. <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
  242. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">16</span><span class="special">):</span> <span class="identifier">error</span> <span class="identifier">in</span> <span class="string">"test"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">output</span><span class="special">.</span><span class="identifier">match_pattern</span><span class="special">()</span> <span class="identifier">has</span> <span class="identifier">failed</span><span class="special">.</span> <span class="identifier">Mismatch</span> <span class="identifier">at</span> <span class="identifier">position</span> <span class="number">23</span>
  243. <span class="special">...</span><span class="number">5.</span><span class="special">..</span>
  244. <span class="special">...</span><span class="number">4.</span><span class="special">..</span>
  245. <span class="special">***</span> <span class="number">1</span> <span class="identifier">failures</span> <span class="identifier">is</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">test</span> <span class="identifier">suite</span> <span class="string">"example"</span>
  246. </pre>
  247. </td></tr></tbody>
  248. </table></div>
  249. <div class="tip"><table border="0" summary="Tip">
  250. <tr>
  251. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../doc/src/images/tip.png"></td>
  252. <th align="left">Tip</th>
  253. </tr>
  254. <tr><td align="left" valign="top"><p>
  255. Try to perform checks as frequently as possible, because it allows you
  256. to more closely identify possible source of failure
  257. </p></td></tr>
  258. </table></div>
  259. <div class="footnotes">
  260. <br><hr style="width:100; text-align:left;margin-left: 0">
  261. <div id="ftn.boost_test.testing_tools.output_stream_testing.f0" class="footnote"><p><a href="#boost_test.testing_tools.output_stream_testing.f0" class="para"><sup class="para">[16] </sup></a>
  262. This parameter is supported on all comparison methods, see the class <code class="computeroutput"><a class="link" href="../../boost/test_tools/output_test_stream.html" title="Class output_test_stream">documentation.</a></code>
  263. </p></div>
  264. </div>
  265. </div>
  266. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  267. <td align="left"></td>
  268. <td align="right"><div class="copyright-footer">Copyright &#169; 2001-2019 Boost.Test
  269. contributors<p>
  270. Distributed under the Boost Software License, Version 1.0. (See accompanying
  271. 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>)
  272. </p>
  273. </div></td>
  274. </tr></table>
  275. <hr>
  276. <div class="spirit-nav">
  277. <a accesskey="p" href="custom_predicates.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../testing_tools.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="internal_details.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  278. </div>
  279. </body>
  280. </html>