<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Headspring &#187; Glenn Burnside</title>
	<atom:link href="http://www.headspring.com/author/gburnside/feed" rel="self" type="application/rss+xml" />
	<link>http://www.headspring.com</link>
	<description>Custom software... Done right the first time.</description>
	<lastBuildDate>Wed, 16 May 2012 18:27:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
	<copyright>Copyright © Headspring 2012 </copyright>
	<managingEditor>marketing@headspring.com (Jeffrey Palermo and Kevin Hurwitz)</managingEditor>
	<webMaster>marketing@headspring.com (Jeffrey Palermo and Kevin Hurwitz)</webMaster>
	<ttl>1440</ttl>
	<image>
		<url>http://www.headspring.com/wp-content/uploads/2012/05/HeadspringFlair144.jpg</url>
		<title>Headspring</title>
		<link>http://www.headspring.com</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle>We believe there is a better way</itunes:subtitle>
	<itunes:summary>Are you a lifelong learner?  Are you always searching for better ways to develop and maintain software?  So are we!  A passion for learning and growth is a core value at Headspring.  In this podcast, Headspring consultants, programmers, software developers, managers, and executives share the skills, techniques, patterns, and tools that have proven effective on clients&#039; consulting projects.  Headspring is a software consulting company in Austin, TX and has been recognized on the Inc 500 list and the Austin Business Journal&#039;s Best Place to Work award.</itunes:summary>
	<itunes:keywords>headspring, software, line, business, enterprise, applications, custom, MVC, Net, C, database, SQL</itunes:keywords>
	<itunes:category text="Technology" />
	<itunes:category text="Business" />
	<itunes:category text="Education">
		<itunes:category text="Training" />
	</itunes:category>
	<itunes:author>Jeffrey Palermo and Kevin Hurwitz</itunes:author>
	<itunes:owner>
		<itunes:name>Jeffrey Palermo and Kevin Hurwitz</itunes:name>
		<itunes:email>marketing@headspring.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://www.headspring.com/wp-content/uploads/2012/05/HeadspringFlair600.jpg" />
		<item>
		<title>Unit Testing Best Practices: Know Your Test’s Lifecycle, Part 3</title>
		<link>http://www.headspring.com/2011/10/unit-testing-best-practices-know-your-tests-lifecycle-part-3</link>
		<comments>http://www.headspring.com/2011/10/unit-testing-best-practices-know-your-tests-lifecycle-part-3#comments</comments>
		<pubDate>Tue, 25 Oct 2011 21:06:29 +0000</pubDate>
		<dc:creator>Glenn Burnside</dc:creator>
				<category><![CDATA[Developer Deep Dive]]></category>

		<guid isPermaLink="false">http://www.headspring.com/?p=2058</guid>
		<description><![CDATA[This will be my last post on unit test lifecycle management. In ...]]></description>
			<content:encoded><![CDATA[<p>This will be my last post on unit test lifecycle management. In previous posts, we <a title="Unit Testing Best Practices: Know your test’s lifecycle, Part 1" href="http://www.headspring.com/2011/08/unit-testing-best-practices-know-your-tests-lifecycle-part-1">learned how individual unit tests and test fixtures are run</a>, and <a title="Unit Testing Best Practices: Know Your Test’s Lifecycle, Part 2" href="http://www.headspring.com/2011/09/unit-testing-best-practices-know-your-tests-lifecycle-part-2">how test invocation is affected when test fixtures are derived from an abstract base fixture class</a>. In this installation, we&#8217;re going to learn how to manage code that runs before and after groups of test fixtures.</p>
<p>Sometimes, you need some code to run before or after a set of test fixtures. I tend to encounter this scenario frequently with integration and system tests. For example, if you&#8217;re using <a href="http://seleniumhq.org/">Selenium</a> to run your full system tests through the <a href="http://seleniumhq.org/projects/webdriver/">Selenium Web Driver</a>, you need to make sure that the Selenium server is running before you run any of your tests. You could do this on the build server by extending your build script with a &#8220;StartSelenium&#8221; task, and then remind all your developers to start the server themselves before they run the tests directly. But wouldn&#8217;t it be better to guarantee directly that, every time those ui tests get run, that the selenium server was active? AND, as a bonus, wouldn&#8217;t it be great if the selenium server was shut down when the tests finished?<span id="more-2058"></span></p>
<p>Another case where this need shows up is in database-coupled integration tests. These kinds of tests often suffer from unintended order dependencies &#8211; one set of tests end up assuming that some data introduced by an earlier set of tests will be present in the database, and then those tests fail if you run them in isolation.</p>
<p>Another approach I often see people take is to have a &#8220;special&#8221; test fixture  that performs all their database initialization and initial data loading. That test fixture might look like this:</p>
<div id="gist-1313334" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'>Dropping Database.</div><div class='line' id='LC2'>Rebuild Database with latest Schema.</div><div class='line' id='LC3'>Load basic test environment data.</div><div class='line' id='LC4'>Loading basic account data.</div><div class='line' id='LC5'>Opening outer Transaction scope</div><div class='line' id='LC6'>Executing test 1.</div><div class='line' id='LC7'>Executing test 2.</div><div class='line' id='LC8'>Roll back transaction scope.</div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/7b4220df1413fbefdddc10b84a2e1bd473aa1d4f/SetUpFixtureDatabaseExampleOutput.txt" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_database_example_output.txt" style="float:right;margin-right:10px;color:#666">SetUpFixtureDatabaseExampleOutput.txt</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span></div><div class='line' id='LC2'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="na">[SetUpFixture]</span></div><div class='line' id='LC5'><span class="k">public</span> <span class="k">class</span> <span class="nc">TestSuiteInitializer</span> <span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC6'><span class="p">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">TestSuiteInitializer</span><span class="p">()</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Constructing TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'><span class="na">    [SetUp]</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">SetUp</span><span class="p">()</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Setting up TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC17'><br/></div><div class='line' id='LC18'><span class="na">    [TearDown]</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TearDown</span><span class="p">()</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Tearing down TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Disposing TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC28'><span class="p">}</span></div><div class='line' id='LC29'><span class="k">namespace</span> <span class="nn">SetUpFixtureSample</span></div><div class='line' id='LC30'><span class="p">{</span></div><div class='line' id='LC31'><span class="na">    [SetUpFixture]</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">NamespaceInitializer</span> <span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">NamespaceInitializer</span><span class="p">()</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Constructing NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC38'><br/></div><div class='line' id='LC39'><span class="na">        [SetUp]</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">SetUp</span><span class="p">()</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Setting up NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC44'><br/></div><div class='line' id='LC45'><span class="na">        [TearDown]</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TearDown</span><span class="p">()</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Tearing down NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC50'><br/></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Disposing NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC56'><br/></div><div class='line' id='LC57'><span class="na">    [TestFixture]</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">SimpleTests</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC60'><span class="na">        [Test]</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Test</span><span class="p">()</span></div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Executing test.&quot;</span><span class="p">);</span></div><div class='line' id='LC64'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC65'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC66'><span class="p">}</span></div><div class='line' id='LC67'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/09cac83547904afeee3339fada55cd9736766531/SetUpFixtureSample.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_sample.cs" style="float:right;margin-right:10px;color:#666">SetUpFixtureSample.cs</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'>Constructing TestSuiteInitializer.</div><div class='line' id='LC2'>Setting up TestSuiteInitializer.</div><div class='line' id='LC3'>Constructing NamespaceInitializer .</div><div class='line' id='LC4'>Setting up NamespaceInitializer .</div><div class='line' id='LC5'>Executing test.</div><div class='line' id='LC6'>Tearing down NamespaceInitializer .</div><div class='line' id='LC7'>Disposing NamespaceInitializer .</div><div class='line' id='LC8'>Tearing down TestSuiteInitializer.</div><div class='line' id='LC9'>Disposing TestSuiteInitializer.</div><div class='line' id='LC10'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/ca65ec50253e44314c4ef2d7ed90df1d50cc146f/SetUpFixtureSampleOutput.txt" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_sample_output.txt" style="float:right;margin-right:10px;color:#666">SetUpFixtureSampleOutput.txt</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span></div><div class='line' id='LC2'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="na">[SetUpFixture]</span></div><div class='line' id='LC5'><span class="k">public</span> <span class="k">class</span> <span class="nc">DatabaseInitializer</span></div><div class='line' id='LC6'><span class="p">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">DatabaseInitializer</span><span class="p">()</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Dropping Database.&quot;</span><span class="p">);</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Rebuild Database with latest Schema.&quot;</span><span class="p">);</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Load basic test environment data.&quot;</span><span class="p">);</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC13'><span class="p">}</span></div><div class='line' id='LC14'><span class="k">namespace</span> <span class="nn">SetUpFixtureSample.DatabaseTests</span></div><div class='line' id='LC15'><span class="p">{</span></div><div class='line' id='LC16'><span class="na">    [SetUpFixture]</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">DatabaseWithBasicAccountsInitializer</span><span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">DatabaseWithBasicAccountsInitializer</span><span class="p">()</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Loading basic account data.&quot;</span><span class="p">);</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Opening outer Transaction scope&quot;</span><span class="p">);</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC24'><br/></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Roll back transaction scope.&quot;</span><span class="p">);</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC30'><br/></div><div class='line' id='LC31'><span class="na">    [TestFixture]</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">BasicAccountTester1</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC34'><span class="na">        [Test]</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Test</span><span class="p">()</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Executing test 1.&quot;</span><span class="p">);</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC40'><br/></div><div class='line' id='LC41'><span class="na">    [TestFixture]</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">BasicAccountTester2</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC44'><span class="na">        [Test]</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Test</span><span class="p">()</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Executing test 2.&quot;</span><span class="p">);</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC50'><span class="p">}</span></div><div class='line' id='LC51'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/dbdd6e626ca1fe2d5611ba2071bfde48f82fe211/SetUpFixturesDatabaseExample.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixtures_database_example.cs" style="float:right;margin-right:10px;color:#666">SetUpFixturesDatabaseExample.cs</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'><span class="k">namespace</span> <span class="nn">SetUpFixtureSample</span></div><div class='line' id='LC4'><span class="p">{</span></div><div class='line' id='LC5'><span class="na">    [TestFixture]</span></div><div class='line' id='LC6'><span class="na">    [Explicit]</span></div><div class='line' id='LC7'><span class="na">    [Category(&quot;DataLoader&quot;)]</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">DataLoaderFixture</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC10'><span class="na">        [Test]</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">LoadData</span><span class="p">()</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//Clean the database</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//Load test data into the database</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC17'><span class="p">}</span></div><div class='line' id='LC18'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/c249304b7211f5804a33da2c46d5d330e5932203/SpecialDataLoader.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_special_data_loader.cs" style="float:right;margin-right:10px;color:#666">SpecialDataLoader.cs</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>The Explicit attribute means that the test fixture is not run if you execute all the tests in the assembly by default. Typically a test like this would be run by invoking the nunit console runner from an automated build to run only tests in the &#8220;DataLoader&#8221; category.</p>
<p>That&#8217;s not bad, but again &#8211; what happens on developer system when you forget to run the dataloader tests first? Or, what do you do when you&#8217;ve got different sets of tests that need different default data? You definitely don&#8217;t want each individual test or fixture going through an entire, scorched-earth style recreation of the entire database just to get to a clean state, do you?</p>
<p>Fortunately, NUnit provides a not-well-known, but powerful, soltuion for executing code before and after <em>any</em> tests run &#8211; the SetUpFixture. It doesn&#8217;t have the greatest name in the world, as it&#8217;s easily confused with TestFixtureSetup. The difference is that SetUpFixture runs around <em>all</em> the fixtures within the same namespace. SetUpFixture classes defined outside of a namespace will run before any tests in the entire assembly. Here&#8217;s a sample:</p>
<div id="gist-1313334" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span></div><div class='line' id='LC2'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="na">[SetUpFixture]</span></div><div class='line' id='LC5'><span class="k">public</span> <span class="k">class</span> <span class="nc">TestSuiteInitializer</span> <span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC6'><span class="p">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">TestSuiteInitializer</span><span class="p">()</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Constructing TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'><span class="na">    [SetUp]</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">SetUp</span><span class="p">()</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Setting up TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC17'><br/></div><div class='line' id='LC18'><span class="na">    [TearDown]</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TearDown</span><span class="p">()</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Tearing down TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Disposing TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC28'><span class="p">}</span></div><div class='line' id='LC29'><span class="k">namespace</span> <span class="nn">SetUpFixtureSample</span></div><div class='line' id='LC30'><span class="p">{</span></div><div class='line' id='LC31'><span class="na">    [SetUpFixture]</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">NamespaceInitializer</span> <span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">NamespaceInitializer</span><span class="p">()</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Constructing NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC38'><br/></div><div class='line' id='LC39'><span class="na">        [SetUp]</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">SetUp</span><span class="p">()</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Setting up NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC44'><br/></div><div class='line' id='LC45'><span class="na">        [TearDown]</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TearDown</span><span class="p">()</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Tearing down NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC50'><br/></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Disposing NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC56'><br/></div><div class='line' id='LC57'><span class="na">    [TestFixture]</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">SimpleTests</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC60'><span class="na">        [Test]</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Test</span><span class="p">()</span></div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Executing test.&quot;</span><span class="p">);</span></div><div class='line' id='LC64'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC65'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC66'><span class="p">}</span></div><div class='line' id='LC67'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/09cac83547904afeee3339fada55cd9736766531/SetUpFixtureSample.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_sample.cs" style="float:right;margin-right:10px;color:#666">SetUpFixtureSample.cs</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Which produces this output:</p>
<div id="gist-1313334" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'>Constructing TestSuiteInitializer.</div><div class='line' id='LC2'>Setting up TestSuiteInitializer.</div><div class='line' id='LC3'>Constructing NamespaceInitializer .</div><div class='line' id='LC4'>Setting up NamespaceInitializer .</div><div class='line' id='LC5'>Executing test.</div><div class='line' id='LC6'>Tearing down NamespaceInitializer .</div><div class='line' id='LC7'>Disposing NamespaceInitializer .</div><div class='line' id='LC8'>Tearing down TestSuiteInitializer.</div><div class='line' id='LC9'>Disposing TestSuiteInitializer.</div><div class='line' id='LC10'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/ca65ec50253e44314c4ef2d7ed90df1d50cc146f/SetUpFixtureSampleOutput.txt" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_sample_output.txt" style="float:right;margin-right:10px;color:#666">SetUpFixtureSampleOutput.txt</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>As you can see, the SetUpFixture classes exhibit the same nesting that we&#8217;ve come to expect from constructors, Dispose methods, SetUp, and TearDown atributes. As with basic test fixtures, I recommend that you use the construct/dispose pattern for SetUpFixture classes, and avoid the SetUp and TearDown-attributed methods. There&#8217;s no need for the extra layer of initialization.</p>
<p>Also note that SetUpFixture class construction and disposal is nested by namespace. If you have two of them in the same namespace though, order of execution between the two could be non-deterministic.</p>
<p>One of the great things about these SetUp fixture classes is that they run whenever tests in the same namespace are executed, regardless of how many tests within that namespace you happen to be running. The important thing is that your context of execution is always going to be firmly established, even if you&#8217;re only running one test. Andy, by establishing the right part of your entire testing context at the right leve, you can dramatically decrease the test time for expensive tests. For example, you could rebuild the whole test database in a SetUpFixture defined at the assembly level, and then establish and remove different sets of test data for related tests, organized by namespaces. This might look like this:</p>
<div id="gist-1313334" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'>Dropping Database.</div><div class='line' id='LC2'>Rebuild Database with latest Schema.</div><div class='line' id='LC3'>Load basic test environment data.</div><div class='line' id='LC4'>Loading basic account data.</div><div class='line' id='LC5'>Opening outer Transaction scope</div><div class='line' id='LC6'>Executing test 1.</div><div class='line' id='LC7'>Executing test 2.</div><div class='line' id='LC8'>Roll back transaction scope.</div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/7b4220df1413fbefdddc10b84a2e1bd473aa1d4f/SetUpFixtureDatabaseExampleOutput.txt" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_database_example_output.txt" style="float:right;margin-right:10px;color:#666">SetUpFixtureDatabaseExampleOutput.txt</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span></div><div class='line' id='LC2'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="na">[SetUpFixture]</span></div><div class='line' id='LC5'><span class="k">public</span> <span class="k">class</span> <span class="nc">TestSuiteInitializer</span> <span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC6'><span class="p">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">TestSuiteInitializer</span><span class="p">()</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Constructing TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'><span class="na">    [SetUp]</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">SetUp</span><span class="p">()</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Setting up TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC17'><br/></div><div class='line' id='LC18'><span class="na">    [TearDown]</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TearDown</span><span class="p">()</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Tearing down TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Disposing TestSuiteInitializer.&quot;</span><span class="p">);</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC28'><span class="p">}</span></div><div class='line' id='LC29'><span class="k">namespace</span> <span class="nn">SetUpFixtureSample</span></div><div class='line' id='LC30'><span class="p">{</span></div><div class='line' id='LC31'><span class="na">    [SetUpFixture]</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">NamespaceInitializer</span> <span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">NamespaceInitializer</span><span class="p">()</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Constructing NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC38'><br/></div><div class='line' id='LC39'><span class="na">        [SetUp]</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">SetUp</span><span class="p">()</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Setting up NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC44'><br/></div><div class='line' id='LC45'><span class="na">        [TearDown]</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TearDown</span><span class="p">()</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Tearing down NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC50'><br/></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Disposing NamespaceInitializer .&quot;</span><span class="p">);</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC56'><br/></div><div class='line' id='LC57'><span class="na">    [TestFixture]</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">SimpleTests</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC60'><span class="na">        [Test]</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Test</span><span class="p">()</span></div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Executing test.&quot;</span><span class="p">);</span></div><div class='line' id='LC64'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC65'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC66'><span class="p">}</span></div><div class='line' id='LC67'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/09cac83547904afeee3339fada55cd9736766531/SetUpFixtureSample.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_sample.cs" style="float:right;margin-right:10px;color:#666">SetUpFixtureSample.cs</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'>Constructing TestSuiteInitializer.</div><div class='line' id='LC2'>Setting up TestSuiteInitializer.</div><div class='line' id='LC3'>Constructing NamespaceInitializer .</div><div class='line' id='LC4'>Setting up NamespaceInitializer .</div><div class='line' id='LC5'>Executing test.</div><div class='line' id='LC6'>Tearing down NamespaceInitializer .</div><div class='line' id='LC7'>Disposing NamespaceInitializer .</div><div class='line' id='LC8'>Tearing down TestSuiteInitializer.</div><div class='line' id='LC9'>Disposing TestSuiteInitializer.</div><div class='line' id='LC10'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/ca65ec50253e44314c4ef2d7ed90df1d50cc146f/SetUpFixtureSampleOutput.txt" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_sample_output.txt" style="float:right;margin-right:10px;color:#666">SetUpFixtureSampleOutput.txt</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span></div><div class='line' id='LC2'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="na">[SetUpFixture]</span></div><div class='line' id='LC5'><span class="k">public</span> <span class="k">class</span> <span class="nc">DatabaseInitializer</span></div><div class='line' id='LC6'><span class="p">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">DatabaseInitializer</span><span class="p">()</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Dropping Database.&quot;</span><span class="p">);</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Rebuild Database with latest Schema.&quot;</span><span class="p">);</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Load basic test environment data.&quot;</span><span class="p">);</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC13'><span class="p">}</span></div><div class='line' id='LC14'><span class="k">namespace</span> <span class="nn">SetUpFixtureSample.DatabaseTests</span></div><div class='line' id='LC15'><span class="p">{</span></div><div class='line' id='LC16'><span class="na">    [SetUpFixture]</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">DatabaseWithBasicAccountsInitializer</span><span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">DatabaseWithBasicAccountsInitializer</span><span class="p">()</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Loading basic account data.&quot;</span><span class="p">);</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Opening outer Transaction scope&quot;</span><span class="p">);</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC24'><br/></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Roll back transaction scope.&quot;</span><span class="p">);</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC30'><br/></div><div class='line' id='LC31'><span class="na">    [TestFixture]</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">BasicAccountTester1</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC34'><span class="na">        [Test]</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Test</span><span class="p">()</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Executing test 1.&quot;</span><span class="p">);</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC40'><br/></div><div class='line' id='LC41'><span class="na">    [TestFixture]</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">BasicAccountTester2</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC44'><span class="na">        [Test]</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Test</span><span class="p">()</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Executing test 2.&quot;</span><span class="p">);</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC50'><span class="p">}</span></div><div class='line' id='LC51'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/dbdd6e626ca1fe2d5611ba2071bfde48f82fe211/SetUpFixturesDatabaseExample.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixtures_database_example.cs" style="float:right;margin-right:10px;color:#666">SetUpFixturesDatabaseExample.cs</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC2'><br/></div><div class='line' id='LC3'><span class="k">namespace</span> <span class="nn">SetUpFixtureSample</span></div><div class='line' id='LC4'><span class="p">{</span></div><div class='line' id='LC5'><span class="na">    [TestFixture]</span></div><div class='line' id='LC6'><span class="na">    [Explicit]</span></div><div class='line' id='LC7'><span class="na">    [Category(&quot;DataLoader&quot;)]</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">DataLoaderFixture</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC10'><span class="na">        [Test]</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">LoadData</span><span class="p">()</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//Clean the database</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="c1">//Load test data into the database</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC17'><span class="p">}</span></div><div class='line' id='LC18'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/c249304b7211f5804a33da2c46d5d330e5932203/SpecialDataLoader.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_special_data_loader.cs" style="float:right;margin-right:10px;color:#666">SpecialDataLoader.cs</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Which of course produces the following output:</p>
<div id="gist-1313334" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'>Dropping Database.</div><div class='line' id='LC2'>Rebuild Database with latest Schema.</div><div class='line' id='LC3'>Load basic test environment data.</div><div class='line' id='LC4'>Loading basic account data.</div><div class='line' id='LC5'>Opening outer Transaction scope</div><div class='line' id='LC6'>Executing test 1.</div><div class='line' id='LC7'>Executing test 2.</div><div class='line' id='LC8'>Roll back transaction scope.</div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1313334/7b4220df1413fbefdddc10b84a2e1bd473aa1d4f/SetUpFixtureDatabaseExampleOutput.txt" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1313334#file_set_up_fixture_database_example_output.txt" style="float:right;margin-right:10px;color:#666">SetUpFixtureDatabaseExampleOutput.txt</a>
            <a href="https://gist.github.com/1313334">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>The outermost SetUpFixture ensures that you always start from a known state, by dropping and rebuilding the test database. We open up a transaction within the namespace SetUpFixture&#8217;s constructor, and roll it back in the corresponding Dispose method. This technique can help ensure that your integration tests don&#8217;t develop unintended order dependencies by relying on data injected by other, previously run tests. Once all the tests in that namespace have run, all the database changes get rolled back. Now the next set of tests can start from a known data state again.</p>
