| <?xml version="1.0" encoding="UTF-8"?> |
| <org.eclipse.epf.uma:ContentDescription xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:org.eclipse.epf.uma="http://www.eclipse.org/epf/uma/1.0.3/uma.ecore" rmc:version="7.1.0" epf:version="1.0.0" xmi:id="_Hg5UUMPbEdmbOvqy4O0adg" name="test_first_design,_0Y6kUMlgEdmt3adZL5Dmdw" guid="_Hg5UUMPbEdmbOvqy4O0adg" changeDate="2006-08-15T17:49:28.248-0700"> |
| <mainDescription><h3> |
| Introduction |
| </h3> |
| <p> |
| With Test-First Design (TFD) you do detailed design in a just-in-time (JIT) manner&nbsp;via writing a single test |
| before writing just enough production code to fulfill that test.&nbsp; When you have new functionality to add to your |
| system, perform the following steps: |
| </p> |
| <ol> |
| <li> |
| <strong>Quickly add a test</strong>.&nbsp; You need just enough code to fail.&nbsp; |
| </li> |
| <li> |
| <strong>Run your tests</strong>.&nbsp; You will&nbsp;typically run the complete test suite, although for sake of |
| speed you may decide to run only a subset.&nbsp; The goal is&nbsp;to ensure that the new test does in fact |
| fail.&nbsp; |
| </li> |
| <li> |
| <strong>Update your production code</strong>.&nbsp;&nbsp;The goal is to add just enough functionality so that |
| your&nbsp;code&nbsp;passes the new test.&nbsp; |
| </li> |
| <li> |
| <strong>Run your test suite&nbsp;again</strong>.&nbsp; If they tests fail you need to update your functional code |
| and retest.&nbsp; Once the tests pass, start over.&nbsp; |
| </li> |
| </ol> |
| <br /> |
| <p> |
| <img height="600" alt="Test First Design Flow" src="./resources/testFirstDesign.jpg" width="294" />&nbsp; |
| </p> |
| <h4> |
| Why TFD? |
| </h4> |
| <p> |
| A significant advantage of TFD is that it enables you to take small steps when writing software, which is not only |
| safer it is also far more productive than writing code&nbsp;in large steps.<span style="mso-spacerun: yes">&nbsp;</span> For example, assume you add some new functional code, compile, and test |
| it.<span style="mso-spacerun: yes">&nbsp;</span> Chances are pretty good that your tests will be broken by defects that |
| exist in the new code.<span style="mso-spacerun: yes">&nbsp;</span> It is much easier to find, and then fix, those |
| defects if you've written five new lines of code than in fifty lines. The implication is that the faster your compiler |
| and regression test suite, the more attractive it is to proceed in smaller and smaller steps.<span style="mso-spacerun: yes">&nbsp;</span> |
| </p> |
| <p> |
| There are three other common testing strategies (in order of effectiveness). |
| </p> |
| <ol> |
| <li> |
| <strong>Write&nbsp;several tests first</strong>.&nbsp; This is a variant of TFD where you write more than one test |
| before writing just enough production code to fulfill those tests.&nbsp; The advantage is that you don't need to |
| build your system as often,&nbsp;potentially saving time.&nbsp; It&nbsp;has the disadvantage that you will write |
| more&nbsp;production code at once, increasing the difficulty of finding any new bugs that you do introduce. |
| </li> |
| <li> |
| <strong>Test after the fact</strong>.&nbsp; With this approach you write some production code then you write enough |
| testing code to validate it.&nbsp; This has the advantage that you're at least still validating the code but has |
| the disadvantage that you lose the design benefit inherent in writing the testing code first. |
| </li> |
| <li> |
| <strong>Don't test at all</strong>.&nbsp; This is a really bad idea. |
| </li> |
| </ol> |
| <br /> |
| <h3> |
| Good Things to Know |
| </h3> |
| <p> |
| 1. An underlying assumption of TDD is that you have a unit-testing framework available to you.<span style="mso-spacerun: yes">&nbsp;</span> Agile software developers often use the xUnit family of open source tools, such |
| as <a href="http://www.junit.org/" ><strong>JUnit</strong></a> or <a href="http://www.vbunit.org/" ><strong>VBUnit</strong></a>, although commercial tools are |
| also viable options.<span style="mso-spacerun: yes">&nbsp;&nbsp;</span><span style="mso-spacerun: yes">&nbsp;</span> |
| </p> |
| <p> |
| 2. Test-Driven Design (TDD) = TFD + <a class="elementLink" href="./../../../openup_basic/guidances/concepts/refactoring,_Poc7IPDzEdqYgerqi84oCA.html" guid="_Poc7IPDzEdqYgerqi84oCA">Refactoring</a> |
| </p> |
| <p> |
| 3. TFD/TDD is commonly used with object-oriented business code, although you can also take this approach with |
| procedural code, user-interface code, and your database code if you choose to. |
| </p> |
| <p> |
| 4. A more thorough discussion of TFD and TDD is presented at <a href="http://www.agiledata.org/essays/tdd.html" target="_blank" >Introduction to Test Driven Development (TDD)</a>. |
| </p> |
| <br /></mainDescription> |
| </org.eclipse.epf.uma:ContentDescription> |