<?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.6/uma.ecore" xmlns:epf="http://www.eclipse.org/epf" epf:version="1.5.1" xmi:id="-jc10ie6UDWUJzSDfsQExjw" name="test_driven_development_tdd,3.9254165491375454E-306" guid="-jc10ie6UDWUJzSDfsQExjw" changeDate="2006-11-22T02:47:42.164+0330" version="1.0.0">
  <mainDescription>&lt;a id=&quot;XE_xp__test_driven_development&quot; name=&quot;XE_xp__test_driven_development&quot;>&lt;/a>&lt;a id=&quot;XE_test_driven_development__in_xp&quot; name=&quot;XE_test_driven_development__in_xp&quot;>&lt;/a> &#xD;
&lt;h3>&#xD;
    Topics&#xD;
&lt;/h3>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#WhatIs&quot;>What is TDD?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#Java&quot;>A TDD Example in Java&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#Benefits&quot;>What are the benefits of TDD?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#Costs&quot;>What are the costs of TDD?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#Principles&quot;>What testing principles should I employ?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#GUIS&quot;>How do I test GUIs?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#Embedded&quot;>How do I test embedded systems?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#Concurrency&quot;>How do I test concurrency?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#Database&quot;>How do I test database transactions?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#Servlets&quot;>How do I test servlets?&lt;/a>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;a href=&quot;#WebPages&quot;>How do I test web pages?&lt;/a>&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;WhatIs&quot; name=&quot;WhatIs&quot;>What is TDD?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
    TDD is the practice of writing unit tests and production code concurrently and at a very fine level of granularity. A&#xD;
    pair of programmers first write a small portion of a unit test, and then they write just enough production code to make&#xD;
    that unit test compile and execute. Then they write a little bit more of the test and then add enough production code&#xD;
    to make that new bit compile and pass. This cycle lasts somewhere between 30 seconds and five minutes. Rarely does it&#xD;
    grow to ten minutes. In each cycle, the tests come first. Once a unit test is done, the pair goes on to the next test&#xD;
    until they run out of tests for the task they are currently working on.&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;Java&quot; name=&quot;Java&quot;>A TDD Example in Java&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
    What follows is a simple example of test-driven development. The program we are writing is a text formatter that can&#xD;
    take arbitrary strings and can horizontally center them in a page. The first column shows the tests, and the second&#xD;
    column shows the production code. The test is always written first and compiled. If the compile fails, then production&#xD;
    code is added to make the compile succeed. Then the test is run to see if it passes. If the test fails, then production&#xD;
    code is added to make the test pass. If the test passes, then a new test is added.&#xD;
&lt;/p>&#xD;
&lt;table width=&quot;100%&quot; border=&quot;1&quot;>&#xD;
    &lt;tbody>&#xD;
        &lt;tr>&#xD;
            &lt;td>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
                    &lt;font size=&quot;-1&quot;>&lt;i>&lt;b>First we write the test&lt;/b>&lt;/i>&lt;/font>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
            &lt;td>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
                    &lt;font size=&quot;-1&quot;>&lt;i>&lt;b>Then we write the production code&lt;/b>&lt;/i>&lt;/font>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
        &lt;/tr>&#xD;
    &lt;/tbody>&#xD;
    &lt;tbody>&#xD;
        &lt;tr>&#xD;
            &lt;td>&#xD;
&lt;pre>&#xD;
&lt;font size=&quot;2&quot;>&#xD;
public void testCenterLine(){ &#xD;
    Formatter f = new Formatter();&#xD;
}&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
&lt;pre>&#xD;
&lt;font color=&quot;#ff0000&quot; size=&quot;2&quot;>&#xD;
does not compile&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
            &lt;td>&#xD;
&lt;pre>&#xD;
&lt;font size=&quot;2&quot;>&#xD;
class Formatter{&#xD;
}&#xD;
&#xD;
&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
&lt;pre>&#xD;
&lt;font color=&quot;#008000&quot; size=&quot;2&quot;>&#xD;
compiles and passes&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
        &lt;/tr>&#xD;
        &lt;tr>&#xD;
            &lt;td>&#xD;
