<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" 
      xmlns:thr="http://purl.org/syndication/thread/1.0">
  <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/03/anatomy-of-an-enterprise-flex-5.html" />
  <link rel="self" type="application/atom+xml" href="http://www.insideria.com/atom.xml" />
  <id>tag:www.insideria.com,2009://34/tag:www.insideria.com,2008://34.23252-</id>
  <updated>2009-11-16T15:48:45Z</updated>
  <title>Comments for Anatomy of an Enterprise Flex RIA Part 11: Testing What We Have (http://www.insideria.com/2008/03/anatomy-of-an-enterprise-flex-5.html)</title>
  <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.21-en</generator>
  <entry>
    <id>tag:www.insideria.com,2008://34.23252</id>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/03/anatomy-of-an-enterprise-flex-5.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blogs.oreilly.com/cgi-bin/mt/mt-atom.cgi/weblog/blog_id=34/entry_id=23252" title="Anatomy of an Enterprise Flex RIA Part 11: Testing What We Have" />
    <published>2008-03-31T23:53:39Z</published>
    <updated>2008-10-01T01:23:17Z</updated>
    <title>Anatomy of an Enterprise Flex RIA Part 11: Testing What We Have</title>
    <summary>Last installment we looked at the interfaces for the service layer of our application. In Part 11 of Anatomy of an Enterprise Flex RIA, we&apos;ll look at using TestNG, a Java test framework, to test our application so far.  This feature is packed with code samples!  Every Monday we bring you another installment in the series. </summary>
    <author>
      <name>Tony Hillerson</name>
      
    </author>
    
    <category term="Features" />
    
    <content type="html" xml:lang="en" xml:base="http://www.insideria.com/">
      <![CDATA[<div class="ap_r" style="margin: 16px;"><a href="http://www.insideria.com/upload/2008/03/anatomy_of_an_enterprise_flex/riaseries_part11.jpg" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/03/anatomy_of_an_enterprise_flex/riaseries_part11.jpg" alt="riaseries_part11.jpg" title="Click to enlarge" width="148"/></a></div>


<p>I&#8217;ve already introduced you to the concept of testing frameworks. Let&#8217;s create a few unit tests to see that the entities we&#8217;ve created get into and out of the database in the way we want them to.</p>

<p><strong>TestNG</strong></p>

<p>Maven works well out of the box with two Java testing frameworks: JUnit and TestNG. TestNG is not as well known as JUnit, but it&#8217;s a nice framework with a few interesting features. One of these is the ability to group tests. Maven works with TestNG by telling the POM where to find a TestNG configuration file.</p>

<p>This ability to group tests together allows us to run certain tests at certain times, or exclude certain groups if we want.</p> 

<p>Here&#8217;s the configuration file for TestNG:</p>

<div class="acode" style="overflow: auto; padding: 10px; height: 120px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
&lt;suite <span class="category2">name</span>="<span class="quote">Bookie All Tests</span>" verbose="<span class="quote">5</span>"&gt;
    &lt;test <span class="category2">name</span>="<span class="quote">Unit Tests</span>"&gt;
         &lt;groups&gt;
              &lt;run&gt;
                   &lt;include <span class="category2">name</span>="<span class="quote">unit.*</span>" /&gt;
                   &lt;exclude <span class="category2">name</span>="<span class="quote">integration.*</span>" /&gt;
              &lt;/run&gt;
         &lt;/groups&gt;
         &lt;packages&gt;
              &lt;package <span class="category2">name</span>="<span class="quote">lcds.examples.bookie.*</span>" /&gt;
         &lt;/packages&gt;
    &lt;/test&gt;

    &lt;test <span class="category2">name</span>="<span class="quote">Integration Tests</span>"&gt;
         &lt;groups&gt;
              &lt;run&gt;
                   &lt;include <span class="category2">name</span>="<span class="quote">integration.*</span>" /&gt;
              &lt;/run&gt;
         &lt;/groups&gt;
         &lt;packages&gt;
              &lt;package <span class="category2">name</span>="<span class="quote">lcds.examples.bookie.*</span>" /&gt;
         &lt;/packages&gt;
    &lt;/test&gt;
&lt;/suite&gt;</pre>
</code>
 
</div></div>

<p>We can include tests in a group by package and by name. Names are given in the actual classes, and we&#8217;ll see them in a bit. Here are the relevant parts of the POM for the data project that tells Maven where to find the classes to test:</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 120px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
...
&lt;plugins&gt;
    &lt;plugin&gt;
         &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
         &lt;configuration&gt;
              &lt;suiteXmlFiles&gt;
                   &lt;suiteXmlFile&gt;
                        ${basedir}/src/test/resources/testng.xml
                   &lt;/suiteXmlFile&gt;
              &lt;/suiteXmlFiles&gt;
              &lt;parallel&gt;<span class="category1">true</span>&lt;/parallel&gt;
              &lt;trimStackTrace&gt;<span class="category1">false</span>&lt;/trimStackTrace&gt;
              &lt;systemProperties&gt;
                   &lt;property&gt;
                        &lt;<span class="category2">name</span>&gt;java.<span class="category1">class</span>.path&lt;/<span class="category2">name</span>&gt;
                        &lt;value&gt;<span class="category2">target</span>/classes&lt;/value&gt;
                   &lt;/property&gt;
              &lt;/systemProperties&gt;
        &lt;/configuration&gt;
    &lt;/plugin&gt;
...</pre>
</code>
 
</div></div>

<p>The Maven surefire plug-in manages testing. We tell it where to find the TestNG configuration file, to run the tests in parallel (which is faster), to cut out unimportant parts of the stack trace if there&#8217;s an error, and that we want all the classes in target/classes added to the classpath.</p>

<p><strong>DBUnit</strong></p>
<p>DBUnit is a framework that allows us to &#8220;seed&#8221; the database with a set of data before each test. Here&#8217;s an example from bookie-data/src/test/resources/fds/examples/<br />bookie/datasets/searchable_books_dataset.xml:</p>



<div class="acode" style="overflow: auto; padding: 10px; height: 200px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
&lt;?xml <span class="category2">version</span>='<span class="quote">1.0</span>' encoding='<span class="quote">UTF-8</span>'?&gt;
&lt;dataset&gt;
    &lt;subjects id="<span class="quote">1</span>" <span class="category2">name</span>="<span class="quote">Astrophysics</span>" /&gt;
    &lt;subjects id="<span class="quote">2</span>" <span class="category2">name</span>="<span class="quote">Roman Literature</span>" /&gt;
    &lt;subjects id="<span class="quote">3</span>" <span class="category2">name</span>="<span class="quote">Psychoacoustics</span>" /&gt;
    &lt;subjects id="<span class="quote">4</span>" <span class="category2">name</span>="<span class="quote">Zymurgy</span>" /&gt;

    &lt;people id="<span class="quote">1</span>" first_name="<span class="quote">User</span>"
         last_name="<span class="quote">Man</span>" author="<span class="quote">false</span>" card_number="<span class="quote">123456</span>" /&gt;
    &lt;people id="<span class="quote">2</span>" first_name="<span class="quote">Author</span>"
         last_name="<span class="quote">Conan-Doyle</span>" author="<span class="quote">true</span>" /&gt;
    &lt;people id="<span class="quote">3</span>" first_name="<span class="quote">Charlie</span>"
         last_name="<span class="quote">Papazian</span>" author="<span class="quote">true</span>" /&gt;
    &lt;people id="<span class="quote">4</span>" first_name="<span class="quote">Marcus</span>"
         last_name="<span class="quote">Cicero</span>" author="<span class="quote">true</span>" /&gt;
    &lt;people id="<span class="quote">5</span>" first_name="<span class="quote">Fred</span>"
         last_name="<span class="quote">Author</span>" author="<span class="quote">true</span>" /&gt;

    &lt;books id="<span class="quote">1</span>" author_id="<span class="quote">2</span>"
         title="<span class="quote">Space</span>" subject_id="<span class="quote">1</span>" /&gt;
    &lt;books id="<span class="quote">2</span>" author_id="<span class="quote">2</span>"
         title="<span class="quote">More on Space</span>" subject_id="<span class="quote">3</span>" /&gt;
    &lt;books id="<span class="quote">3</span>" author_id="<span class="quote">4</span>"
         title="<span class="quote">De Oratore</span>" subject_id="<span class="quote">2</span>" /&gt;
    &lt;books id="<span class="quote">4</span>" author_id="<span class="quote">4</span>"
         title="<span class="quote">De Legibus</span>" subject_id="<span class="quote">2</span>" /&gt;
    &lt;books id="<span class="quote">5</span>" author_id="<span class="quote">5</span>"
         title="<span class="quote">Now You Hear It, Now You Don't</span>" subject_id="<span class="quote">3</span>" /&gt;
    &lt;books id="<span class="quote">6</span>" author_id="<span class="quote">3</span>"
         title="<span class="quote">The Complete Joy of Homebrewing</span>" subject_id="<span class="quote">4</span>" /&gt;
    &lt;books id="<span class="quote">7</span>" author_id="<span class="quote">3</span>"
         title="<span class="quote">The Homebrewer's Companion</span>" subject_id="<span class="quote">4</span>" /&gt;
&lt;/dataset&gt;</pre>
</code>
 
</div></div>

<p>Inside the dataset root tag, each tag corresponds to a row in the table named by the tag&#8217;s name. You can see that we&#8217;re creating four subjects, five people, and seven books, and there are some relationships set up from books to subjects and authors. One of the people is a user, with a card_number. This is a nice little set of data to test a few important things: searching for a book by subject or author, searching for authors or subjects, or logging in as a user. We&#8217;ll see how we get this data into the database next.</p>

<p><strong>The Tests</strong></p>

<p>Let&#8217;s separate the tests into two types: testing simple Create, Update, and Delete (abbreviated CRUD), and then tests that exercise the parts of the persistence layer that support the user stories.</p>
<p>First, though, our tests will extend a base test, BaseTest:</p>

<div class="acode" style="overflow: auto; padding: 10px; height: 30px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
package lcds.examples.bookie;
...
@Test(groups="<span class="quote">unit</span>")
<span class="category1">public</span> <span class="category1">class</span> BaseTest <span class="category1">extends</span> AssertJUnit {
 
}</pre>
</code>
 
</div></div>

This is a simple class that groups all tests we extend into &#8220;unit&#8221; tests by default (we could override this in other tests), and extends the AssertJUnit class, which lets us use JUnit-style assertion methods, because by default, TestNG uses regular Java 1.4 assertions. 
Next, we have BaseEJBTest, which does a few things:
<div class="acode" style="overflow: auto; padding: 10px; height: 220px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
package lcds.examples.bookie;
...
@Test(groups="<span class="quote">functional</span>")
<span class="category1">public</span> abstract <span class="category1">class</span> BaseEJBTest <span class="category1">extends</span> BaseTest {
 
     <span class="category1">private</span> <span class="category1">static</span> EJB3StandaloneDeployer deployer;
     <span class="category1">private</span> <span class="category1">static</span> ConnectionHelper connectionHelper;
     <span class="category1">private</span> <span class="category1">static</span> DatabaseConnection connection;
 
     @BeforeSuite
     <span class="category1">public</span> <span class="category1">static</span> <span class="category1">void</span> startEmbeddedJBoss() throws Exception {
           EJB3StandaloneBootstrap.ignoredJars.<span class="category1">add</span>("<span class="quote">rt.jar</span>");
           EJB3StandaloneBootstrap.boot(<span class="category1">null</span>);
  
           deployer = EJB3StandaloneBootstrap.createDeployer();
           deployer.getArchivesByResource().<span class="category1">add</span>("<span class="quote">META-INF/persistence.xml</span>");
           deployer.create();
           deployer.<span class="category2">start</span>();
  
           <span class="linecomment">// Configure the DAOLookupHelper</span>
           DAOLookupHelper.getInstance().setJNDIPrefix("<span class="quote"></span>");
      }
     
     @BeforeSuite
     <span class="category1">public</span> <span class="category1">static</span> <span class="category1">void</span> setUpConnection() throws Exception {
           connectionHelper = <span class="category1">new</span> ConnectionHelper();
      }</pre>
</code>
 
</div></div>

<p>First, we put the tests in the &#8220;functional&#8221; group. This overrides the &#8220;unit&#8221; group in the BaseTest class, so all EJB tests will be part of the &#8220;functional&#8221; group. We don&#8217;t really have any unit tests; I just put that there so that you can see how to group tests in a way that makes sense. Next, we use the @BeforeSuite annotation to tell TestNG to run startEmbeddedJBoss before any test in this test suite. Embedded JBoss is included with the project so that we don&#8217;t have to run tests inside the JBoss container to get access to the important services that JBoss provides. It&#8217;s a real timesaver. Basically, startEmbeddedJBoss does a few setup tasks, and then creates a deployer. The deployer will deploy our persistence unit by looking for any archives with a META-INF/persistence.xml in them. Then the deployer is started.</p>

<div class="ap_r" style="width:180px;"><a href="http://www.oreilly.com/catalog/9780596514402/?CMP=ILC-dm_nav_related-books" target="_blank"><img border="0" src="http://www.oreilly.com/catalog/covers/9780596514402_cat.gif" width="180" height="233" /></a>
<div class="apcaption"><a href="http://www.oreilly.com/catalog/9780596514402/?CMP=ILC-dm_nav_related-books" target="_blank">Get your copy of Tony Hillerson's Enterprise Application Development with Flex.</a></div></div><p>DAOLookupHelper is just a simple class I made to assist with a simple problem with JNDI in embedded JBoss and real JBoss. Embedded JBoss provides us with one JNDI context, which is where we need to look up session beans. In JBoss the server, however, the name of your EAR file is appended onto the front of the JNDI context. The lookup helper just keeps track of that (make sure you change it if you change the name of the EAR).</p>

<p>The next @BeforeSuite method, setUpConnection, uses a simple helper class to manage getting database connections for DBUnit in the tests. Constructing a connectionHelper uses a properties file in the test/resources directory under the package structure to store the database connection properties.</p>

<div class="acode" style="overflow: auto; padding: 10px; height: 120px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
    @AfterSuite
    <span class="category1">public</span> <span class="category1">static</span> <span class="category1">void</span> stopEmbeddedJBoss() {
          <span class="category1">try</span> {
                <span class="category1">if</span> (deployer != <span class="category1">null</span>) {
                      deployer.<span class="category2">stop</span>();
                      deployer.destroy();
                 }
                EJB3StandaloneBootstrap.shutdown();
           } <span class="category1">catch</span> (Exception e) {
                <span class="category2">System</span>.out.println("<span class="quote">Error shutting down embedded JBoss after tests: </span>" + e.<span class="category2">toString</span>());
           }
     }

    @AfterSuite
    protected <span class="category1">void</span> tearDownDatabase() throws Exception {
          <span class="category1">if</span> (connection != <span class="category1">null</span>) {
                connection.<span class="category2">close</span>();
           }
     }</pre>
</code>
 
</div></div>

<p>As you&#8217;d expect, the @AfterSuite annotated methods are run after the suite is over, so this is where we can do some cleanup after all the tests are done.</p>
<p>First, we&#8217;ll stop the embedded JBoss instance in stopEmbeddedJBoss, and we&#8217;ll close the database connection in tearDownDatabase:</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 120px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
    protected <span class="category1">static</span> DatabaseConnection getDatabaseConnection()
                                               throws Exception {
          <span class="category1">if</span> (connection == <span class="category1">null</span>) {
                connection = <span class="category1">new</span> DatabaseConnection(connectionHelper.getConnection());
           }
          <span class="category1">return</span> connection;
     }

    protected <span class="category2">Object</span> lookup(<span class="category2">String</span> <span class="category2">name</span>) throws Exception {
          Hashtable&lt;<span class="category2">String</span>, <span class="category2">String</span>&gt; props = 
               <span class="category1">new</span> Hashtable&lt;<span class="category2">String</span>, <span class="category2">String</span>&gt;();
          props.put(
               "<span class="quote">java.naming.factory.url.pkgs</span>",
               "<span class="quote">org.jboss.naming:org.jnp.interfaces</span>");
          props.put(
               "<span class="quote">java.naming.factory.initial</span>",
               "<span class="quote">org.jnp.interfaces.LocalOnlyContextFactory</span>");
          InitialContext ic = <span class="category1">new</span> InitialContext(props);
          <span class="category1">return</span> ic.lookup(<span class="category2">name</span>);
     }
    
}</pre>
</code>
 
</div></div>

<p>Then there are a few helper methods: getDatabaseConnection gets a connection from the connectionHelper, and lookup assists in looking up anything from JNDI using the right settings for embedded JBoss.
Here&#8217;s an example test that simply tests the processes of creating and updating:</p>
<div class="acode" style="overflow: auto; padding: 10px; height: 120px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
package lcds.examples.bookie.entity;
...
<span class="category1">public</span> <span class="category1">class</span> TestCrud <span class="category1">extends</span> BaseEJBTest {
 
     @Test
     <span class="category1">public</span> <span class="category1">void</span> testCRUDSubject() throws Exception {
           Subject s = <span class="category1">new</span> Subject();
           s.setName("<span class="quote">Zymurgy</span>");
  
           SubjectDAO dao = DAOLookupHelper.getInstance().getSubjectDAO();
           s = dao.merge(s);
           Integer id = s.getId();
           assertNotNull(dao.findById(id));
  
           s.setName("<span class="quote">Beer Making</span>");
           dao.merge(s);
           assertEquals("<span class="quote">Expected Zymurgy to be updated to Beer Making</span>", "<span class="quote">Beer Making</span>", dao.findById(id).getName());
  
           dao.remove(s);
           assertNull(dao.findById(id));
      }</pre>
</code>
 
</div></div>

<p>&#133; and a few more tests after that. This test is typical, though, and it shows how we can create, update, and delete an entity using a session bean. Look in the test for a few more examples.
Here&#8217;s an example test that uses the search-type features of the session beans: </p>
<div class="acode" style="overflow: auto; padding: 10px; height: 220px;" ><div style="overflow-x: visible;">
<code language="perl">
<pre>
package lcds.examples.bookie.entity;
...
<span class="category1">public</span> <span class="category1">class</span> TestBrowsing <span class="category1">extends</span> BaseEJBTest {
     ...
     @BeforeClass
     <span class="category1">public</span> <span class="category1">void</span> setup() throws Exception {
           connection = getDatabaseConnection();
           URL dsPath = 
      <span class="category1">this</span>.getClass().getResource(
      "<span class="quote">/fds/examples/bookie/datasets/searchable_books_dataset.xml</span>");
           searchableBooksDataset =
                <span class="category1">new</span> FlatXmlDataSet(
                     <span class="category1">new</span> FileInputStream(dsPath.getFile()));
  
           DatabaseOperation.CLEAN_INSERT.execute(
                connection, searchableBooksDataset);
      }
 
     @Test
     <span class="category1">public</span> <span class="category1">void</span> testSignIn() throws Exception {
           PersonDAO dao =
                DAOLookupHelper.getInstance().getPersonDAO();
           <span class="category1">int</span> user_id =
      Integer.<span class="category1">parseInt</span>(
           (<span class="category2">String</span>)searchableBooksDataset.getTable("<span class="quote">people</span>").
                <span class="category2">getValue</span>(0, "<span class="quote">id</span>"));
           Person user = dao.findById(user_id);
           <span class="category2">String</span> cardNumber = 
           (<span class="category2">String</span>)searchableBooksDataset.getTable("<span class="quote">people</span>").
                <span class="category2">getValue</span>(0, "<span class="quote">card_number</span>");
           assertEquals(user.getCardNumber(), cardNumber);
           Person cardHolder = dao.findByCardNumber(cardNumber);
           assertEquals(user, cardHolder);
      }
 ...</pre>
</code>
 
</div></div>

<p>A new annotation, @BeforeClass, tells TestNG to run the annotated method before every test in the class. The setup method gets a connection from the getDataBaseConnection base classes. Then it gets a reference to the data set we talked about a few pages back. It passes this URL into a FlatXmlDataSet constructor, which is part of DBUnit, and then uses that object to pass to a DatabaseOperation of type CLEAN_INSERT. A clean insert first truncates the tables referenced in the data set, and then inserts the data from the data set. Because the setup method is executed once per test, we can be sure that the database is in a certain state every test.</p>
<p>The testSignIn method is an example of a test that uses data from a data set. First it looks up the ID of the first row in the data set. Then it finds a person with that ID and gets that person&#8217;s card number from the data set. It ensures that the card number is the same as the card number of the person it looked up, and then it looks up a person by that card number and makes sure it found the person it found earlier.</p>
<p>Figure 14 shows where to find the classes and resources used in the tests we&#8217;ve gone over. There are a lot of files in src/test/resources that have to do with configuring embedded JBoss. Have a look if you like, but otherwise, just let them do what they do.</p>

<div class="ap_c" style="margin: 16px;"><a href="http://www.insideria.com/upload/2008/03/anatomy_of_an_enterprise_flex/anatomy11_fig14.jpg" class="highslide" onclick="return hs.expand(this)"><img src="http://www.insideria.com/upload/2008/03/anatomy_of_an_enterprise_flex/anatomy11_fig14.jpg" alt="anatomy11_fig14.jpg" title="Click to enlarge" width="400"/></a><div class="acaption">Figure 14. The classes and resources used in the tests thus far</div></div>




<p>These tests are fairly simple, but keep in mind that any untested code is a surprise waiting to happen. It&#8217;s like the high school student who worried and worried about an upcoming test and so studied every night. When the test came and he aced it, he said, &#8220;I wish I wouldn&#8217;t have wasted all that time studying; that test was easy!&#8221; Having a bunch of simple passing tests isn&#8217;t a waste of time writing tests; it&#8217;s coverage. Changes to the code can break things in simple places as well as complex ones.</p>

<p>Enough preaching! Let&#8217;s look at building out the service layer so that we can get another step closer to getting these entities from Java to Flex.</p>

<p>Next time we're going to look at the Maven build for our service layer and be introduced to the concept of Live Cycle Data Services' assemblers. You can always find the entire series <a href="http://www.insideria.com/series-anatomy-flex.html">here</a>.</p>
]]>
      
    </content>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23252-comment:2068517</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23252" type="text/html" href="http://www.insideria.com/2008/03/anatomy-of-an-enterprise-flex-5.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/03/anatomy-of-an-enterprise-flex-5.html#comment-2068517" />
    <title>Comment from Business management degree on 2009-07-17</title>
    <author>
        <name>Business management degree</name>
        <uri>http://www.mustuniversity.com/Schools-Majors/Business-and-Management.html</uri>
    </author>
    <content type="html" xml:lang="en" xml:base="http://www.mustuniversity.com/Schools-Majors/Business-and-Management.html">
        <![CDATA[<p>code is a surprise waiting to happen. It’s like the high school student who worried and worried about an upcoming test and so studied every night. When the test came and he aced it, he said, “I wish I wouldn’t have wasted all that time studying; that test was easy!” Having a bunch of simple passing tests isn’t a waste of time writing tests; it’s coverage. Changes to the code can break things in simple places as well as complex ones.</p>]]>
    </content>
    <published>2009-07-18T06:56:13Z</published>
  </entry>

  <entry>
    <id>tag:www.insideria.com,2008://34.23252-comment:2068521</id>
    <thr:in-reply-to ref="tag:www.insideria.com,2008://34.23252" type="text/html" href="http://www.insideria.com/2008/03/anatomy-of-an-enterprise-flex-5.html"/>
    <link rel="alternate" type="text/html" href="http://www.insideria.com/2008/03/anatomy-of-an-enterprise-flex-5.html#comment-2068521" />
    <title>Comment from shane on 2009-07-18</title>
    <author>
        <name>shane</name>
        <uri></uri>
    </author>
    <content type="html" xml:lang="en" xml:base="">
        <![CDATA[<p>When the test came and he aced it, he said, “I wish I wouldn’t have wasted all that time studying; that test was easy!” Having a bunch of simple passing tests isn’t a waste of time writing tests; it’s coverage. Changes to the code can break things in simple places as well as complex ones. <a href="http://www.onlineeducationfacts.com/online-education-facts/almeda.htm">Almeda University</a> break things in simple places as well as complex ones.</p>]]>
    </content>
    <published>2009-07-18T07:13:41Z</published>
  </entry>

</feed