<p>SetUpFixtures, by virtue of being run outside of, and around, all of your unit test fixtures, give you a lot of options in structuring the runtime context in which your unit tests execute. They can be a very powerful tool in your testing toolbelt. Hopefully this introduction to NUnit SetUpFixtures gives you some ideas on how you can re-structure and streamline your own test management &#8211; especially for those more challenging scenarios, like UI and integration tests.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.headspring.com/2011/10/unit-testing-best-practices-know-your-tests-lifecycle-part-3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unit Testing Best Practices: Know Your Test’s Lifecycle, Part 2</title>
		<link>http://www.headspring.com/2011/09/unit-testing-best-practices-know-your-tests-lifecycle-part-2</link>
		<comments>http://www.headspring.com/2011/09/unit-testing-best-practices-know-your-tests-lifecycle-part-2#comments</comments>
		<pubDate>Wed, 07 Sep 2011 17:34:21 +0000</pubDate>
		<dc:creator>Glenn Burnside</dc:creator>
				<category><![CDATA[Developer Deep Dive]]></category>
		<category><![CDATA[agile benefits]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.headspring.com/?p=1674</guid>
		<description><![CDATA[In my first post in the Unit Testing Best Practices series, I ...]]></description>
			<content:encoded><![CDATA[<p>In my <a title="Unit Testing Best Practices: Know your test’s lifecycle, Part 1" href="http://www.headspring.com/2011/08/unit-testing-best-practices-know-your-tests-lifecycle-part-1">first post in the Unit Testing Best Practices series</a>, I introduced you to the basic lifecycle of an NUnit test fixture. This time, we&#8217;re going to see what happens when we give our tests a common test fixture base class.<br />
<span class="Apple-style-span" style="font-size: 26px"><strong>Why a base class?</strong></span><br />
There are two cases where having a base test fixture can be useful in keeping your test code simpler:</p>
<ol>
<li><strong>You have lots of the same kind of tests. </strong>Maybe you&#8217;re writing integration tests for your persistence layer. Your tests are going to all be performing some similar operations, like creating a database connection. Maybe they all need to reference an Inversion of Control container like StructureMap or Autofac in order to retrieve repository instances. You don&#8217;t want to write that boilerplate code for every fixture, do you?</li>
<li><strong>You have a hierarchy of classes that need testing.</strong> If you have a base class in your domain, you will probably want to set up a parallel type hierarchy of test fixtures. In this case, a base test fixture gives you one place to define tests that verify the base class invariants to which all your derived classes need to conform.</li>
</ol>
<p><span class="Apple-style-span" style="font-size: 26px"><strong>The Code</strong></span></p>
<div>Let&#8217;s take a look at what happens to our simple test fixture when we give it a base class:<span id="more-1674"></span></p>
<p><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace;font-size: 12px;line-height: 18px"><div id="gist-1262440" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span></div><div class='line' id='LC2'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="k">namespace</span> <span class="nn">NUnitLifecycle</span></div><div class='line' id='LC5'><span class="p">{</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">abstract</span> <span class="k">class</span> <span class="nc">TestBase</span> <span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">protected</span> <span class="nf">TestBase</span><span class="p">()</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Base Constructor&quot;</span><span class="p">);</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'><span class="na">        [TestFixtureSetUp]</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">BaseTestFixtureSetUp</span><span class="p">()</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Base TestFixtureSetup&quot;</span><span class="p">);</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC18'><br/></div><div class='line' id='LC19'><span class="na">        [TestFixtureTearDown]</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">BaseTestFixtureTearDown</span><span class="p">()</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Base TestFixtureTearDown&quot;</span><span class="p">);</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC24'><br/></div><div class='line' id='LC25'><span class="na">        [SetUp]</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">BaseTestSetUp</span><span class="p">()</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Base SetUp&quot;</span><span class="p">);</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC30'><br/></div><div class='line' id='LC31'><span class="na">        [TearDown]</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">BaseTestTearDown</span><span class="p">()</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Base TearDown&quot;</span><span class="p">);</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC36'><br/></div><div class='line' id='LC37'><span class="na">        [Test]</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">BaseFirstTest</span><span class="p">()</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Base First Test passes!&quot;</span><span class="p">);</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Assert</span><span class="p">.</span><span class="n">Pass</span><span class="p">();</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC43'><br/></div><div class='line' id='LC44'><span class="na">        [Test]</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">BaseSecondTest</span><span class="p">()</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Base Second Test fails!&quot;</span><span class="p">);</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Assert</span><span class="p">.</span><span class="n">Fail</span><span class="p">();</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC50'><br/></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">virtual</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Base Dispose&quot;</span><span class="p">);</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC56'><br/></div><div class='line' id='LC57'><span class="na">    [TestFixture]</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">TestClass</span> <span class="p">:</span> <span class="n">TestBase</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC60'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">TestClass</span><span class="p">()</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC62'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Derived Constructor&quot;</span><span class="p">);</span></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC64'><br/></div><div class='line' id='LC65'><span class="na">        [TestFixtureSetUp]</span></div><div class='line' id='LC66'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TestClassSetUp</span><span class="p">()</span></div><div class='line' id='LC67'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC68'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Derived TestFixtureSetup&quot;</span><span class="p">);</span></div><div class='line' id='LC69'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC70'><br/></div><div class='line' id='LC71'><span class="na">        [TestFixtureTearDown]</span></div><div class='line' id='LC72'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TestClassTearDown</span><span class="p">()</span></div><div class='line' id='LC73'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC74'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Derived TestFixtureTearDown&quot;</span><span class="p">);</span></div><div class='line' id='LC75'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC76'><br/></div><div class='line' id='LC77'><span class="na">        [SetUp]</span></div><div class='line' id='LC78'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TestSetUp</span><span class="p">()</span></div><div class='line' id='LC79'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC80'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Derived SetUp&quot;</span><span class="p">);</span></div><div class='line' id='LC81'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC82'><br/></div><div class='line' id='LC83'><span class="na">        [TearDown]</span></div><div class='line' id='LC84'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TestTearDown</span><span class="p">()</span></div><div class='line' id='LC85'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC86'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Derived TearDown&quot;</span><span class="p">);</span></div><div class='line' id='LC87'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC88'><br/></div><div class='line' id='LC89'><span class="na">        [Test]</span></div><div class='line' id='LC90'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">FirstTest</span><span class="p">()</span></div><div class='line' id='LC91'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC92'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Derived First Test passes!&quot;</span><span class="p">);</span></div><div class='line' id='LC93'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Assert</span><span class="p">.</span><span class="n">Pass</span><span class="p">();</span></div><div class='line' id='LC94'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC95'><br/></div><div class='line' id='LC96'><span class="na">        [Test]</span></div><div class='line' id='LC97'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">SecondTest</span><span class="p">()</span></div><div class='line' id='LC98'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC99'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Derived Second Test fails!&quot;</span><span class="p">);</span></div><div class='line' id='LC100'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Assert</span><span class="p">.</span><span class="n">Fail</span><span class="p">();</span></div><div class='line' id='LC101'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC102'><br/></div><div class='line' id='LC103'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC104'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC105'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Derived Dispose&quot;</span><span class="p">);</span></div><div class='line' id='LC106'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">base</span><span class="p">.</span><span class="n">Dispose</span><span class="p">();</span></div><div class='line' id='LC107'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC108'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC109'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1262440/0e061c411776b772e04d021e7f142e9d2e385e32/NUnitLifecycle.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1262440#file_n_unit_lifecycle.cs" style="float:right;margin-right:10px;color:#666">NUnitLifecycle.cs</a>
            <a href="https://gist.github.com/1262440">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</span></p>