&lt;pre>&#xD;
&lt;font size=&quot;2&quot;>&#xD;
public void testCenterLine(){ &#xD;
    Formatter f = new Formatter(); &#xD;
    f.setLineWidth(10);              &#xD;
    assertEquals(&quot;   word   &quot;, f.center(&quot;word&quot;));&#xD;
}&#xD;
&#xD;
&#xD;
&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
&lt;pre>&#xD;
&lt;font color=&quot;#ff0000&quot; size=&quot;2&quot;>&#xD;
does not compile&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
            &lt;td>&#xD;
&lt;pre>&#xD;
&lt;font size=&quot;2&quot;>&#xD;
class Formatter{ &#xD;
    public void setLineWidth(int width) { &#xD;
    } &#xD;
&#xD;
&#xD;
    public String center(String line) {&lt;br />&#xD;
&#xD;
        return &quot;&quot;;&#xD;
    }&#xD;
}&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
&lt;pre>&#xD;
&lt;font color=&quot;#ff0000&quot; size=&quot;2&quot;>&#xD;
compiles and fails&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
        &lt;/tr>&#xD;
        &lt;tr>&#xD;
            &lt;td>&#xD;
                &lt;font size=&quot;2&quot;>&amp;nbsp;&lt;/font>&#xD;
            &lt;/td>&#xD;
            &lt;td>&#xD;
&lt;pre>&#xD;
&lt;font size=&quot;2&quot;>&#xD;
import java.util.Arrays;&#xD;
&#xD;
&#xD;
public class Formatter { &#xD;
    private int width;              &#xD;
    private char spaces[]; &#xD;
    &#xD;
    public void setLineWidth(int width) { &#xD;
        this.width = width; &#xD;
        spaces = new char[width]; &#xD;
        Arrays.fill(spaces, ' '); &#xD;
    } &#xD;
&#xD;
   &#xD;
    public String center(String line) { &#xD;
        StringBuffer b = new StringBuffer();&#xD;
        int padding = width/2 - line.length(); &#xD;
        b.append(spaces, 0, padding);              &#xD;
        b.append(line); &#xD;
        b.append(spaces, 0, padding); &#xD;
        return b.toString();              &#xD;
    }&#xD;
}&#xD;
&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
&lt;pre>&#xD;
&lt;font color=&quot;#ff0000&quot; size=&quot;2&quot;>&#xD;
compiles and unexpectedly fails&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
        &lt;/tr>&#xD;
        &lt;tr>&#xD;
            &lt;td>&#xD;
                &lt;font size=&quot;2&quot;>&amp;nbsp;&lt;/font>&#xD;
            &lt;/td>&#xD;
            &lt;td>&#xD;
&lt;pre>&#xD;
&lt;font size=&quot;2&quot;>&#xD;
public String center(String line) { &#xD;
    StringBuffer b = new StringBuffer();              &#xD;
    &lt;b>&#xD;
int padding = (width - line.length()) / 2;&lt;/b> &#xD;
    b.append(spaces, 0, padding);              &#xD;
    b.append(line); &#xD;
    b.append(spaces, 0, padding); &#xD;
    return b.toString();              &#xD;
}&#xD;
&#xD;
&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
&lt;pre>&#xD;
&lt;font color=&quot;#008000&quot; size=&quot;2&quot;>&#xD;
compiles and passes&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
        &lt;/tr>&#xD;
        &lt;tr>&#xD;
            &lt;td>&#xD;
&lt;pre>&#xD;
&lt;font size=&quot;2&quot;>&#xD;
public void testCenterLine() {&#xD;
    Formatter f = new Formatter();                &#xD;
    f.setLineWidth(10); &#xD;
    assertEquals(&quot;   word   &quot;, f.center(&quot;word&quot;));&#xD;
} &#xD;
&#xD;
&lt;b>&#xD;
public void testOddCenterLine() { &#xD;
    Formatter f = new Formatter();&#xD;
    f.setLineWidth(10); &#xD;
    assertEquals( &quot;  hello    &quot;, f.center(&quot;hello&quot;));&#xD;
}&lt;/b>&#xD;
&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
&lt;pre>&#xD;
&lt;font color=&quot;#ff0000&quot; size=&quot;2&quot;>&#xD;
compiles and fails&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
            &lt;td>&#xD;
