• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Fixture models</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="../fixtures.html" title="Fixtures">
9<link rel="prev" href="../fixtures.html" title="Fixtures">
10<link rel="next" href="case.html" title="Test case fixture">
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="../fixtures.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../fixtures.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="case.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.fixtures.models"></a><a class="link" href="models.html" title="Fixture models">Fixture
28        models</a>
29</h4></div></div></div>
30<p>
31          Several fixture interfaces are supported by the <span class="emphasis"><em>Unit Test Framework</em></span>.
32          The choice of the interface depends mainly on the usage of the fixture.
33        </p>
34<h4>
35<a name="boost_test.tests_organization.fixtures.models.h0"></a>
36          <span class="phrase"><a name="boost_test.tests_organization.fixtures.models.fixture_class_model"></a></span><a class="link" href="models.html#boost_test.tests_organization.fixtures.models.fixture_class_model">Fixture
37          class model</a>
38        </h4>
39<p>
40          The <span class="emphasis"><em>Unit Test Framework</em></span> defines the generic fixture
41          class model as follows:
42        </p>
43<pre class="programlisting"><span class="keyword">struct</span> <span class="special">&lt;</span><span class="identifier">fixture</span><span class="special">-</span><span class="identifier">name</span><span class="special">&gt;{</span>
44  <span class="special">&lt;</span><span class="identifier">fixture</span><span class="special">-</span><span class="identifier">name</span><span class="special">&gt;();</span>      <span class="comment">// setup function</span>
45  <span class="special">~&lt;</span><span class="identifier">fixture</span><span class="special">-</span><span class="identifier">name</span><span class="special">&gt;();</span>     <span class="comment">// teardown function</span>
46<span class="special">};</span>
47</pre>
48<p>
49          In other words a fixture is expected to be implemented as a class where
50          the class constructor serves as a <code class="computeroutput"><span class="identifier">setup</span></code>
51          method and class destructor serves as <code class="computeroutput"><span class="identifier">teardown</span></code>
52          method.
53        </p>
54<p>
55          The class model above has some limitations though:
56        </p>
57<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
58<li class="listitem">
59              it is not possible to have exceptions in the teardown function, especially
60              any test assertions that aborts the current test case is not possible
61              (as those use exceptions)
62            </li>
63<li class="listitem">
64              it is sometimes more natural to use the constructor/destructor to perform
65              the necessary resource allocation/release of the fixture, and that
66              will be consumed in the test cases, and check for the proper state
67              of the fixture in separate functions. Those checks are the pre-conditions
68              for the test case to run, and the post-conditions that should be met
69              after the test case has been running.
70            </li>
71</ul></div>
72<p>
73          This is why the <span class="emphasis"><em>Unit Test Framework</em></span> also supports
74          (Boost 1.65 on) optional <code class="computeroutput"><span class="identifier">setup</span></code>
75          and/or <code class="computeroutput"><span class="identifier">teardown</span></code> functions
76          as follow:
77        </p>
78<pre class="programlisting"><span class="keyword">struct</span> <span class="special">&lt;</span><span class="identifier">fixture</span><span class="special">-</span><span class="identifier">name</span><span class="special">&gt;{</span>
79  <span class="special">&lt;</span><span class="identifier">fixture</span><span class="special">-</span><span class="identifier">name</span><span class="special">&gt;();</span>      <span class="comment">// ctor</span>
80  <span class="special">~&lt;</span><span class="identifier">fixture</span><span class="special">-</span><span class="identifier">name</span><span class="special">&gt;();</span>     <span class="comment">// dtor</span>
81  <span class="keyword">void</span> <span class="identifier">setup</span><span class="special">();</span>          <span class="comment">// setup, optional</span>
82  <span class="keyword">void</span> <span class="identifier">teardown</span><span class="special">();</span>       <span class="comment">// teardown, optional</span>
83<span class="special">};</span>
84</pre>
85<div class="note"><table border="0" summary="Note">
86<tr>
87<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
88<th align="left">Note</th>
89</tr>
90<tr><td align="left" valign="top"><p>
91            As mentioned, the declaration/implementation of the <code class="computeroutput"><span class="identifier">setup</span></code>
92            and <code class="computeroutput"><span class="identifier">teardown</span></code> are optional:
93            the <span class="emphasis"><em>Unit Test Framework</em></span> will check the existence
94            of those and will call them adequately. However in C++98, it is not possible
95            to detect those declaration in case those are inherited (it works fine
96            for compiler supporting <code class="computeroutput"><span class="keyword">auto</span></code>
97            and <code class="computeroutput"><span class="keyword">decltype</span></code>).
98          </p></td></tr>
99</table></div>
100<p>
101          This model is expected from fixtures used with <a class="link" href="../../utf_reference/test_org_reference/test_org_boost_test_case_fixture.html" title="BOOST_FIXTURE_TEST_CASE"><code class="computeroutput"><span class="identifier">BOOST_FIXTURE_TEST_CASE</span></code></a> and <a class="link" href="../../utf_reference/test_org_reference/test_org_boost_test_suite_fixture.html" title="BOOST_FIXTURE_TEST_SUITE"><code class="computeroutput"><span class="identifier">BOOST_FIXTURE_TEST_SUITE</span></code></a>.
102        </p>
103<h4>
104<a name="boost_test.tests_organization.fixtures.models.h1"></a>
105          <span class="phrase"><a name="boost_test.tests_organization.fixtures.models.flexible_models"></a></span><a class="link" href="models.html#boost_test.tests_organization.fixtures.models.flexible_models">Flexible
106          models</a>
107        </h4>
108<p>
109          In addition to <a class="link" href="../../utf_reference/test_org_reference/test_org_boost_test_case_fixture.html" title="BOOST_FIXTURE_TEST_CASE"><code class="computeroutput"><span class="identifier">BOOST_FIXTURE_TEST_CASE</span></code></a> and <a class="link" href="../../utf_reference/test_org_reference/test_org_boost_test_suite_fixture.html" title="BOOST_FIXTURE_TEST_SUITE"><code class="computeroutput"><span class="identifier">BOOST_FIXTURE_TEST_SUITE</span></code></a> the
110          <span class="emphasis"><em>Unit Test Framework</em></span> allows to associate fixture with
111          test unit using the decorator <a class="link" href="../../utf_reference/test_org_reference/decorator_fixture.html" title="fixture (decorator)"><code class="computeroutput"><span class="identifier">fixture</span></code></a>. This decorator supports
112          additional models for declaring the <code class="computeroutput"><span class="identifier">setup</span></code>
113          and <code class="computeroutput"><span class="identifier">teardown</span></code>:
114        </p>
115<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
116<li class="listitem">
117              a fixture defined according to the fixture class model above
118            </li>
119<li class="listitem">
120<p class="simpara">
121              a fixture defined according to the extended fixture class model, which
122              allows for the fixture constructor to takes one argument. For example:
123            </p>
124<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">Fx</span>
125<span class="special">{</span>
126  <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">s</span><span class="special">;</span>
127  <span class="identifier">Fx</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">s_</span> <span class="special">=</span> <span class="string">""</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">s</span><span class="special">(</span><span class="identifier">s_</span><span class="special">)</span>
128      <span class="special">{</span> <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span><span class="string">"ctor "</span> <span class="special">&lt;&lt;</span> <span class="identifier">s</span><span class="special">);</span> <span class="special">}</span>
129  <span class="keyword">void</span> <span class="identifier">setup</span><span class="special">()</span>
130      <span class="special">{</span> <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span><span class="string">"optional setup "</span> <span class="special">&lt;&lt;</span> <span class="identifier">s</span><span class="special">);</span> <span class="special">}</span>
131  <span class="keyword">void</span> <span class="identifier">teardown</span><span class="special">()</span>
132      <span class="special">{</span> <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span><span class="string">"optional teardown "</span> <span class="special">&lt;&lt;</span> <span class="identifier">s</span><span class="special">);</span> <span class="special">}</span>
133  <span class="special">~</span><span class="identifier">Fx</span><span class="special">()</span>
134      <span class="special">{</span> <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span><span class="string">"dtor "</span> <span class="special">&lt;&lt;</span> <span class="identifier">s</span><span class="special">);</span> <span class="special">}</span>
135<span class="special">};</span>
136</pre>
137</li>
138<li class="listitem">
139<p class="simpara">
140              a fixture defined as a pair of free functions for the <code class="computeroutput"><span class="identifier">setup</span></code> and <code class="computeroutput"><span class="identifier">teardown</span></code>
141              (latter optional)
142            </p>
143<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">setup</span><span class="special">()</span> <span class="special">{</span> <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span><span class="string">"set up"</span><span class="special">);</span> <span class="special">}</span>
144<span class="keyword">void</span> <span class="identifier">teardown</span><span class="special">()</span> <span class="special">{</span> <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span><span class="string">"tear down"</span><span class="special">);</span> <span class="special">}</span>
145</pre>
146</li>
147</ul></div>
148<p>
149          For complete example of test module which uses these models please check
150          decorator <a class="link" href="../../utf_reference/test_org_reference/decorator_fixture.html" title="fixture (decorator)"><code class="computeroutput"><span class="identifier">fixture</span></code></a>.
151        </p>
152</div>
153<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
154<td align="left"></td>
155<td align="right"><div class="copyright-footer">Copyright © 2001-2020 Boost.Test contributors<p>
156        Distributed under the Boost Software License, Version 1.0. (See accompanying
157        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>)
158      </p>
159</div></td>
160</tr></table>
161<hr>
162<div class="spirit-nav">
163<a accesskey="p" href="../fixtures.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../fixtures.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="case.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
164</div>
165</body>
166</html>
167