| <!-- saved from url=(0014)about:internet --><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> |
| <html> |
| <!-- Standard Head Part --> |
| <head> |
| <title>NUnit - Theory</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> |
| <meta http-equiv="Content-Language" content="en-US"> |
| <link rel="stylesheet" type="text/css" href="nunit.css"> |
| <link rel="shortcut icon" href="favicon.ico"> |
| </head> |
| <!-- End Standard Head Part --> |
| |
| <body> |
| |
| <!-- Standard Header for NUnit.org --> |
| <div id="header"> |
| <a id="logo" href="http://www.nunit.org"><img src="img/logo.gif" alt="NUnit.org" title="NUnit.org"></a> |
| <div id="nav"> |
| <a href="http://www.nunit.org">NUnit</a> |
| <a class="active" href="index.html">Documentation</a> |
| </div> |
| </div> |
| <!-- End of Header --> |
| |
| <div id="content"> |
| |
| <h3>TheoryAttribute (NUnit 2.5) (Experimental)</h3> |
| |
| <p>A Theory is a special type of test, used to verify a general |
| statement about the system under development. Normal tests are |
| <em>example-based</em>. That is, the developer supplies one or |
| more examples of inputs and expected outputs either within the |
| code of the test or - in the case of |
| <a href="parameterizedTests.html">Parameterized Tests</a> |
| - as arguments to the test method. A theory, on the other hand, |
| makes a general statement that all of its assertions will pass |
| for all arguments satisfying certain assumptions. |
| |
| <p>Theories are implemented in NUnit |
| as methods within a <b>TestFixture</b>, which are annotated |
| with the <b>TheoryAttribute</b>. Theory methods must always have |
| arguments and therefore appears quite similar to |
| <a href="parameterizedTests.html">Parameterized Tests</a> at first glance. However, a Theory incorporates additional data sources |
| for its arguments and allows special processing for assumptions |
| about that data. The key difference, though, is that theories |
| make general statements and are more than just a set of examples. |
| |
| <h4>Data for Theories</h4> |
| |
| <p>The primary source of data for a <b>Theory</b> is the |
| <a href="datapoint.html"><b>Datapoint</b> or <b>Datapoints</b> attribute</a>. |
| NUnit will use any fields of the required types, which are annotated |
| with one of these attributes, to provide data for each parameter |
| of the Theory. NUnit assembles the values for individual arguments |
| combinatorially to provide test cases for the theory. |
| |
| <p>In addition to the Datapoint and Datapoints attributes, it |
| is possible to use any of the approaches for supplying data |
| that are recognized on normal parameterized tests. We suggest |
| that this capability not be overused, since it runs counter |
| to the distinction between a test based on examples and a |
| theory. However, it may be useful in order to guarantee that |
| a specific test case is included. |
| |
| <h4>Assumptions</h4> |
| |
| <p>The theory itself is responsible for ensuring that all data supplied |
| meets its assumptions. It does this by use of the |
| <b>Assume.That(...)</b> construct, which works just like |
| <b>Assert.That(...)</b> but does not cause a failure. If |
| the assumption is not satisfied for a particular test case, that case |
| returns an Inconclusive result, rather than a Success or Failure. |
| |
| <p>The overall result of executing a Theory over a set of test cases is |
| determined as follows: |
| |
| <ul> |
| <li>If the assumptions are violated for <b>all</b> test cases, then the |
| Theory itself is marked as a failure. |
| |
| <li>If any Assertion fails, the Theory itself fails. |
| |
| <li>If at least <b>some</b> cases pass the stated assumptions, and |
| there are <b>no</b> assertion failures or exceptions, then the |
| Theory passes. |
| </ul> |
| |
| <h4>Example:</h4> |
| |
| <p>In the following example, the theory SquareRootDefinition |
| verifies that the implementation of square root satisies |
| the following definition: |
| |
| <p style="margin: 2em"><i> |
| "Given a non-negative number, the square root of that number |
| is always non-negative and, when multiplied by itself, gives |
| the original number."</i> |
| |
| <div class="code" style="width: 36em"> |
| <pre> |
| public class SqrtTests |
| { |
| [Datapoints] |
| public double[] values = new double[] { 0.0, 1.0, -1.0, 42.0 }; |
| |
| [Theory] |
| public void SquareRootDefinition(double num) |
| { |
| Assume.That(num >= 0.0); |
| |
| double sqrt = Math.Sqrt(num); |
| |
| Assert.That(sqrt >= 0.0); |
| Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001)); |
| } |
| } |
| </pre> |
| </div> |
| |
| <h4>See also...</h4> |
| |
| <ul> |
| <li><a href="datapoint.html">Datapoint(s)Attribute</a><li><a href="parameterizedTests.html">Parameterized Tests</a></ul> |
| |
| </div> |
| |
| <!-- Submenu --> |
| <div id="subnav"> |
| <ul> |
| <li><a href="index.html">NUnit 2.5.9</a></li> |
| <ul> |
| <li><a href="getStarted.html">Getting Started</a></li> |
| <li><a href="assertions.html">Assertions</a></li> |
| <li><a href="constraintModel.html">Constraints</a></li> |
| <li><a href="attributes.html">Attributes</a></li> |
| <ul> |
| <li><a href="category.html">Category</a></li> |
| <li><a href="combinatorial.html">Combinatorial</a></li> |
| <li><a href="culture.html">Culture</a></li> |
| <li><a href="datapoint.html">Datapoint(s)</a></li> |
| <li><a href="description.html">Description</a></li> |
| <li><a href="exception.html">Exception</a></li> |
| <li><a href="explicit.html">Explicit</a></li> |
| <li><a href="ignore.html">Ignore</a></li> |
| <li><a href="maxtime.html">Maxtime</a></li> |
| <li><a href="pairwise.html">Pairwise</a></li> |
| <li><a href="platform.html">Platform</a></li> |
| <li><a href="property.html">Property</a></li> |
| <li><a href="random.html">Random</a></li> |
| <li><a href="range.html">Range</a></li> |
| <li><a href="repeat.html">Repeat</a></li> |
| <li><a href="requiredAddin.html">RequiredAddin</a></li> |
| <li><a href="requiresMTA.html">Requires MTA</a></li> |
| <li><a href="requiresSTA.html">Requires STA</a></li> |
| <li><a href="requiresThread.html">Requires Thread</a></li> |
| <li><a href="sequential.html">Sequential</a></li> |
| <li><a href="setCulture.html">SetCulture</a></li> |
| <li><a href="setup.html">Setup</a></li> |
| <li><a href="setupFixture.html">SetupFixture</a></li> |
| <li><a href="suite.html">Suite</a></li> |
| <li><a href="teardown.html">Teardown</a></li> |
| <li><a href="test.html">Test</a></li> |
| <li><a href="testCase.html">TestCase</a></li> |
| <li><a href="testCaseSource.html">TestCaseSource</a></li> |
| <li><a href="testFixture.html">TestFixture</a></li> |
| <li><a href="fixtureSetup.html">TestFixtureSetUp</a></li> |
| <li><a href="fixtureTeardown.html">TestFixtureTearDown</a></li> |
| <li id="current"><a href="theory.html">Theory</a></li> |
| <li><a href="timeout.html">Timeout</a></li> |
| <li><a href="values.html">Values</a></li> |
| <li><a href="valueSource.html">ValueSource</a></li> |
| </ul> |
| <li><a href="runningTests.html">Running Tests</a></li> |
| <li><a href="extensibility.html">Extensibility</a></li> |
| <li><a href="releaseNotes.html">Release Notes</a></li> |
| <li><a href="samples.html">Samples</a></li> |
| <li><a href="license.html">License</a></li> |
| </ul> |
| </ul> |
| </div> |
| <!-- End of Submenu --> |
| |
| |
| <!-- Standard Footer for NUnit.org --> |
| <div id="footer"> |
| Copyright © 2010 Charlie Poole. All Rights Reserved. |
| </div> |
| <!-- End of Footer --> |
| |
| </body> |
| </html> |