</div>
<p>Notice that the base class isn&#8217;t attributed with the [TestFixture] attribute. I only want this class to act as a base for my actual fixtures. I don&#8217;t intend for it to be run as a fixture in its own right.</p>
<p>Note too that I&#8217;m reinforcing the fact that this class doesn&#8217;t stand alone by making the base class abstract, and following standard practices for an abstract base class by making the constructor protected instead of public. We&#8217;ve also made the IDisposable.Dispose method implementation virtual so we can extend its behavior in derived classes.</p>
<p><em>Test code is still code. Follow the same design practices here that you would in your application code.</em></p>
<p><span class="Apple-style-span" style="font-size: 26px"><strong>The Results</strong></span><br />
Now when we run our tests, we get the following output:</p>
<ul>
<li>Base Constructor</li>
<li>Derived Constructor</li>
<ul>
<li>Base TestFixtureSetup</li>
<li>Derived TestFixtureSetup</li>
<ul>
<li>Base SetUp</li>
<li>Derived SetUp</li>
<ul>
<li>Derived First Test passes!</li>
</ul>
<li>Derived TearDown</li>
<li>Base TearDown</li>
<li>Base SetUp</li>
<li>Derived SetUp</li>
<ul>
<li>Derived Second Test fails!</li>
</ul>
<li>Derived TearDown</li>
<li>Base TearDown</li>
<li>Base SetUp</li>
<li>Derived SetUp</li>
<ul>
<li>Base First Test passes!</li>
</ul>
<li>Derived TearDown</li>
<li>Base TearDown</li>
<li>Base SetUp</li>
<li>Derived SetUp</li>
<ul>
<li>Base Second Test fails!</li>
</ul>
<li>Derived TearDown</li>
<li>Base TearDown</li>
</ul>
<li>Derived TestFixtureTearDown</li>
<li>Base TestFixtureTearDown</li>
</ul>
<li>Derived Dispose</li>
<li>Base Dispose</li>
</ul>
<p><span class="Apple-style-span" style="font-size: 26px"><strong>Observations</strong></span><br />
Note that even with a base class, all our observations from last time are still true:</p>
<ol>
<li>The Test Fixture class is constructed once.</li>
<li>TestFixtureSetup and TestFixtureTeardDown run one time.</li>
<li>TestSetup and TestTearDown run around every test.</li>
<li>TestTearDown runs even when a test fails.</li>
<li>NUnit knows about IDisposable.</li>
</ol>
<div>But now we can also see the following new behaviors:</div>
<div>
<ol>
<li><strong>TestFixture constructors and dispose methods are called in the same order as for any other class. </strong>This is one of the reasons I prefer using constructor/disposable semantics with test fixtures instead of relying on the special FixtureSetUp/FixtureTearDown attributes &#8211; we already know the rules for constructors and disposables.</li>
<li><strong>The base class SetUp and TearDown methods run <em>around</em> those from the derived class.</strong> This is true for both Fixture- and Test- SetUp and TearDown methods. You can think of your base class wrapping your derived class, like Russian nested dolls. This pattern also extends as you create deeper inheritance hierarchies. SetUp is run from the outermost base class down to the leaf derived class, and TearDown is run in exactly the opposite order.</li>
<li><strong>All Test-level SetUp and TearDown methods are run for <em>every</em> test. </strong>This behavior is a little surprising. Notice that even on the test methods defined in the base class, <em>the derived class&#8217; SetUp and TearDown methods are still getting run</em>. If you start seeing base class tests failing because something they expected from SetUp is suddenly different, this is a likely culprit.</li>
<li><strong>Tests are run in alphabetical order</strong>. Ok, you can&#8217;t infer this one from the output, you&#8217;re just going to have to take my word for it (or go play with the test names yourself and see what happens.) NUnit sorts all tests on the fixture by name, from A to Z, and then runs them in that order. Base class test methods are identified as &lt;ClassName&gt;.&lt;TestMethodName&gt; for purposes of sorting. This means that your base class tests will all be grouped together when the fixture is run, but they could all run right in the middle of your derived class&#8217; tests.</li>
</ol>
</div>
<div><span class="Apple-style-span" style="font-size: 26px"><strong>Guidelines</strong></span></div>
<p>You can quickly see from the results above that our first guideline, <em>Use constructors for class-wide setup. Use IDisposable for class-wide cleanup. Avoid TestFixtureSetup and TestFixtureTearDown, </em>is even more relevant once we start creating a hierarchy of test fixtures.  Constructors and IDisposable keep our test fixtures working like any other class we&#8217;d write.</p>
<div>Let&#8217;s add two more guidelines:</div>
<div>
<ol>
<li><strong>Don&#8217;t rely on test run order</strong>. Test method run order varies between different hosts. NUnit and ReSharper and Gallio rarely all agree on which order to run your tests. As a developer, you&#8217;re often not even running a full test suite -you&#8217;re running specific fixtures, or even just a few tests within a fixture. If your tests only pass when they&#8217;re run in a specific order, you&#8217;re going to waste a lot of time hunting down false failures. Remember, the closer you are to release, the more likely that your tests will start failing for &#8220;no reason at all.&#8221; Keep your tests independent of each other, and you&#8217;ll <em>always</em> be able to run them with confidence.</li>
<li><strong>Limit test-level SetUp and TearDown semantics<em>. </em></strong>It&#8217;s bad enough when a test fails. It&#8217;s even worse when you have to jump around between base and derived class code to stitch together what&#8217;s happening for each test. If at all possible, limit the definition of SetUp and TearDown methods to your base class. In recent years, I find that if I get my fixture initialization right in the constructor, then I rarely have to do much resetting around each individual test.</li>
</ol>
</div>
<div>You&#8217;ve now got a clear understanding of how an individual test fixture is created, initialized, and executed, and how that changes when the fixture has a derived class with its own lifecycle. You&#8217;ve also got a few more guidelines to help you keep your unit tests easy to maintain and extend.</div>
<p>Next time, we&#8217;re going to see how to run our own initialization code <em>before any of our test fixtures are even created. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.headspring.com/2011/09/unit-testing-best-practices-know-your-tests-lifecycle-part-2/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>You&#8217;re Doing Your Code Reviews Wrong!</title>
		<link>http://www.headspring.com/2011/09/youre-doing-your-code-reviews-wrong-2</link>
		<comments>http://www.headspring.com/2011/09/youre-doing-your-code-reviews-wrong-2#comments</comments>
		<pubDate>Fri, 02 Sep 2011 15:03:35 +0000</pubDate>
		<dc:creator>Glenn Burnside</dc:creator>
				<category><![CDATA[Developer Deep Dive]]></category>
		<category><![CDATA[What the tech?]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[code reviews]]></category>
		<category><![CDATA[developer productivity]]></category>

		<guid isPermaLink="false">http://www.headspring.com/?p=1595</guid>
		<description><![CDATA[Well, not YOU, of course. YOUR team&#8217;s code reviews, I&#8217;m sure, are ...]]></description>
			<content:encoded><![CDATA[<p>Well, not YOU, of course. YOUR team&#8217;s code reviews, I&#8217;m sure, are pleasant, productive engagements where everybody leaves feeling good about the results. They happen early and regularly in the development process, the goal of the review is well understood, and you wouldn&#8217;t dream of shipping a line of code that hadn&#8217;t been through your review process. Your team loves doing them, and you don&#8217;t worry about who does the review because you&#8217;ve got a consistent standard that your whole team agrees with. You&#8217;re just reading this article because there&#8217;s this <em>other </em>team in the building that you think would benefit from reading it, and you&#8217;re going to forward it to them when you&#8217;re done reading.</p>
<p>I&#8217;m with you. Personally, I&#8217;ve <em>never</em> sat around a meeting table with 15 other developers,<span id="more-1595"></span> all checking their email, while one poor sacrificial lamb walked us through a line-by-line explanation of code in &#8220;Representative changeset XYZ&#8221; the day <em>after</em> we put it into production. I&#8217;ve <em>never</em> been told (or said!) &#8220;That&#8217;s good feedback, but we don&#8217;t have time to re-test those changes before the release date.&#8221; And I&#8217;ve <em>never, ever</em> had an hours-long debate about where our braces should go.</p>
<p>Really.</p>
<p>But, for the benefit of that <em>other</em> team, I&#8217;ve put together some advice about  <span style="color: #000000;"><a href="http://info.headspring.com/conducting-effective-code-reviews-copy/" target="_blank">how to conduct effective code reviews</a></span>. Some of the things I cover are:</p>
<ul>
<li>Understanding why we do code reviews in the first place</li>
<li>Using code reviews to drive quality in your products early</li>
<li>Getting a consistent code style across your team so you can focus on higher-level issues</li>
<li>And more.</li>
</ul>
<p>&nbsp;</p>
<div>Come take a look at <em><span style="color: #ff0000;"><a href="http://info.headspring.com/conducting-effective-code-reviews/?utm_campaign=CTA-button-for-Code-Review-WP-from-Blog&amp;utm_source=Blog" target="_blank">Conducting Effective Code Reviews</a></span></em>, and remember to share it with the guys down the hall who <em>actually</em> need it!</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span id="hs-cta-wrapper-1c7aa6d9-d752-4261-853d-f4a0edf52a78" class="hs-cta-wrapper"> <span id="hs-cta-1c7aa6d9-d752-4261-853d-f4a0edf52a78" class="hs-cta-node hs-cta-1c7aa6d9-d752-4261-853d-f4a0edf52a78"><br />
<a href="http://info.headspring.com/conducting-effective-code-reviews/?utm_campaign=CTA-button-for-Code-Review-WP-from-Blog&amp;utm_source=Blog"><img id="hs-cta-img-1c7aa6d9-d752-4261-853d-f4a0edf52a78" class="hs-cta-img" style="border-width: 0px;" src="//d1n2i0nchws850.cloudfront.net/portals/108832/4c578b8b-67d3-4a9b-a2fb-e7df91ffcc31-1315504431849/download-code-review-whitepaper.png?v=1315504432.77" alt="download-code-review-whitepaper" /></a><br />
</span><br />
<script type="text/javascript">// <![CDATA[
(function(){
  var hsjs = document.createElement("script");
     hsjs.type = "text/javascript";
     hsjs.async = true;
     hsjs.src = "//cta-service.cms.hubspot.com/cta-service/loader.js?placement_guid=1c7aa6d9-d752-4261-853d-f4a0edf52a78";
  (document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]).appendChild(hsjs);
  setTimeout(function() {document.getElementById("hs-cta-1c7aa6d9-d752-4261-853d-f4a0edf52a78").style.visibility="hidden"}, 1);
  setTimeout(function() {document.getElementById("hs-cta-1c7aa6d9-d752-4261-853d-f4a0edf52a78").style.visibility="visible"}, 2000);
})();
// ]]&gt;</script><br />
<!-- HubSpot Call-to-Action Code --><br />
<!-- hs-cta-wrapper --></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.headspring.com/2011/09/youre-doing-your-code-reviews-wrong-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unit Testing Best Practices: Know your test&#8217;s lifecycle, Part 1</title>
		<link>http://www.headspring.com/2011/08/unit-testing-best-practices-know-your-tests-lifecycle-part-1</link>
		<comments>http://www.headspring.com/2011/08/unit-testing-best-practices-know-your-tests-lifecycle-part-1#comments</comments>
		<pubDate>Wed, 17 Aug 2011 21:03:28 +0000</pubDate>
		<dc:creator>Glenn Burnside</dc:creator>
				<category><![CDATA[Developer Deep Dive]]></category>
		<category><![CDATA[quattro]]></category>

		<guid isPermaLink="false">http://www.headspring.com/?p=1438</guid>
		<description><![CDATA[A long time ago, my development team decided to write our own ...]]></description>
			<content:encoded><![CDATA[<p>A long time ago, my development team decided to write our own unit test framework. Today that would be ridiculous, because there are so many mature options from the .NET community (NUnit, MbUnit, xUnit, MsTest, to name a few). But this was 2002, .NET was brand new, and we thought attribute-based metadata was a better approach to describing tests than the interface-and-naming-convention pattern that NUnit required at the time.</p>
<p>Of course, about the same time we&#8217;d gotten our homegrown framework running and built a couple thousand tests with it, NUnit 2.0 came out with a brand-new and shiny attribute-based metadata approach. We spent the next 3 years wishing we had the time to port all our tests to NUnit, and stealing features from it for our custom test runner.<span id="more-1438"></span></p>
<p>One of the things I really envied about NUnit was its test method lifecycle. We support setup and teardown methods, but we never went beyond that. NUnit, by comparison has a rich set of events that occur for each test that gets run. Whenever I teach our <a title="Agile Bootcamp" href="http://www.headspring.com/services/developer-training/agile-bootcamp">Agile Boot Camp class</a>, I always make sure to walk students through the finer points of a test fixture&#8217;s life, so they&#8217;ll know the best way to organize their test code. When you&#8217;re first writing unit tests, knowing whether to put something in the test method, the setup, the fixture setup, or somewhere else, just isn&#8217;t all that obvious. Oftentimes, I see people putting expensive initialization code into every single test method, which causes their tests to run slower than they need to.</p>
<p><strong>Note: </strong>I&#8217;m using NUnit for these examples. Other frameworks have different semantics, and I recommend you write some similar code for whatever library you use. For me, NUnit&#8217;s always been the draft horse of .NET test frameworks &#8211; stable, steady, gets along with everybody, and does what I expect.</p>
<p>If you&#8217;re not already familiar with NUnit, take a look at their <a title="NUnit Quick-start guide" href="http://www.nunit.org/index.php?p=quickStart&amp;r=2.6">quick-start guide </a>and then come back. I&#8217;ll wait.</p>
<p>Now, take a look at this simple test fixture class:</p>
<div id="gist-1200910" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">using</span> <span class="nn">System</span><span class="p">;</span></div><div class='line' id='LC2'><span class="k">using</span> <span class="nn">NUnit.Framework</span><span class="p">;</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="k">namespace</span> <span class="nn">NUnitLifecycle</span></div><div class='line' id='LC5'><span class="p">{</span></div><div class='line' id='LC6'><span class="na">    [TestFixture]</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">class</span> <span class="nc">TestClass</span> <span class="p">:</span> <span class="n">IDisposable</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">TestClass</span><span class="p">()</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Constructor&quot;</span><span class="p">);</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC13'><br/></div><div class='line' id='LC14'><span class="na">        [TestFixtureSetUp]</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TestClassSetUp</span><span class="p">()</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;TestFixtureSetup&quot;</span><span class="p">);</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC19'><br/></div><div class='line' id='LC20'><span class="na">        [TestFixtureTearDown]</span></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TestClassTearDown</span><span class="p">()</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;TestFixtureTearDown&quot;</span><span class="p">);</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC25'><br/></div><div class='line' id='LC26'><span class="na">        [SetUp]</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TestSetUp</span><span class="p">()</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;SetUp&quot;</span><span class="p">);</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC31'><br/></div><div class='line' id='LC32'><span class="na">        [TearDown]</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">TestTearDown</span><span class="p">()</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;TearDown&quot;</span><span class="p">);</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC37'><br/></div><div class='line' id='LC38'><span class="na">        [Test]</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">FirstTest</span><span class="p">()</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;First Test passes!&quot;</span><span class="p">);</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Assert</span><span class="p">.</span><span class="n">Pass</span><span class="p">();</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC44'><br/></div><div class='line' id='LC45'><span class="na">        [Test]</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">SecondTest</span><span class="p">()</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Second Test fails!&quot;</span><span class="p">);</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Assert</span><span class="p">.</span><span class="n">Fail</span><span class="p">();</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC51'><br/></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Dispose</span><span class="p">()</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Dispose&quot;</span><span class="p">);</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC56'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC57'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1200910/e8eb5fe35d186d53ce32993be0f7ae322b9a3cda/NUnitLifeCycle.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1200910#file_n_unit_life_cycle.cs" style="float:right;margin-right:10px;color:#666">NUnitLifeCycle.cs</a>
            <a href="https://gist.github.com/1200910">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>This fixture has two test methods, one which passes and one which fails. When we run the test framework in NUnit&#8217;s test runner, we get this output:</p>
<p>&nbsp;</p>
<pre>Constructor
TestFixtureSetup
SetUp
First Test passes!
TearDown
SetUp
Second Test fails!
TearDown
TestFixtureTearDown
Dispose</pre>
<p>So, what does this tell us about the lifecycle of a test within a fixture?</p>
<ol>
<li><strong>The Test Fixture class is constructed once.</strong>  NUnit invokes all the test methods on the same fixture instance.</li>
<li><strong>TestFixtureSetup and TestFixtureTeardDown run one time. </strong>TestFixtureSetup is run immediately after construction, and only runs once for the entire test run. TestFixtureTearDown is called immediately after all test methods have been run.</li>
<li><strong>TestSetup and TestTearDown run around every test</strong>. These two methods execute immediately before, and immediately after, each test method.</li>
<li><strong>TestTearDown runs even when a test fails.</strong> Noice that Even when the second test exits with a failed assertion, the TearDown method is still called for that method.</li>
<li><strong>NUnit knows about IDisposable.</strong> Did you notice that our class implemented IDisposable? IDisposable is .NET&#8217;s canonical interface for when you have a resource whose scope needs to be managed. The IDisposable.Dispose method is the last method called on our fixture class.</li>
</ol>
<div>So now that we know what interesting methods are called, when, and how often, what can we conclude? Well, here&#8217;s my first guideline for you:</div>
<div>
<ol>
<li><strong>Use constructors for class-wide setup. Use IDisposable for class-wide cleanup. Avoid TestFixtureSetup and TestFixtureTearDown. </strong>I&#8217;ve found that the fixture-level setup and teardown methods create more confusion than they&#8217;re worth. In Part 2, we&#8217;ll see just how complicated this can get when you have a base class for your test fixture. But even with a simple fixture class like the above, There&#8217;s no reason to have two places for your class&#8217; initialization and cleanup code. That&#8217;s basically a guarantee that it&#8217;s going to get chopped up between the two with no rhyme or reason. Every .NET developer knows the constructor/dispose pattern. We don&#8217;t need another one.</li>
</ol>
<p>Hopefully this paints a clearer picture of what happens when you actually run a set of unit tests. Next time, we&#8217;re going to see what happens when we give our test fixture a base class with its own setup, teardown, and test methods, and how they interact with the ones we already have.</p>
</div>
<p><span class="hs-cta-wrapper"><br />
<!--HubSpot Call-to-Action Code --><br />
<span class="hs-cta-node hs-cta-b79c9a5c-9b31-449f-a844-c4e0f78bcc7e"><br />
<a href="http://info.headspring.com/headsprings-agile-bootcamp"><img class="hs-cta-img" style="border-width: 0px;" src="//d1n2i0nchws850.cloudfront.net/portals/108832/27ba5f85-79f5-4259-aec5-30679c2b01c9-1313694757280/learn-more-about-unit-tests-at-agile-boot-camp.png?v=1313694757.54" alt="learn-more-about-unit-tests-at-agile-boo" /></a><br />
</span><br />
//<br />
<!-- HubSpot Call-to-Action Code --><br />
<!-- hs-cta-wrapper --></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.headspring.com/2011/08/unit-testing-best-practices-know-your-tests-lifecycle-part-1/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.headspring.com @ 2012-05-18 12:41:30 -->