&lt;pre>&#xD;
&lt;font size=&quot;2&quot;>&#xD;
public String center(String line) { &#xD;
    &lt;b>&#xD;
int remainder = 0;&lt;/b> &#xD;
    StringBuffer b = new StringBuffer(); &#xD;
    int padding = (width - line.length()) / 2;&#xD;
    &lt;b>&#xD;
remainder = line.length() % 2;&lt;/b> &#xD;
    b.append(spaces, 0, padding); &#xD;
    b.append(line);&#xD;
    b.append(spaces, 0, padding + &lt;b>&#xD;
remainder&lt;/b>); &#xD;
    return b.toString(); &#xD;
}&#xD;
&#xD;
&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;div align=&quot;center&quot;>&#xD;
&lt;pre>&#xD;
&lt;font color=&quot;#008000&quot; size=&quot;2&quot;>&#xD;
compiles and passes&lt;/font>&#xD;
&lt;/pre>&#xD;
                &lt;/div>&#xD;
            &lt;/td>&#xD;
        &lt;/tr>&#xD;
    &lt;/tbody>&#xD;
&lt;/table>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;Benefits&quot; name=&quot;Benefits&quot;>What are the benefits of TDD?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        &lt;b>Test Coverage&lt;/b>. If you follow the rules of TDD, then virtually 100% of the lines of code in your production&#xD;
        program will be covered by unit tests. This does not cover 100% of the paths through the code, but it does make&#xD;
        sure that virtually every line is executed and tested.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;b>Test Repeatability&lt;/b>. The tests can be run any time you like. This is especially useful after you've made a&#xD;
        change to the production code. You can run the tests to make sure you haven't broken anything. Having the tests to&#xD;
        back you up can give you the courage to make changes that would otherwise be too risky to make.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;b>Documentation&lt;/b>. The tests describe your understanding of how the code should behave. They also describe the&#xD;
        API. Therefore, the tests are a form of documentation. Unit tests are typically pretty simple, so they are easy to&#xD;
        read. Moreover, they are unambiguous and executable. Finally, if the tests are run every time any change is made to&#xD;
        the code, they will never get out of date.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;b>API Design&lt;/b>. When you write tests first, you put yourself in the position of a user of your program's API.&#xD;
        This can only help you design that API better. Your first concern, as you write the tests, is to make it easy and&#xD;
        convenient to use that API.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;b>System Design&lt;/b>. A module that is independently testable is a module that is decoupled from the rest of the&#xD;
        system. When you write tests first, you automatically decouple the modules you are testing. This has a profoundly&#xD;
        positive effect on the overall design quality of the system.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;b>Reduced Debugging&lt;/b>. When you move in the tiny little steps recommended by TDD, it is hardly ever necessary to&#xD;
        use the debugger. Debugging time is reduced enormously.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;b>Your code worked a minute ago!&lt;/b> If you observe a team of developers who are practicing TDD, you will notice&#xD;
        that every pair of developer had their code working a minute ago. It doesn't matter when you make the observation!&#xD;
        A minute or so ago, each pair ran their code, and it passed all its tests. Thus, you are never very far away from&#xD;
        making the system work.&lt;br />&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;Costs&quot; name=&quot;Costs&quot;>What are the costs of TDD?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        Programming in tiny cycles can seem inefficient. Programmers often find it frustrating to work in increments that&#xD;
        are so small that they know the outcome of the test. It sometimes seems that such a tiny step is not worth&#xD;
        taking.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        A lot of test code is produced. It is not uncommon for the bulk of test code to exceed the bulk of production code&#xD;
        by a large amount. This code has to be maintained at a significant cost.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        A lot of time is spent keeping the tests in sync with the production code. Programmers sometimes feel that time&#xD;
        spent on keeping the tests working and well structured is time that is not being spent on the customer's&#xD;
        needs.&lt;br />&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;Principles&quot; name=&quot;Principles&quot;>What testing principles should I employ?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        &lt;b>Isolation&lt;/b>. When writing a unit test for a module, consider whether you want that module to invoke other&#xD;
        modules. If not, then isolate the module with interfaces. For example, suppose you are testing a module that&#xD;
        interacts with the database. The test has nothing to do with the database; it simply tests the way that the module&#xD;
        manipulates the database. So you isolate the module from the database by creating an interface that represents the&#xD;
        database and that the module uses. Then, for the purposes of the test, you implement that interface with a test&#xD;
        stub. This kind of isolation greatly decreases the amount of coupling in the overall system.&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;p>&#xD;
    &lt;img height=&quot;166&quot; alt=&quot;&quot; src=&quot;resources/xp_tdd_guid_database.jpg&quot; width=&quot;403&quot; />&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        &lt;b>Simplicity&lt;/b>. Keep your edit/compile/test cycles extremely short: less than five minutes on average. Write&#xD;
        only enough production code to make the current tests pass. Try not to write code that will make future tests pass.&#xD;
        At every edit/compile/test cycle, keep the code as simple as it can be.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;b>Increase Generality&lt;/b>. As you add test cases, the production code should become more and more general. Always&#xD;
        try to increase generality. For example, consider the following test case:&lt;br />&#xD;
         &#xD;
        &lt;blockquote>&#xD;
            &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public testThreeSquared() {     assertEquals(9, MyClass.square(3)); }&#xD;
&lt;/pre>&#xD;
            &lt;/blockquote>&#xD;
        &lt;/blockquote>&#xD;
        &lt;p>&#xD;
            We might make this test pass by writing:&#xD;
        &lt;/p>&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;blockquote>&#xD;
    &lt;blockquote>&#xD;
&lt;pre>&#xD;
     public class MyClass {  public static int square(int n) {      return 9;  }               }&#xD;
&lt;/pre>&#xD;
    &lt;/blockquote>&#xD;
    &lt;p>&#xD;
        This conforms to the simplicity principle. If &lt;font size=&quot;3&quot;>&lt;tt>testThreeSquared&lt;/tt>&lt;/font> were the only test&#xD;
        case that mattered, then this implementation would be correct. Of course, we know that it is incorrect, but in its&#xD;
        current form it verifies that the test case actually passes when it is supposed to. Now suppose that we add a new&#xD;
        test case:&#xD;
    &lt;/p>&#xD;
    &lt;blockquote>&#xD;
        &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public testFourSquared() {      assertEquals(16, MyClass.square(4));  }         &#xD;
&lt;/pre>&#xD;
        &lt;/blockquote>&#xD;
    &lt;/blockquote>&#xD;
    &lt;p>&#xD;
        We could make this pass by changing the square function as follows:&#xD;
    &lt;/p>&#xD;
    &lt;blockquote>&#xD;
        &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public static int square(int n) {      if (n == 3)  return 9;      else  return 16;  }&#xD;
&lt;/pre>&#xD;
        &lt;/blockquote>&#xD;
    &lt;/blockquote>&#xD;
    &lt;p>&#xD;
        While this would pass the test, it violates the rule to make the code more general. To make the code more general,&#xD;
        we have to return the square of the argument.&#xD;
    &lt;/p>&#xD;
    &lt;blockquote>&#xD;
        &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public static int square(int n) {       return n*n;  }&#xD;
&lt;/pre>&#xD;
        &lt;/blockquote>&#xD;
    &lt;/blockquote>&#xD;
    &lt;p>&#xD;
        This solution passes all the tests, is simple, and increases the generality of the solution.&#xD;
    &lt;/p>&#xD;
&lt;/blockquote>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        &lt;b>Corner Cases and Boundary Conditions&lt;/b>. Corner cases and boundary conditions are implemented in the production&#xD;
        code with if statements or other similar decision structures. Don't write these statements unless you have a unit&#xD;
        test that is failing because they don't exist. For example, let's say you are calculating weekly pay for an hourly&#xD;
        employee. &#xD;
        &lt;blockquote>&#xD;
            &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public void testHourlyPay() {      double hourlyRate = 10.00;      double hoursWorked = 8;      Employee e = new Employee(hourlyRate);      assertEquals(80.00, e.calculatePay(hoursWorked));           }&#xD;
&lt;/pre>&#xD;
            &lt;/blockquote>&#xD;
        &lt;/blockquote>&#xD;
        &lt;p>&#xD;
            The code that makes this pass looks like this:&#xD;
        &lt;/p>&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;blockquote>&#xD;
    &lt;blockquote>&#xD;
        &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public class Employee {      private double hourlyRate;        public Employee(double hourlyRate) {  this.hourlyRate = hourlyRate;      }        public double calculatePay(double hoursWorked) {  return hourlyRate * hoursWorked;      }  }&#xD;
&lt;/pre>&#xD;
        &lt;/blockquote>&#xD;
    &lt;/blockquote>&#xD;
    &lt;p>&#xD;
        Now let's say we want to calculate overtime pay. Any hours over eight are charged at time-and-a-half. The first&#xD;
        thing we do is add the new failing test case:&#xD;
    &lt;/p>&#xD;
    &lt;blockquote>&#xD;
        &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public void testOvertime() {      double hourlyRate = 10.00;      double hoursWorked = 10;      Employee e = new Employee(hourlyRate);      assertEquals(110.00, e.calculatePay(hoursWorked); }&#xD;
&lt;/pre>&#xD;
        &lt;/blockquote>&#xD;
    &lt;/blockquote>&#xD;
    &lt;p>&#xD;
        &lt;i>Then&lt;/i> we make the test case pass by changing the production code.&#xD;
    &lt;/p>&#xD;
    &lt;blockquote>&#xD;
        &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public double calculatePay(double hoursWorked) {      double overtimeRate = hourlyRate * 1.5;      double normalHours = Math.min(hoursWorked, 8.0);                   double overtimeHours = hoursWorked ̵; normalHours;      return (normalHours * hourlyRate) + (overtimeHours * overtimeRate);  }&#xD;
&lt;/pre>&#xD;
        &lt;/blockquote>&#xD;
    &lt;/blockquote>&#xD;
    &lt;p>&#xD;
        Avoid adding any &lt;font size=&quot;3&quot;>&lt;tt>if, while, for, do,&lt;/tt>&lt;/font> or any other type of conditional without a&#xD;
        failing test case. Remember to add test cases for each such boundary condition.&#xD;
    &lt;/p>&#xD;
&lt;/blockquote>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        &lt;b>Test Anything That Could Possibly Break&lt;/b>. By the same token, don't bother to test things that cannot possibly&#xD;
        break. For example, it is usually fruitless to test simple accessors and mutators. &#xD;
        &lt;blockquote>&#xD;
            &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public void testAccessorAndMutator() {      X x = new X();      x.setField(3);               assertEquals(3, x.getField());  }&#xD;
&lt;/pre>&#xD;
            &lt;/blockquote>&#xD;
        &lt;/blockquote>&#xD;
        &lt;p>&#xD;
            Accessors and mutators cannot reasonably break. So there's no point in testing them. Judgment clearly has to be&#xD;
            applied to use this rule. You will be tempted to avoid a necessary unit test by claiming that the code cannot&#xD;
            possibly break. You'll know you've fallen into this habit when you start finding bugs in methods you thought&#xD;
            couldn't break.&#xD;
        &lt;/p>&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        &lt;b>Keep Test Data in the Code&lt;/b>. It is sometimes tempting to put test data into a file, especially when the input&#xD;
        to a module is a file. However, the best place for test data is in the unit test code itself. For example, assume&#xD;
        we have a function that counts the number of characters in a file. The signature for this function is: &#xD;
        &lt;blockquote>&#xD;
            &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public int count(String fileName).&#xD;
&lt;/pre>&#xD;
            &lt;/blockquote>&#xD;
        &lt;/blockquote>&#xD;
        &lt;p>&#xD;
            In order to keep the test data in the unit test code, the test should be written this way:&#xD;
        &lt;/p>&#xD;
    &lt;/li>&#xD;
    &lt;li style=&quot;LIST-STYLE-TYPE: none&quot;>&#xD;
        &lt;blockquote>&#xD;
            &lt;blockquote>&#xD;
&lt;pre>&#xD;
 public testCount() {      File testFile = new File(&quot;testFile&quot;);               FileOutputStream fos = new FileOutputStream(testFile);      PrintStream ps = new PrintStream(fos);      ps.print(&quot;Oh, you Idiots!&quot;);      ps.close();               assertEquals(15, FileUtil.count(&quot;testFile&quot;));      testFile.delete();           }&#xD;
&lt;/pre>&#xD;
            &lt;/blockquote>&#xD;
        &lt;/blockquote>&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;blockquote>&#xD;
    &lt;p>&#xD;
        This keeps all the data relevant to the test in one place.&#xD;
    &lt;/p>&#xD;
&lt;/blockquote>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        &lt;b>Test Pruning&lt;/b>. Sometimes you'll write tests that are useful for a time but become redundant as other tests&#xD;
        take over their role. Don't be afraid to remove old redundant tests. Keep the test suite as small as possible&#xD;
        without compromising coverage.&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        &lt;b>Keep Test Time Short&lt;/b>. The effectiveness of the tests depends upon convenience. The more convenient it is to&#xD;
        run the tests, the more often they will be run. Thus, it is very important to keep the test run time very short. In&#xD;
        a large system, this means partitioning the tests.&lt;br />&#xD;
        &lt;br />&#xD;
         When working on a particular module, you'll want to choose the tests that are relevant to that module and the&#xD;
        surrounding modules. Keep the test time well under a minute. Ten seconds is often too long.&lt;br />&#xD;
        &lt;br />&#xD;
         When checking in a module, run a test suite that tests the whole system but takes no more than 10 minutes to run.&#xD;
        This may mean you'll have to pull out some of the longer running tests.&lt;br />&#xD;
        &lt;br />&#xD;
         Every night, run all the tests in the system. Keep the running time small enough so that they can be run more than&#xD;
        once before morning just in case there is a problem that forces a rerun.&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;GUIS&quot; name=&quot;GUIS&quot;>How do I test GUIs?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
    The trick to writing unit tests for GUIs is separation and decoupling. Separate the GUI code into three layers,&#xD;
    typically called &lt;b>Model&lt;/b>, &lt;b>View&lt;/b>, and &lt;b>Presenter&lt;/b>:&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
    &lt;li>&#xD;
        The &lt;b>Model&lt;/b> understands the business rules of the items that are to be displayed on the screen. All relevant,&#xD;
        business-related policies are implemented in this module. Therefore, this module is easy to test based solely on&#xD;
        its inputs and outputs.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        The &lt;b>Presenter&lt;/b> understands how the data is to be presented and how the user will interact with that data. It&#xD;
        knows that there are buttons, check boxes, text fields, etc. It knows that sometimes the buttons need to be&#xD;
        disabled (grayed), and it knows sometimes text fields are not editable. It knows, at a mechanical level, how the&#xD;
        data are displayed and how the interactions take place. However, it does not know anything about the actual GUI&#xD;
        API. For example, if you are writing a Java Swing GUI, the Presenter does not use any of the swing classes. Rather,&#xD;
        it sends messages to the View to take care of the actual display and interaction. Thus, the Presenter can be&#xD;
        tested, again, based solely on its inputs from the Model and its outputs to the View.&lt;br />&#xD;
    &lt;/li>&#xD;
    &lt;li>&#xD;
        The &lt;b>View&lt;/b> understands the GUI API. It makes no policy, selection, or validation decisions. It has virtually&#xD;
        zero intelligence. It is simply a shim that ties the interface used by the Presenter to the GUI API. It can be&#xD;
        tested by writing tests that check the wiring. The tests walk through the GUI data structures, making sure that the&#xD;
        appropriate button, text fields, and check boxes have been created. The tests send events to the GUI widgets and&#xD;
        make sure the appropriate callbacks are invoked.&#xD;
    &lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;Embedded&quot; name=&quot;Embedded&quot;>How do I test embedded systems?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
    Some software is written to control hardware. You can test this software by writing a hardware simulator. The tests set&#xD;
    the hardware simulator up into various states and then drive the system to manipulate that hardware. Finally, the tests&#xD;
    query the simulation to ensure that the hardware was driven to the correct final state.&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;Concurrency&quot; name=&quot;Concurrency&quot;>How do I test concurrency?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
    Some software is reentrant or concurrent. Race conditions can make the software behavior non-deterministic. There are&#xD;
    failure modes that can be both severe and strongly dependent upon timing and order of events. Software that works&#xD;
    99.999% of the time can fail that last .001% of the time due to concurrency problems. Finding these problems is a&#xD;
    challenge.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Usually exhaustive Monte Carlo testing is used to attempt to drive the system through as many states as possible.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Once concurrency problems are discovered, tests can be written that drive the system to the failure state and then&#xD;
    prove the failure. Thereafter, the problem can be repaired, and the test remains in the test suite as a regression&#xD;
    test.&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;Database&quot; name=&quot;Database&quot;>How do I test database transactions?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
    Almost always the best way to do this is to create an interface that represents the database. Each test case can&#xD;
    implement that interface and pretend to be the database, supplying its own data and interpreting the calls made by the&#xD;
    module under test. This prevents test data from actually being written and read from the database. It also allows the&#xD;
    test code to force failure conditions that are otherwise hard to simulate.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    See: &lt;a href=&quot;http://c2.com/cgi/wiki?MockObject &quot; target=&quot;_blank&quot;>http://c2.com/cgi/wiki?MockObject&lt;/a>&#xD;
&lt;/p>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;Servlets&quot; name=&quot;Servlets&quot;>How do I test Servlets?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
    Servlets are simply pipes through which form data passes into a program and HTML passes out. The trick to testing a&#xD;
    servlet is to separate the program from the pipe. Keep the servlet code as thin as possible. Put your program in plain&#xD;
    old classes that don't derive from Servlet. Then you can test those plain old classes as usual. If the servlet itself&#xD;
    is thin enough, it may be too simple to bother testing.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    Of course, you can also set up your own little servlet invoker or use one of the open source versions. These programs&#xD;
    act like a web server and fire servlets for you. You pass the form data to them, and they pass the HTML back to you.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    See:&#xD;
&lt;/p>&#xD;
&lt;blockquote>&#xD;
    &lt;a href=&quot;http://c2.com/cgi/wiki?JunitServlet&quot; target=&quot;_blank&quot;>http://c2.com/cgi/wiki?JunitServlet&lt;/a>&lt;br />&#xD;
     &lt;a href=&quot;http://c2.com/cgi/wiki?ServletTesting&quot; target=&quot;_blank&quot;>http://c2.com/cgi/wiki?ServletTesting&lt;/a>&lt;br />&#xD;
     &lt;a href=&quot;http://strutstestcase.sourceforge.net/&quot; target=&quot;_blank&quot;>http://strutstestcase.sourceforge.net/&lt;/a>&#xD;
&lt;/blockquote>&#xD;
&lt;h3>&#xD;
    &lt;a id=&quot;WebPages&quot; name=&quot;WebPages&quot;>How do I test web pages?&lt;/a>&#xD;
&lt;/h3>&#xD;
&lt;p>&#xD;
    An HTML document is almost an XML document. There is a tool that allows you to query an HTML document as though it were&#xD;
    an XML document. That tool is called HTTPUnit. Using this tool, you can write tests that inspect the innards of an HTML&#xD;
    document without worrying about white space or formatting issues. Another tool called HTMLUnit also does something&#xD;
    similar. HTMLUnit includes support for testing HTML pages with embedded JavaScript.&#xD;
&lt;/p>&#xD;
&lt;p>&#xD;
    See:&#xD;
&lt;/p>&#xD;
&lt;blockquote>&#xD;
    &lt;a href=&quot;http://httpunit.sourceforge.net/&quot; target=&quot;_blank&quot;>http://httpunit.sourceforge.net/&lt;/a>&lt;br />&#xD;
     &lt;a href=&quot;http://htmlunit.sourceforge.net/&quot; target=&quot;_blank&quot;>http://htmlunit.sourceforge.net/&lt;/a>&lt;br />&#xD;
&lt;/blockquote>&#xD;
&lt;p>&#xD;
    &lt;br />&#xD;
     &amp;nbsp;&#xD;
&lt;/p></mainDescription>
</org.eclipse.epf.uma:ContentDescription>
