<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>alanwu</title>
    <description></description>
    <link>http://alanwu.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>The RUP for Practical Software and Systems Measure</title>
        <author>alanwu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alanwu.javaeye.com">alanwu</a>&nbsp;
                    链接：<a href="http://alanwu.javaeye.com/blog/182703" style="color:red;">http://alanwu.javaeye.com/blog/182703</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.ibm.com/developerworks/rational/downloads/07/rup_psm/index.html#download">http://www.ibm.com/developerworks/rational/downloads/07/rup_psm/index.html#download</a></p>
<p>&nbsp;</p>
<p>
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr valign="top">
<td width="100%">
<h1>The RUP for Practical Software and Systems Measurement (PSM) V3.0 and the PSM Standalone V3.0 Plug-ins</h1>
<img class="display-img" src="http://www.ibm.com/i/c.gif" height="6" alt="" width="1" /></td>
<td class="no-print" width="192"><a href="http://www.ibm.com/developerworks/"><img src="http://alanwu.javaeye.com/developerworks/i/dw.gif" border="0" height="18" alt="developerWorks" width="192" /></a></td>
</tr>
</tbody>
</table>
<!-- PAGE_HEAD_END --><!-- CONTENT_BEGIN -->
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr valign="top">
<!-- LEFT_GUTTER -->
<td width="10"><img src="http://www.ibm.com/i/c.gif" height="1" alt="" width="10" /></td>
<!-- CENTER_COLUMN_BEGIN -->
<td width="100%">
<p>13 Nov 2007</p>
<table cellspacing="0" border="0" cellpadding="0">
<tbody>
<tr valign="top">
<td colspan="2"><img src="http://www.ibm.com/i/c.gif" border="0" height="12" alt="" width="12" /></td>
</tr>
<tr>
<td><img src="http://www.ibm.com/i/v14/icons/d_bold.gif" height="16" alt="" width="16" /></td>
<td><a href="http://alanwu.javaeye.com/admin/blogs/#download" class="fbox"><strong><span style="font-size: x-small; color: #5c81a7;">Get the downloads</span></strong></a></td>
</tr>
<tr valign="top">
<td colspan="2"><span style="font-size: x-small; color: #5c81a7;"><img src="http://www.ibm.com/i/c.gif" border="0" height="12" alt="" width="12" /></span></td>
</tr>
</tbody>
</table>
<p>These two plug-ins are a major update to the RUP for Practical Software and Systems Measurement (PSM) V2.1.</p>
<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
<script type="text/javascript"></script>
<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">System requirements</span></strong></span></p>
<p>You must have IBM&reg; Rational&reg; Method Composer V7.2 installed to use this plug-in.</p>
<p>These two plug-ins are a major update to the RUP for Practical Software and Systems Measurement (PSM) V2.1, which has been available at the PSM website. The RUP for PSM Plug-in is dependent (extends) the RUP base plug-in as well as the RUP for Model-Driven Systems Development (MDSD) Plug-in.</p>
<p>The PSM Plug-in has no dependencies to any other plug-ins. It contains only PSM content and guidance.</p>
<p><a name="N10061"><span class="atitle">The RUP for Practical Software and Systems Measurement (PSM) V3.0 Plug-in</span></a></p>
<p><a name="N10067"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Purpose</span></strong></span></a></p>
<p>One of the most challenging tasks in developing and maintaining software and/or systems is to meet critical project cost, schedule, and technical objectives. With more complex capabilities in today's software applications, products, and systems, effective management of development and maintenance efforts is a key factor in project success. Practical Software and Systems Measurement (PSM) was developed to help managers meeting these challenges through measurement. It describes an information-driven measurement process that will address the unique technical and business goals of your organization. The guidance in PSM represents the best practices used by measurement professionals within the software and system acquisition and engineering communities.</p>
<p>The RUP for Practical Software and Systems Measurement (PSM) Plug-in integrates the measurement activities, artifacts, and concepts as described by PSM, replacing the measurement concepts provided by the RUP base framework. By deploying this plug-in, your organization and projects will have more extensive measurement guidance to help you track progress in project costs, schedules, and technical objectives.</p>
<p>For a more extensive description, please read the Rational Edge article: <em>Integrating systems measurement into your software and systems delivery process with the RUP for PSM Plug-in</em>, listed in the Resources section.</p>
<p>The RUP for PSM plug-in V3.0 is an update to the V2.1. The major addition to V3.0 is systems engineering measurement content, specifically, the PSM Systems Engineering Leading Indicators Guide content. Therefore, V3.0 also references the RUP for Model-Driven Systems Development (MDSD) Plug-in V4.0. To take full advantage of the systems engineering content, we recommend you also install the RUP for MDSD Plug-in. </p>
<p>Feedback or change requests should be forwarded to the email address in the publishing instructions below.</p>
<p><a name="N1007F"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">RUP base version and major dependencies</span></strong></span></a></p>
<ul>
<li>Rational Unified Process Base Version: 7.2 </li>
</ul>
<p><a name="N1008B"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Supported</span></strong></span></a></p>
<p>Yes, by IBM</p>
<p><a name="N10094"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Copyright and licensing info</span></strong></span></a></p>
<p>Copyright &copy; IBM Corporation, 1987, 2007 (RUP)</p>
<p>Copyright &copy; Practical Software and Systems Measurement (PSM), 2002, 2007 (PSM and Systems Engineering Leading Indicators Guide)</p>
<p>Copyright &copy; INCOSE (Systems Engineering Leading Indicators Guide)</p>
<p>Copyright &copy; Massachusetts Institute of Technology (Systems Engineering Leading Indicators Guide)</p>
<p>The IBM Rational Method Composer license applies to this plug-in.</p>
<p><a name="N100B1"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Last modified</span></strong></span></a></p>
<p>November 2007</p>
<p><a name="N100BA"><span class="atitle">The Practical Software and Systems Measurement (PSM) V3.0 Plug-in</span></a></p>
<p><a name="N100C0"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Purpose</span></strong></span></a></p>
<p>The PSM Plug-in (or PSM Standalone Plug-in) V3.0 provides the same PSM content and guidance that is contained within the RUP for PSM Plug-in, without the dependencies to RUP or any other Rational Method Composer plug-in. It currently stands on its own.</p>
<p>Feedback or change requests should be forwarded to the email address in the publishing instructions below.</p>
<p><a name="N100CC"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">RUP base version and major dependencies</span></strong></span></a></p>
<ul>
<li>None </li>
</ul>
<p><a name="N100D8"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Supported</span></strong></span></a></p>
<p>Yes, by IBM</p>
<p><a name="N100E1"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Copyright and licensing info</span></strong></span></a></p>
<p>Copyright &copy; IBM Corporation, 1987, 2007 (RUP)</p>
<p>Copyright &copy; Practical Software and Systems Measurement (PSM), 2002, 2007 (PSM and Systems Engineering Leading Indicators Guide)</p>
<p>Copyright &copy; INCOSE (Systems Engineering Leading Indicators Guide)</p>
<p>Copyright &copy; Massachusetts Institute of Technology (Systems Engineering Leading Indicators Guide)</p>
<p>The IBM Rational Method Composer license applies to this plug-in.</p>
<p><a name="N100FE"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Last modified</span></strong></span></a></p>
<p>November 2007</p>
<p><a name="N10107"><span class="atitle">Installation instructions</span></a></p>
<p>This section describes how to import the Rational Method Composer plug-in into a method library containing both the RUP and the RUP for MDSD Plug-ins.</p>
<ol>
<li>Download the file and extract the contents of the zip file to a convenient location. You will have two directories: 
<ul>
<li><code>extend.rup_psm_v3.0</code>: Contains the RUP for PSM Plug-in content. </li>
<li><code>enterprise.psm.v3.0</code>: Contains the PSM Standalone Plug-in content. </li>
</ul>
</li>
<li>Start Rational Method Composer and open a Library based on library.7.2 that was shipped with RMC 7.2. </li>
<li>Select <strong>File &gt; Import</strong> to launch the Import Wizard. </li>
<li>On the <strong>Select</strong> page in the Wizard, select <strong>Method Plug-ins</strong> and click <strong>Next</strong>. </li>
<li>Browse to the location where you extracted the plug-ins and select one of the directories, (<code>extend.rup_psm_v3.0</code> or <code>enterprise.psm.v3.0</code>) click <strong>OK</strong> and then <strong>Next</strong>. </li>
<li>Choose the Import option: <strong>Ignore and remove unresolved references</strong> and click <strong>Next</strong>. </li>
<li>Check the box next to the plug-in name and click <strong>Finish</strong>. </li>
<li>If you receive any warning messages about overwriting a current plug-in, accept the warning, click <strong>OK</strong>. </li>
<li>If you do not have a backup copy of your current library, it is advisable to make a backup copy before importing the plug-in. Click <strong>Yes</strong> when asked to make a backup copy of your library. </li>
<li>The plug-in will be imported into your library and you will see it in the <em>Library View.</em> </li>
</ol>
<p><strong>NOTE</strong> (Reminder):<br />The standalone enterprise.psm.v3.0 plug-in can be imported into either an empty method library or a method library that does not contain RUP. </p>
<p>The <code>extend.rup_psm_v3.0</code> plug-in must be imported into a Rational Method Composer V7.2 method library that contains <code>core.base_rup</code> (RUP Plug-in) and <code>systems.mdsd</code>. (RUP for MDSD V4.0 Plug-in).</p>
<p><a name="N10185"><span class="atitle">Publishing instructions for the PSM RUP Plug-in</span></a></p>
<ol>
<li>Select <strong>Configuration &gt; Publish</strong>. </li>
<li>Choose <code>HTML</code> format and click <strong>Next</strong>. </li>
<li>Choose the <strong>Systems Engineering (MDSD) with PSM</strong> configuration and click <strong>Next</strong>. </li>
<li>Choose <strong>Publish the entire configuration</strong> and click <strong>Next</strong>. </li>
<li>Enter <em>Systems Engineering (MDSD) with PSM</em> in the <strong>Title</strong> field. </li>
<li>Set the Feedback URL field to 'mailto:rupfeed@us.ibm.com?subject= RUP for PSM' or to your local contact point. </li>
<li>Locate the RUP Banner in your library here: <code>core.base_rup\guidances\supportingmaterials\resources\rup_banner.jpg</code> </li>
<li>Review and adjust as desired selections for the rest of the Publishing Options and click <strong>Next</strong>. Suggested items are as follows: 
<ul>
<li>Publish glossary and index </li>
<li>Publish activity detail diagrams that have not been manually created </li>
<li>Publish activity diagrams for unmodified activity extensions </li>
<li>Show task descriptors in navigation trees </li>
<li>Include method content in descriptor pages </li>
<li>Include links to related descriptors in role, task and work product pages </li>
<li>Default tab for the activity pages: Work Breakdown Structure </li>
</ul>
</li>
<li>Select a destination directory and website format and click <strong>Finish</strong>. </li>
</ol>
<p><a name="N101E7"><span class="atitle">Publishing instructions for the PSM Standalone Plug-in</span></a></p>
<ol>
<li>Select <strong>Configuration &gt; Publish</strong>. </li>
<li>Choose <code>HTML</code> format and click <strong>Next</strong>. </li>
<li>Choose the <strong>PSM Standalone</strong> configuration and click <strong>Next</strong>. </li>
<li>Choose <strong>Publish the entire configuration</strong> and click <strong>Next</strong>. </li>
<li>Enter <em>Practical Software and Systems Measurement (PSM)</em> in the <strong>Title</strong> field. </li>
<li>Set the Feedback URL field to 'mailto:rupfeed@us.ibm.com?subject= PSM Standalone' or to your local contact point. </li>
<li>Review and adjust as desired selections for the rest of the Publishing Options and click <strong>Next</strong>. Suggested items are as follows: 
<ul>
<li>Publish glossary and index </li>
<li>Publish activity detail diagrams that have not been manually created </li>
<li>Publish activity diagrams for unmodified activity extensions </li>
<li>Show task descriptors in navigation trees </li>
<li>Include method content in descriptor pages </li>
<li>Include links to related descriptors in role, task and work product pages </li>
<li>Default tab for the activity pages: Work Breakdown Structure </li>
</ul>
</li>
<li>Select a destination directory and website format and click <strong>Finish</strong>. </li>
</ol><br /><br />
<p><span class="smalltitle"><a name="download"><strong><span style="font-size: small; font-family: Arial;">Downloads</span></strong></a></span></p>
<table class="data-table-1" cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<th scope="col">Description</th><th scope="col">Name</th><th scope="col">Size</th><th scope="col">Download method</th>
</tr>
<tr>
<th scope="row" class="tb-row">RUP for PSM plug-in files</th>
<td>extend.rup_psm_v3.0.zip</td>
<td>4,704KB</td>
<td><a href="http://www.ibm.com/developerworks/views/download.jsp?contentid=267782&amp;filename=extend.rup_psm_v3.0.zip&amp;method=http&amp;locale=worldwide" class="fbox"><strong><span style="font-size: x-small; color: #5c81a7;">HTTP</span></strong></a></td>
</tr>
<tr>
<th scope="row" class="tb-row">PSM standalone plug-in files</th>
<td>enterprise.psm_v3.0.zip</td>
<td>4,258KB</td>
<td><a href="http://www.ibm.com/developerworks/views/download.jsp?contentid=267782&amp;filename=enterprise.psm_v3.0.zip&amp;method=http&amp;locale=worldwide" class="fbox"><strong><span style="font-size: x-small; color: #5c81a7;">HTTP</span></strong></a></td>
</tr>
</tbody>
</table>
<table cellspacing="0" border="0" cellpadding="0">
<tbody>
<tr valign="top">
<td colspan="5"><span style="font-size: x-small; color: #5c81a7;"><img src="http://www.ibm.com/i/c.gif" border="0" height="12" alt="" width="12" /></span></td>
</tr>
<tr>
<td><span style="font-size: x-small; color: #5c81a7;"><img src="http://www.ibm.com/i/v14/icons/fw.gif" height="16" alt="" width="16" /></span></td>
<td><a href="http://alanwu.javaeye.com/developerworks/library/whichmethod.html" class="fbox"><span style="font-size: x-small; color: #5c81a7;">Information about download methods</span></a></td>
<td><span style="font-size: x-small; color: #5c81a7;"><img src="http://www.ibm.com/i/c.gif" height="1" alt="" width="50" /></span></td>
</tr>
</tbody>
</table>
<br /><br />
<p><a name="resources"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">Resources</span></strong></span></a></p>
<strong>Learn</strong><br />
<ul>
<li>Read the related article: <a href="http://www.ibm.com/developerworks/rational/library/nov07/ishigaki/index.html"><span style="color: #5c81a7;">Integrating systems measurement into your software and systems delivery process with the RUP for PSM Plug-in</span></a> (The Rational Edge, Nov 2007).<br /><br /></li>
<li>Read the IBM Whitepaper: <a href="https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?lang=en_US&amp;source=swg-bpsdd"><span style="color: #5c81a7;">Best practices for software and systems development and delivery</span></a>.<br /><br /></li>
<li>To learn more, visit the <a href="http://www.ibm.com/developerworks/rational/products/rup"><span style="color: #5c81a7;">Rational Method Composer and RUP resource area</span></a> on developerWorks Rational. You'll find technical documentation, how-to articles, education, downloads, product information, and more.<br /><br /></li>
<li>For a complete list of available plug-ins for Rational Method Composer V7.2, visit the <a href="http://www.ibm.com/developerworks/rational/downloads/07/rmc_v7.2/"><span style="color: #5c81a7;">RMC 7.2 plug-ins page</span></a> on developerWorks Rational.<br /><br /></li>
<li>For more information about Practical Software and Systems Measurement (PSM), visit the <a href="http://www.psmsc.com/"><span style="color: #5c81a7;">PSM website</span></a>.<br /><br /></li>
<li>Browse the <a href="http://www.ibm.com/developerworks/apps/SendTo?bookstore=safari"><span style="color: #5c81a7;">technology bookstore</span></a> for books on these and other technical topics. <br /><br /></li>
</ul>
<br /><strong>Get products and technologies</strong><br />
<ul>
<li>Download <a href="http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX15&amp;S_CMP=ART"><span style="color: #5c81a7;">IBM product evaluation versions</span></a> and get your hands on application development tools and middleware products from DB2&reg;, Lotus&reg;, Rational&reg;, Tivoli&reg;, and WebSphere&reg;.</li>
</ul>
<br /><strong>Discuss</strong><br />
<ul>
<li>Participate in the <a href="http://www.ibm.com/developerworks/forums/dw_forum.jsp?forum=335&amp;amp;cat=24"><span style="color: #5c81a7;">Rational Method Composer and RUP discussion forum.</span></a> <br /><br /></li>
<li>Check out <a href="http://www.ibm.com/developerworks/blogs/"><span style="color: #5c81a7;">developerWorks blogs</span></a> and get involved in the <a href="http://www.ibm.com/developerworks/community"><span style="color: #5c81a7;">developerWorks community</span></a>. <br /></li>
</ul>
</td>
</tr>
</tbody>
</table>
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://alanwu.javaeye.com/blog/182703#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Apr 2008 20:52:25 +0800</pubDate>
        <link>http://alanwu.javaeye.com/blog/182703</link>
        <guid>http://alanwu.javaeye.com/blog/182703</guid>
      </item>
          <item>
        <title>Some of the principles behind the Agile Manifestoz</title>
        <author>alanwu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alanwu.javaeye.com">alanwu</a>&nbsp;
                    链接：<a href="http://alanwu.javaeye.com/blog/174150" style="color:red;">http://alanwu.javaeye.com/blog/174150</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul><li><span style="font-size: small">Customer satisfaction by rapid, continuous delivery of useful software</span></li><li><span style="font-size: small">Working software is delivered frequently (weeks rather than months)</span></li><li><span style="font-size: small">Working software is the principal measure of progress</span></li><li><span style="font-size: small">Even late changes in requirements are welcomed</span></li><li><span style="font-size: small">Close, daily cooperation between business people and developers</span></li><li><span style="font-size: small">Face-to-face conversation is the best form of communication (Co-location)</span></li><li><span style="font-size: small">Projects are built around motivated individuals, who should be trusted</span></li><li><span style="font-size: small">Continuous attention to technical excellence and good design</span></li><li><span style="font-size: small">Simplicity</span></li><li><span style="font-size: small">Self-organizing teams</span></li><li><span style="font-size: small">Regular adaptation to changing circumstances</span></li></ul>http://en.wikipedia.org/wiki/Agile_software_development
          <br/><br/>
          <span style="color:red;">
            <a href="http://alanwu.javaeye.com/blog/174150#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 15:52:03 +0800</pubDate>
        <link>http://alanwu.javaeye.com/blog/174150</link>
        <guid>http://alanwu.javaeye.com/blog/174150</guid>
      </item>
          <item>
        <title> Advanced Unit Test, Part V - Unit Test Patternszz</title>
        <author>alanwu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alanwu.javaeye.com">alanwu</a>&nbsp;
                    链接：<a href="http://alanwu.javaeye.com/blog/174110" style="color:red;">http://alanwu.javaeye.com/blog/174110</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.codeproject.com/KB/architecture/autp5.aspx" target="_blank">http://www.codeproject.com/KB/architecture/autp5.aspx</a></p><p>&nbsp;</p><p><span><div id="contentdiv"><p>Previous articles in the series:</p>
<ul><li><a href="http://www.codeproject.com/csharp/autp1.asp">Overview</a> 
</li><li><a href="http://www.codeproject.com/csharp/autp2.asp">Core Implementation</a> 
</li><li><a href="http://www.codeproject.com/csharp/autp3.asp">Testing Processes</a> 
</li><li><a href="http://www.codeproject.com/csharp/autp4.asp">Fixture Setup/Teardown, Test Repetition, And Performance Tests</a> </li></ul>
<h2>What's New?</h2>
<p>Added a section on <a href="http://www.codeproject.com/KB/architecture/autp5.aspx##mvc1">Presentation Layer Test Patterns.</a></p>
<h2>Join The Advanced Unit Testing Project!</h2>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/vts.jpg" border="0" height="366" alt="" width="600" /></p>
<p>We're looking for experienced C# developers that can dedicate
quality time to a large list of to-do features to help make Visual Test
Studio the leader in unit test open-source efforts.&nbsp; Are you interested
in working with cutting edge technology and being a leader in a rapidly
growing engineering practice?&nbsp; Would you like to become known in the
unit test field as helping to architect and develop Visual Test
Studio?&nbsp; Then sign up at <a href="http://aut.tigris.org/">http://aut.tigris.org/</a> and contact Marc for information on how you can contribute!</p>
<h2>Contents</h2>
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Introduction0">Introduction</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Patterns1">Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Pass/Fail%20Patterns2">Pass/Fail Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Simple-Test%20Pattern3">The Simple-Test Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Code-Path%20Pattern4">The Code-Path Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Parameter-Range%20Pattern5">The Parameter-Range Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Data%20Driven%20Test%20Patterns6">Data Driven Test Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Simple-Test-Data%20Pattern7">The Simple-Test-Data Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Data-Transformation-Test%20Pattern8">The Data-Transformation-Test Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Data%20Transaction%20Patterns9">Data Transaction Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Simple-Data-I/O%20Pattern10">The Simple-Data-I/O Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Constraint-Data%20Pattern11">The Constraint-Data Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Rollback%20Pattern12">The Rollback Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Collection%20Management%20Patterns13">Collection Management Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Collection-Order%20Pattern14">The Collection-Order Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Enumeration%20Pattern15">The Enumeration Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Collection-Constraint%20Pattern16">The Collection-Constraint Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Collection-Indexing%20Pattern17">The Collection-Indexing Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Performance%20Patterns18">Performance Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Performance-Test%20Pattern19">The Performance-Test Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Process%20Patterns20">Process Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Process-Sequence%20Pattern21">The Process-Sequence Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Process-State%20Pattern22">The Process-State Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Process-Rule%20Pattern23">The Process-Rule Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Simulation%20Patterns24">Simulation Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Mock-Object%20Pattern25">Mock-Object Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Service-Simulation%20Pattern26">The Service-Simulation Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Bit-Error-Simulation%20Pattern27">The Bit-Error-Simulation Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Component-Simulation%20Pattern28">The Component-Simulation Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Multithreading%20Patterns29">Multithreading Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Signalled%20Pattern30">The Signalled Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Deadlock-Resolution%20Pattern31">The Deadlock-Resolution Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Stress-Test%20Patterns32">Stress-Test Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Bulk-Data-Stress-Test%20Pattern33">The Bulk-Data-Stress-Test Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Resource-Stress-Test%20Pattern34">The Resource-Stress-Test Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#The%20Loading-Test%20Pattern35">The Loading-Test Pattern</a> </li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx##mvc1">Presentation Layer Patterns</a> 
<ul><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx##mvc2">The View-State Test Pattern</a> 
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx##mvc3">The Model-State Test Pattern</a> </li></ul></li></ul>
</li><li><a href="http://www.codeproject.com/KB/architecture/autp5.aspx#Conclusion36">Conclusion</a> </li></ul>
<h2><a name="Introduction0"></a>Introduction</h2>
<p>The idea of unit testing seems to always evoke a strong reaction in
people.&nbsp; For those that buy into the concept, they have unanimously
stated that good unit tests are difficult to write, and some question
whether the tests they have written were really worth it while others
rave about their effectiveness.&nbsp; On the other hand, there is also a
large community that guffaws at the idea of unit testing, especially
the concept that &quot;the code is good when it passes the unit tests&quot;.&nbsp;
When all the hoopla dies down, unit testing may one day be relegated to
the dusty shelf of &quot;yet another programmer tool&quot;.&nbsp; If this fate is to
be changed, unit testing has to be embraced by both the community and
the tool developers.&nbsp; The next version of Microsoft's Visual Studio
will include tools to automate refactoring.&nbsp; It seems obvious to me
that tools that automate unit test generation would not only address
some of the issues concerning maintenance and cost, but would also
introduce the concept to a much wider audience.</p>
<p>However, to achieve this acceptance, unit testing must be formalized
so that it becomes a real engineering discipline rather than an ad hoc
approach that relies on the dubious capabilities of the programmer.&nbsp;
After all, the unit test is supposed to test the code that the
programmer writes.&nbsp; If the programmer writes bad code to begin with,
how can you expect anything of better quality in the tests?&nbsp; Of even
more concern is the concept that the unit test should be written first,
before the code that is to be tested.&nbsp; To a certain extent, this
implies that not only does the programmer have to consider what the
code will <em>do</em>, he/she has to consider how the code is <em>designed</em>.&nbsp;
Both drive the interface.&nbsp; This is why many people balk at the idea of
writing the unit test first--it places them in the uncomfortable
position of having to do up front design work without consciously
recognizing that this what they are doing.</p>
<p>So, we are faced with a double edged sword.&nbsp; First, there is no
formal unit test engineering discipline established in the community
that provides a guide to the programmer and works to ensure some level
of unit test quality.&nbsp; Second, the prerequisite that the design has to
be somewhat formalized before any tests can be written causes
difficulty for many programmers because they either don't have formal
design experience or simply don't like up front design work.&nbsp;
Aggravating this situation is the idea that up front design work can be
replaced under the guise of &quot;refactoring&quot;.</p>
<p>In order to blunt this sword, two things are needed--a formalization
of unit testing by establishing unit test patterns, and the early
adoption of object oriented design patterns in the developing
application to specifically target the needs of unit testing.&nbsp; This
article will paint a picture of this two pronged solution with some
very large brush strokes.&nbsp; The intention is to whet your appetite and
hopefully begin a dialog amongst yourselves that will lead to a more
formal unit test engineering process, similar to object oriented
design, design patterns, and refactoring.</p>
<p>As you read this article, keep in mind that one of the goals is a
tool suite that can be used to automatically generate unit tests, both
as a reverse and forward engineering process.&nbsp; With the latter, it
should be possible to generate the method stubs for the code under
test.&nbsp; After all, one of the benefits of unit testing is that it
provides the implementer with some documentation as to the expected
structure and behavior of the code under test.&nbsp; Also, to keep this
article in the general reader category, there are no code examples.</p>
<h2><a name="Patterns1"></a>Patterns</h2>
<p>The patterns that I have identified so far can be loosely categorized as:</p>
<ul><li>pass/fail patterns 
</li><li>collection management patterns 
</li><li>data driven patterns 
</li><li>performance patterns 
</li><li>process patterns 
</li><li>simulation patterns 
</li><li>multithreading patterns 
</li><li>stress test patterns </li></ul>
<p>Again, let me emphasize that these are broad brush strokes.&nbsp; From my research, this appears to be quite new territory.</p>
<h3><a name="Pass/Fail Patterns2"></a>Pass/Fail Patterns</h3>
<p>These patterns are your first line of defense (or attack, depending
on your perspective) to guarantee good code.&nbsp; But be warned, they are
deceptive in what they tell you about the code.</p>
<h4><a name="The Simple-Test Pattern3"></a>The Simple-Test Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern1.jpg" border="0" height="85" alt="" width="313" /></p>
<p>Pass/fail unit tests are the simplest pattern and the pattern that
most concerns me regarding the effectiveness of a unit test.&nbsp; When a
unit test passes a simple test, all it does is tell me that the code
under test will work if I give it exactly the same input as the unit
test.&nbsp; A unit test that exercises an error trap is similar--it only
tells me that, given the same condition as the unit test, the code will
correctly trap the error.&nbsp; In both cases, I have no confidence that the
code will work correctly with any other set of conditions, nor that it
will correctly trap errors under any other error conditions.&nbsp; This
really just basic logic.&nbsp; However, on these grounds you can hear a lot
of people shouting &quot;it passed!&quot; as all the nodes on the unit test tree
turn green.</p>
<h4><a name="The Code-Path Pattern4"></a>The Code-Path Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern2.jpg" border="0" height="85" alt="" width="313" /></p>
<p>The Simple-Test pattern typifies what I call &quot;black box testing&quot;.&nbsp;
Without inspecting the code, that's about all you can do--write
educated guesses as to what the code under test might encounter, both
as success cases and failure cases, and test for those guesses.&nbsp; A
better test ensures that at least all the code paths are exercised.&nbsp;
This is part of &quot;white box testing&quot;--knowing the inside workings of the
code being tested.&nbsp; Here the priority is not to set up the conditions
to test for pass/fail, but rather to set up conditions that test the
code paths.&nbsp; The results are then compared to the expected output for
the given code path.&nbsp; But now we have a problem--how can you do white
box testing (testing the code paths) when the code hasn't been
written?&nbsp; Here we are immediately faced with the &quot;design before you
code&quot; edge of that sword.&nbsp; The discipline here, and the benefit of unit
testing by enforcing some up front design, is that the unit test can
test for code paths that the implementer may not typically consider.&nbsp;
Furthermore, the unit test documents precisely what the code path is
expected to do.&nbsp; Conversely, discipline is needed during implementation
when it is discovered that there are code paths that the unit test did
not foresee--time to fix the unit test!</p>
<h4><a name="The Parameter-Range Pattern5"></a>The Parameter-Range Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern3.jpg" border="0" height="145" alt="" width="313" /></p>
<p>Still, the above test, while improving on the Simple-Test pattern,
does nothing to convince me that the code handles a variety of
pass/fail conditions.&nbsp; In order to do this, the code should really be
tested using a range of conditions.&nbsp; The Parameter-Range pattern does
this by feeding the Code-Path pattern with more than a single parameter
set.&nbsp; Now I am finally beginning to have confidence that the code under
test can actually work in a variety of environments and conditions.&nbsp; </p>
<h3><a name="Data Driven Test Patterns6"></a>Data Driven Test Patterns</h3>
<p>Constructing Parameter-Range unit tests is doable for certain kinds
of testing, but it becomes inefficient and complicated to test at a
piece of code with a complex set of permutations generated by the unit
test itself.&nbsp; The data driven test patterns reduce this complexity by
separating the test data from the test.&nbsp; The test data can now be
generated (which in itself might be a time consuming task) and modified
independent of the test.</p>
<h4><a name="The Simple-Test-Data Pattern7"></a>The Simple-Test-Data Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern4.jpg" border="0" height="109" alt="" width="337" /></p>
<p>In the simplest case, a set of test data is iterated through to test
the code and a straightforward result (either pass or fail) is
expected.&nbsp; Computing the result can be done in the unit test itself or
can be supplied with the data set.&nbsp; Variances in the result are not
permitted.&nbsp; Examples of this kind of of Simple-Test-Data pattern
include checksum calculations, mathematical algorithms, and simple
business math calculations.&nbsp; More complex examples include encryption
algorithms and lossless encoding or compression algorithms.</p>
<h4><a name="The Data-Transformation-Test Pattern8"></a>The Data-Transformation-Test Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern5.jpg" border="0" height="97" alt="" width="325" /></p>
<p>The Data-Transformation-Test pattern works with data in which a
qualitative measure of the result must be performed.&nbsp; This is typically
applied to transformation algorithms such as lossy compression.&nbsp; In
this case, for example, the unit test might want to measure the
performance of the algorithm with regard to the compression rate vs.
the data loss.&nbsp; The unit test may also need to verify that the data can
be translated back into something that resembles the input data within
some tolerance.&nbsp; There are other applications for this kind of unit
test--a rounding algorithm that favors the merchant rather than the
customer is a simple example.&nbsp; Another example is precision.&nbsp; Precision
occurs frequently in business--the calculation of taxes, interesting,
percentages, etc., all of which ultimately must be rounded to the penny
or dollar but can have dramatic effects on the resulting value if
precision is not managed correctly throughout the calculation.</p>
<h3><a name="Data Transaction Patterns9"></a>Data Transaction Patterns</h3>
<p>Data transaction patterns are a start at embracing the issues of
data persistence and communication.&nbsp; More on this topic is discussed
under &quot;Simulation Patterns&quot;.&nbsp; Also, these patterns intentionally omit
stress testing, for example, loading on the server.&nbsp; This will be
discussed under &quot;Stress-Test Patterns&quot;.</p>
<h4><a name="The Simple-Data-I/O Pattern10"></a>The Simple-Data-I/O Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern6.jpg" border="0" height="49" alt="" width="313" /></p>
<p>This is a simple data transaction pattern, doing little more than
verifying the read/write functions of the service.&nbsp; It may be coupled
with the Simple-Test-Data pattern so that a set of data can be handed
to the service and read back, making the transaction tests a little bit
more robust. </p>
<h4><a name="The Constraint-Data Pattern11"></a>The Constraint-Data Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern7.jpg" border="0" height="265" alt="" width="205" /></p>
<p>The Constraint-Data pattern adds robustness to the Simple-Data-I/O
pattern by testing more aspects of the service and any rules that the
service may incorporate.&nbsp; Constraints typically include:</p>
<ul><li>can be null 
</li><li>must be unique 
</li><li>default value 
</li><li>foreign key relationship 
</li><li>cascade on update 
</li><li>cascade on delete </li></ul>
<p>As the diagram illustrates, these constraints are modeled after
those typically found in a database service and are &quot;write&quot; oriented.&nbsp;
This unit test is really oriented in verifying the service
implementation itself, whether a DB schema, web service, or other model
that uses constraints to improve the integrity of the data.</p>
<h4><a name="The Rollback Pattern12"></a>The Rollback Pattern</h4><img src="http://www.codeproject.com/KB/architecture/autp5/pattern8.jpg" border="0" height="135" alt="" width="205" /> 
<p>The rollback pattern is an adjunct to the other transaction testing
patterns.&nbsp; While unit tests are supposed to be executed without regard
to order, this poses a problem when working with a database or other
persistent storage service.&nbsp; One unit test may alter the dataset
causing another unit test to inappropriately fail.&nbsp; Most transactional
unit tests should incorporate the ability to rollback the dataset to a
known state.&nbsp; This may also require <em>setting</em> the dataset into a
known state at the beginning of the unit test.&nbsp; For performance
reasons, it is probably better to configure the dataset to a known
state at the beginning of the test suite rather than in each test and
use the service's rollback function to restore that state for each test
(assuming the service provides rollback capability).</p>
<h3><a name="Collection Management Patterns13"></a>Collection Management Patterns</h3>
<p>A lot of what applications do is manage collections of information.&nbsp;
While there are a variety of collections available to the programmer,
it is important to verify (and thus document) that the code is using
the correct collection.&nbsp; This affects ordering and constraints.</p>
<h4><a name="The Collection-Order Pattern14"></a>The Collection-Order Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern9.jpg" border="0" height="62" alt="" width="311" /></p>
<p>This is a simple pattern that verifies the expected results when
given an unordered list.&nbsp; The test validates that the result is as
expected:</p>
<ul><li>unordered 
</li><li>ordered 
</li><li>same sequence as input </li></ul>
<p>This provides the implementer with crucial information as to how the container is expected to manage the collection.</p>
<h4><a name="The Enumeration Pattern15"></a>The Enumeration Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern10.jpg" border="0" height="109" alt="" width="313" /></p>
<p>This pattern verifies issues of enumeration, or collection
traversal.&nbsp; For example, a collection may need to be traversed forwards
and backwards.&nbsp; This is an important test to perform when collections
are non-linear, for example a collection of tree nodes.&nbsp; Edge
conditions are also important to test--what happens when the collection
is enumerated past the first or last item in the collection?</p>
<h4><a name="The Collection-Constraint Pattern16"></a>The Collection-Constraint Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern11.jpg" border="0" height="169" alt="" width="217" /></p>
<p>This pattern verifies that the container handles constraint
violations: null values and inserting duplicate keys.&nbsp; This pattern
typically applies only to key-value pair collections.</p>
<h4><a name="The Collection-Indexing Pattern17"></a>The Collection-Indexing Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern12.jpg" border="0" height="193" alt="" width="217" /></p>
<p>The indexing tests verify and document the indexing methods that the
collection container must support--by index and/or by key.&nbsp; In
addition, they verify that update and delete transactions that utilize
indexing are working properly and are protected against missing indexes.</p>
<h3><a name="Performance Patterns18"></a>Performance Patterns</h3>
<p>Unit testing should not just be concerned with function but also
with form.&nbsp; How efficiently does the code under test perform its
function?&nbsp; How fast?&nbsp; How much memory does it use?&nbsp; Does it trade off
data insertion for data retrieval effectively?&nbsp; Does it free up
resources correctly?&nbsp; These are all things that are under the purview
of unit testing.&nbsp; By including performance patterns in the unit test,
the implementer has a goal to reach, which results in better code, a
better application, and a happier customer.</p>
<h4><a name="The Performance-Test Pattern19"></a>The Performance-Test Pattern</h4><img src="http://www.codeproject.com/KB/architecture/autp5/pattern13.jpg" border="0" height="79" alt="" width="449" /> 
<p>The basic types of performance that can be measured are:</p>
<ul><li>Memory usage (physical, cache, virtual) 
</li><li>Resource (handle) utilization 
</li><li>Disk utilization (physical, cache) 
</li><li>Algorithm Performance (insertion, retrieval, indexing, and operation) </li></ul>
<p>Note that some languages and operating systems make this information
difficult to retrieve.&nbsp; For example, the C# language with its garbage
collection is rather difficult to work with in regards to measuring
memory utilization.&nbsp; Also, in order to achieve meaningful metrics, this
pattern must often be used in conjunction with the Simple-Test-Data
pattern so that the metric can measure an entire dataset.&nbsp; Note that
just-in-time compilation makes performance measurements difficult, as
do environments that are naturally unstable, most notably networks.&nbsp; I
discuss the issue of performance and memory instrumentation in my
fourth article in a series on advanced unit testing found at <a href="http://www.codeproject.com/csharp/autp4.asp">http://www.codeproject.com/csharp/autp4.asp</a>.</p>
<h3><a name="Process Patterns20"></a>Process Patterns</h3>
<p>Unit testing is intended to test, well, units...the basic functions
of the application.&nbsp; It can be argued that testing processes should be
relegated to the acceptance test procedures, however I don't buy into
this argument.&nbsp; A process is just a different type of unit.&nbsp; Testing
processes with a unit tester provide the same advantages as other unit
testing--it documents the way the process is intended to work and the
unit tester can aid the implementer by also testing the process out of
sequence, rapidly identifying potential user interface issues as well.&nbsp;
The term &quot;process&quot; also includes state transitions and business rules,
both of which must be validated.</p>
<h4><a name="The Process-Sequence Pattern21"></a>The Process-Sequence Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern14.jpg" border="0" height="232" alt="" width="217" /></p>
<p>This pattern verifies the expected behavior when the code is
performed in sequence, and it validates that problems when code is
executed out of sequence are properly trapped.&nbsp; The Process-Sequence
pattern also applies to the Data-Transaction pattern--rather than
forcing a rollback, resetting the dataset, or loading in a completely
new dataset, a process can build on the work of the previous step,
improving performance and maintainability of the unit test structure.</p>
<h4><a name="The Process-State Pattern22"></a>The Process-State Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern15.jpg" border="0" height="103" alt="" width="337" /></p>
<p>The concept of state cannot be decoupled from that of process.&nbsp; The
whole point of managing state is so that the process can transition
smoothly from one state to another, performing any desired activity.&nbsp;
Especially in &quot;stateless&quot; systems such as web applications, the concept
of state (as in the state of the session) is important to test.&nbsp; To
accomplish this without a complicated client-server setup and manual
actions requires a unit tester that can understand states and allowable
transitions and possibly also work with mock objects to simulate
complicated client-server environments.</p>
<h4><a name="The Process-Rule Pattern23"></a>The Process-Rule Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern16.jpg" border="0" height="49" alt="" width="337" /></p>
<p>This test is similar to the Code-Path pattern--the intention is to
verify each business rule in the system.&nbsp; To implement such a test,
business rules really need to be properly decoupled from surrounding
code--they cannot be embedded in the presentation or data access
layers.&nbsp; As I state elsewhere, this is simply good coding, but I'm
constantly amazed at how much code I come across that violates these
simple guidelines, resulting in code that is very difficult to test in
discrete units.&nbsp; Note that here is another benefit of unit testing--it
enforces a high level of modularity and decoupling.</p>
<h3><a name="Simulation Patterns24"></a>Simulation Patterns</h3>
<p>Data transactions are difficult to test because they often require a
preset configuration, an open connection, and/or an online device (to
name a few).&nbsp; Mock objects can come to the rescue by simulating the
database, web service, user event, connection, and/or hardware with
which the code is transacting.&nbsp; Mock objects also have the ability to
create failure conditions that are very difficult to reproduce in the
real world--a lossy connection, a slow server, a failed network hub,
etc.&nbsp; However, to properly use mock objects the code must make use of
certain factory patterns to instantiate the correct instance--either
the real thing or the simulation.&nbsp; All too often I have seen code that
creates a database connection and fires off an SQL statement to a
database, all embedded in the presentation or business layer!&nbsp; This
kind of code makes it impossible to simulate without all the supporting
systems--a preconfigured database, a database server, a connection to
the database, etc.&nbsp; Furthermore, testing the result of the data
transaction requires another transaction, creating another failure
point.&nbsp; As much as possible, a unit test should not in itself be
subject to failures outside of the code it is trying to test.</p>
<h4><a name="Mock-Object Pattern25"></a>Mock-Object Pattern</h4>
<p>In order to properly use mock objects, a factory pattern <u>must</u> be used to instantiate the service connection, and a base class <u>must</u>
be used so that all interactions with the service can be managed using
virtual methods.&nbsp; (Yes, alternatively, Aspect Oriented Programming
practices can be used to establish a pointcut, but AOP is not available
in many languages).&nbsp; The basic model is this:</p>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/simulation.jpg" border="0" height="241" alt="" width="277" /></p>
<p>To achieve this construct, a certain amount of foresight and
discipline is needed in the coding process.&nbsp; Classes need to be
abstracted, objects must be constructed in factories rather than
directly instantiated in code, facades and bridges need to be used to
support abstraction, and data transactions need to be extracted from
the presentation and business layers.&nbsp; These are good programming
practices to begin with and result in a more flexible and modular
implementation.&nbsp; The flexibility to simulate and test complicated
transactions and failure conditions gains a further advantage to the
programmer when mock objects are used.</p>
<h4><a name="The Service-Simulation Pattern26"></a>The Service-Simulation Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern17.jpg" border="0" height="112" alt="" width="211" /></p>
<p>This test simulates the connection and I/O methods of a service.&nbsp; In
addition to simulating an existing service, this pattern is useful when
developing large applications in which functional pieces are yet to be
implemented.</p>
<h4><a name="The Bit-Error-Simulation Pattern27"></a>The Bit-Error-Simulation Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern18.jpg" border="0" height="117" alt="" width="274" /></p>
<p>I have only used this pattern in limited applications such as
simulating bit errors induced by rain-fade in satellite
communications.&nbsp; However, it is important to at least consider where
errors are going to be handled in the data stream--are they handled by
the transport layer or by higher level code?&nbsp; If you're writing a
transport layer, then this is a very relevant test pattern.</p>
<h4><a name="The Component-Simulation Pattern28"></a>The Component-Simulation Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern19.jpg" border="0" height="112" alt="" width="211" /></p>
<p>In this pattern, the mock object simulates a component failure, such
as a network cable, hub, or other device.&nbsp; After a suitable time, the
mock object can do a variety of things:</p>
<ul><li>throw an exception 
</li><li>return incomplete or completely missing data 
</li><li>return a &quot;timeout' error </li></ul>
<p>Again, this unit test documents that the code under test needs to handle these conditions.</p>
<h3><a name="Multithreading Patterns29"></a>Multithreading Patterns</h3>
<p>Unit testing multithreaded applications is probably one of the most
difficult things to do because you have to set up a condition that by
its very nature is intended to be asynchronous and therefore
non-deterministic.&nbsp; This topic is probably a major article in itself,
so I will provide only a very generic pattern here.&nbsp; Furthermore, to
perform many threading tests correctly, the unit tester application
must itself execute tests as separate threads so that the unit tester
isn't disabled when one thread ends up in a wait state.</p>
<h4><a name="The Signalled Pattern30"></a>The Signalled Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern20.jpg" border="0" height="85" alt="" width="385" /></p>
<p>This test verifies that a worker thread eventually signals the main
thread or another worker thread, which then completes its task.&nbsp; This
may be dependent on other services (another good use of mock objects)
and the data on which both threads are operating, thus involving other
test patterns as well.</p>
<h4><a name="The Deadlock-Resolution Pattern31"></a>The Deadlock-Resolution Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern21.jpg" border="0" height="88" alt="" width="385" /></p>
<p>This test, which is probably very complicated to establish because
it requires a very thorough understanding of the worker threads,
verifies that deadlocks are resolved.</p>
<h3><a name="Stress-Test Patterns32"></a>Stress-Test Patterns</h3>
<p>Most applications are tested in ideal environments--the programmer
is using a fast machine with little network traffic, using small
datasets.&nbsp; The real world is very different.&nbsp; Before something
completely breaks, the application may suffer degradation and respond
poorly or with errors to the user.&nbsp; Unit tests that verify the code's
performance under stress should be met with equal fervor (if not more)
than unit tests in an ideal environment.</p>
<h4><a name="The Bulk-Data-Stress-Test Pattern33"></a>The Bulk-Data-Stress-Test Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern22.jpg" border="0" height="115" alt="" width="461" /></p>
<p>This test is designed to validate the performance of data
manipulation when working with large data sets.&nbsp; These tests will often
reveal inefficiencies in insertion, access, and deletion processes
which are typically corrected by reviewing the indexing, constraints,
and structure of the data model, including whether code is should be
run on the client or the server.</p>
<h4><a name="The Resource-Stress-Test Pattern34"></a>The Resource-Stress-Test Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern23.jpg" border="0" height="85" alt="" width="241" /></p>
<p>Resource consumption stress testing depends on features of the
operating system and may be served better by using mock objects.&nbsp; If
the operating system supports simulating low memory, low disk space,
and other resources, then a simple test can be performed.&nbsp; Otherwise,
mock objects must be used to simulate the response of the operating
system under a low resource condition.</p>
<h4><a name="The Loading-Test Pattern35"></a>The Loading-Test Pattern</h4>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/pattern24.jpg" border="0" height="85" alt="" width="241" /></p>
<p>This test measures the behavior of the code when another machine,
application, or thread is loading the &quot;system&quot;, for example high CPU
usage or network traffic.&nbsp; This is a simulation only (which does not
use mock objects) and therefore is of dubious value.&nbsp; Ideally, a unit
test that is intended to simulate a high volume of network traffic
would create a thread to do just that--inject packets onto the network.</p>
<h3><a name="#mvc1"></a>Presentation Layer Patterns</h3>
<p>One of the most challenging aspects of unit testing is verifying
that information is getting to the user right at the presentation layer
itself and that the internal workings of the application are correctly
setting presentation layer state.&nbsp; Often, presentation layers are
entangled with business objects, data objects, and control logic.&nbsp; If
you're planning on unit testing the presentation layer, you have to
realize that a clean separation of concerns is mandatory.&nbsp; Part of the
solution involves developing an appropriate Model-View-Controller (MVC)
architecture.&nbsp; The MVC architecture provides a means to develop good
design practices when working with the presentation layer.&nbsp; However, it
is easily abused.&nbsp; A certain amount of discipline is required to ensure
that you are, in fact, implementing the MVC architecture correctly,
rather than just in word alone.</p>
<p>Sun Microsystems has a webpage which I consider is the gospel for the MVC archicture: <a href="http://java.sun.com/blueprints/patterns/MVC-detailed.html">http://java.sun.com/blueprints/patterns/MVC-detailed.html</a>.&nbsp; To summarize the MVC pattern here:</p>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/mvc1.jpg" border="0" height="187" alt="" width="310" /></p>
<p>It is vital that events are used for model notification changes and
user gestures, such as clicking on a button.&nbsp; If you don't use events,
the model breaks because you can't easily exchange the view to adjust
the presentation to the particular presentation layer requirement.&nbsp;
Furthermore, without events, objects become entangled.&nbsp; Also, events,
such as managed by an event pool, allow for instrumentation and ease
debugging.&nbsp; The only exception to this model that I have found in
practice is that on occasion, a state change in the model might be
captured by an event in the controller rather than the view.&nbsp; Some
model changes, such as user authorization, are view-less but end up
affecting other aspects of the controller.</p>
<h4><a name="#mvc2"></a>The View-State Test Pattern</h4>
<p>This test verifies that for a change in the model state, the view changes state appropriately.</p>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/mvc3.jpg" border="0" height="231" alt="" width="478" /></p>
<p>This test exercises only half of the MVC pattern--the model event
notifications to the view, and the view management of those events in
terms of affects on the presentation layer content and state.&nbsp; The
controller is not a factor in this test pattern.</p>
<h4><a name="#mvc3"></a>The Model-State Test Pattern</h4>
<p>Once we have verified application's performance with the View-State
Pattern, we can progress to a more complicated one.&nbsp; In this pattern,
the unit test simulates user gestures by setting state and content
directly in the presentation layer, and if necessary, invoking a state
change event such as &quot;KeyUp&quot;, &quot;Click&quot;, etc.</p>
<p><img src="http://www.codeproject.com/KB/architecture/autp5/mvc2.jpg" border="0" height="231" alt="" width="478" /></p>
<p>As diagrammed above, the unit test verifies that the model state has
changed appropriately and that the expected events fired.&nbsp; In addition,
the view's events can be hooked and verified to fire correctly for the
simulated user gesture.&nbsp; This test may require some setup on the model
itself, and treats the controller as a black box, however model state
can be inspected to determine whether the controller is managing the
model state appropriately.</p>
<h2><a name="Conclusion36"></a>Conclusion</h2>
<p>This article has described 24 test patterns that hopefully bring the
technique of unit testing closer to a more formal engineering
discipline.&nbsp; When writing unit tests, reviewing these patterns should
help in identifying the kind of unit test to write, and the usefulness
of that unit test.&nbsp; It also allows the developer to choose how detailed
the unit tests need to be--not every piece of code needs to be stress
tested, nor is it cost effective to do so.</p>
<p>As you can see from this article, we desperately need some tools
that generate unit tests automatically.&nbsp; I'm not much of an advocate of
code generates, but I can see that unit testing would really benefit
from code generation.&nbsp; It would all but eliminate the arguments against
unit testing based on cost and effectiveness, and could also be used as
an application generating tool--given information on the unit test, the
code generator can also create the application code classes, structure,
and stubs.</p>



<!-- Article Ends -->


			<!-- Main Page Contents End -->
			
			</div>
			</span>
			
			</p>
		<div>
		
		</div>
		

			<h2>License</h2>
			<div id="ctl00_LicenseTerms"><p>This
article has no explicit license attached to it but may contain usage
terms in the article text or the download files themselves. If in doubt
please contact the author via the discussion board below.</p><p>A list of licenses authors might use can be found <a href="http://www.codeproject.com/info/Licenses.aspx">here</a></p></div>
			
			
			
			<h2>About the Author</h2>
			
					
            
<table cellspacing="5" border="0" width="100%" cellpadding="0">
<tbody><tr valign="top">
<td id="ctl00_AboutAuthorRptr_ctl00_AboutAuthor_memberPhotoTable" valign="top" style="width: 155px">
	<strong><a href="http://www.codeproject.com/script/Membership/Profiles.aspx?mid=36803" id="ctl00_AboutAuthorRptr_ctl00_AboutAuthor_memberProfileLink">Marc Clifton</a></strong><br /><br />
	<img src="http://www.codeproject.com/script/Membership/ProfileImages/%7BCCCA6270-7875-4937-96C2-0CF123E2F30F%7D.jpg" id="ctl00_AboutAuthorRptr_ctl00_AboutAuthor_memberPhoto" alt="" style="border-width: 0px" /><br />
	<span class="SmallText">Mvp, Protector, Supporter</span>
		
</td>
		
<td>
	Marc is the creator of <a href="http://www.myxaml.com/">MyXaml</a>,
an open source, declarative, XML instantiation engine. He is an
industry consultant working primarily with companies interested in
utilizing declarative programming concepts to add flexibility to n-tier
architectures on web, CE, and desktop platforms. His other major open
source project is the <a href="http://www.marcclifton.com/Projects/AdvancedUnitTesting/tabid/102/Default.aspx"> Advanced Unit Testing framework</a>.&nbsp; He operates his own website, <a href="http://www.marcclifton.com/">www.marcclifton.com</a>, where you will find many of his articles.  <br /><br />Marc lives in Hudson, NY with his girlfriend Karen and his son Ian, who attends the <a href="http://www.hawthornevalleyschool.org/">Hawthorne Valley School</a>.  To contact Marc, email him at <a href="mailto:marc.clifton@gmail.com">marc.clifton@gmail.com</a>.<br /><br />	

	<table border="0">
	<tbody><tr id="ctl00_AboutAuthorRptr_ctl00_AboutAuthor_jobTitleRow">
			<td class="SmallText">Occupation: </td>
			<td width="100%"><span class="SmallText">Architect</span></td>
		</tr>
		

	<tr id="ctl00_AboutAuthorRptr_ctl00_AboutAuthor_companyRow">
			<td class="SmallText">Company: </td>
			<td width="100%"><span class="SmallText">Interacx</span></td>
		</tr>
		

	<tr id="ctl00_AboutAuthorRptr_ctl00_AboutAuthor_locationRow">
			<td class="SmallText">Location: </td>
			<td width="100%"><span class="SmallText"><img src="http://www.codeproject.com/script/Geo/Images/US.gif" height="11" alt="United States" width="16" /> United States</span></td></tr></tbody></table></td></tr></tbody></table><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://alanwu.javaeye.com/blog/174110#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 14:20:53 +0800</pubDate>
        <link>http://alanwu.javaeye.com/blog/174110</link>
        <guid>http://alanwu.javaeye.com/blog/174110</guid>
      </item>
          <item>
        <title>Automated unit Bestpractise</title>
        <author>alanwu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alanwu.javaeye.com">alanwu</a>&nbsp;
                    链接：<a href="http://alanwu.javaeye.com/blog/174093" style="color:red;">http://alanwu.javaeye.com/blog/174093</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Automated unit testing<br />	Continuous integration software--CruiseControl<br />	Yes...<br />		More code needs to be written<br />		Estimates will increase<br />		It's a new way of working<br />		It feels weired,perhaps pointless initially<br />	But...<br />		Automated unit testing is very powerfull<br />		Lets you regression test code for free!<br />		Helps you write cheaner code<br />		Provides a good milestone for completion<br />		Provides confidence when changing, fixing or refactoring code<br />		If you can write code, you can write a unit test!<br />	A defect is raised...<br />		Look at the unit tests<br />		Write a unit test to prove the bug -- make sure its reproducible<br />		Fix the bug<br />		The new test will pass<br />		Check-in the fix and new test<br />		Chances of reoccurrence are greatly reduced<br /><br />Continuous integration<br />Project blogs -- Pebble<br />	<br />Tracking metrics over time -- QALab<br /><br />http://www.scribd.com/doc/387095/Java-Development-Best-Practices
          <br/><br/>
          <span style="color:red;">
            <a href="http://alanwu.javaeye.com/blog/174093#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 13:46:19 +0800</pubDate>
        <link>http://alanwu.javaeye.com/blog/174093</link>
        <guid>http://alanwu.javaeye.com/blog/174093</guid>
      </item>
          <item>
        <title>三步教你改善Java代码质量zz</title>
        <author>alanwu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alanwu.javaeye.com">alanwu</a>&nbsp;
                    链接：<a href="http://alanwu.javaeye.com/blog/173467" style="color:red;">http://alanwu.javaeye.com/blog/173467</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.bitscn.com/java/advanceprogram/200803/131922.html" target="_blank">http://www.bitscn.com/java/advanceprogram/200803/131922.html</a></p><p>&nbsp;</p><p>本文讨论了如何以递进的方式使用Apache Ant来改善我们的代码质量。并按着三步走的原则给出了具体的实现步骤。 <span class="Fix699">bitscn.com</span> 
</p><p>　　一、充分利用单元测试、代码覆盖 </p><p class="Fix699">bitscn.com</p> 
<p>　　单元测试、代码覆盖是最容易被接受和实现的方式。事实上，大多数开发人员都知道单元测试对他们很重要。在我们开始讨论这些东西之前，先看一下
Google研究院主管Peter
Norvig的一段话：&ldquo;如果你认为你们不需要对自己的代码进行单元测试，那么就写在纸上写一所有的原因，并且仔细研究这张纸，然后扔了它，继续测试自己
的程序吧&rdquo;。看来Google也是非常推崇进行单元测试的。那么谁又来测试那么测试者呢？也就是说，我们怎么能验证对程序做了足够的测试呢？这是一个非常
有价值的问题，因为那些未通过测试的程序才是我们更应该关注的地方。这个问题的一个解决方案就是使用代码覆盖工具，这种工具将告诉我们我们到底测试了多少
代码（也就是被测试代码的百分比），然后使用一般的综合处理来合并覆盖核对结果。如果覆盖核对失败，那么我们建立应用程序的过程也就失败了。 </p><p class="Fix699">bitsCN.Com</p> 
<p>　　对了本文所讨论的递增代码策略选择了代码覆盖工具Cobertura，这是由于它非常容易使用，而且拥有良好的定义格式，以及四个Ant任务接
口。这些任务之一就是cobertura-check，当代码不能完成我们要求的覆盖率时，它就会失败。如下面的代码显示如果覆盖率未达到80%，Ant
在建立工程时就会失败： </p><p class="Fix699">bitsCN_com</p> 
<p>　　&lt;target name=&quot;coverage_check&quot;&gt; <span class="Fix699">bitsCN_com</span> </p>
<p>　　&lt;cobertura-check totallinerate=&quot;80&quot;/&gt; </p><p class="Fix699">中国网管论坛</p> 
<p>　　&lt;/target name=&quot;coverage_check&quot;&gt; <span class="Fix699">bitsCN.Com</span> </p>
<p>　　除了使用硬编码来指定这个覆盖率外，我们还可能以使用一个更容易建立的结果作为当前核对的覆盖率。我们可以通过使用两个核心Ant任务连接一对
Cobertura任务来完成这个任务。并不不用担心各种覆盖率的具体的值。我们的目标是完成可测量的代码改善，而不是设置一个绝对的代码覆盖率。 </p><p class="Fix699">bitsCN.nET中国网管博客</p> 
<p>　　在建立用于测试和运行我们的代码的targets后，我们可以将用于核对我们的建立脚本的增量覆盖率。第一步是使用一个cobertura报吿任务建立一个XML格式的覆盖报表。代码如下： </p><div class="Fix699">bitsCN.nET中国网管博客</div> 
<p>　　&lt;cobertura-report format=&quot;xml&quot;/&gt; </p><div class="Fix699">www_bitscn_com</div> 
<p>　　下面是由一个cobertura报表任务产生的 <span class="Fix699">中国_网管联盟</span> </p>
<p>　　coverage.xml <span class="Fix699">中国.网管联盟</span> </p>
<p>　　&lt;？xml version=&quot;1.0&quot;？&gt; </p><div class="Fix699">www.bitsCN.com</div> 
<p>　　&lt;！DOCTYPE coverage SYSTEM &quot;http://cobertura.sourceforge.net/xml/coverage-02.dtd&quot;&gt; </p><div class="Fix699">中国网管联盟</div> 
<p>　　&lt;coverage line-rate=&quot;0.43612334801762115&quot; branch-rate=&quot;0.48344370860927155&quot; version=&quot;1.8&quot; timestamp=&quot;1181043899853&quot;&gt; <span style="color: #ffffff">bitsCN.nET中国网管博客</span> </p>
<p>　　&lt;sources&gt; </p><div class="Fix699">中国网管论坛</div> 
<p>　　&lt;source&gt;./src/java&lt;/source&gt; </p><p class="Fix699">bbs.bitsCN.com</p> 
<p>　　&lt;/sources&gt; <span style="color: #ffffff">www_bitscn_com</span> </p>
<p>　　&lt;packages&gt; </p><p class="Fix699">BBS.bitsCN.com网管论坛</p> 
<p>　　&hellip;&hellip; <span class="Fix699">中国网管联盟</span> </p>
<p>　　&lt;/packages&gt; </p><p class="Fix699">bitscn.com</p> 
<p>　　&lt;/coverage&gt; <span class="Fix699">bbs.bitsCN.com</span> </p>
<p>　　现在要确保将这个文件保存在某个硬盘上，因为我们在后面会需要这个文件。 </p><div class="Fix699">中国网管联盟</div> 
<p>　　二、从报表中取出覆盖率 </p><div class="Fix699">DL.bitsCN.com网管软件下载</div> 
<p>　　一开始，我们可以试着使用Ant的XmlProperty任务来直接获得这个覆盖率，并给一个Ant属性。但是这个方法有以下两个问题： <span style="color: #ffffff">www.bitsCN.com</span> </p>
<p>　　1. 在coverage.xml中的覆盖率是一个小数，但当核对任务时需要一个整数百分比。 </p><div class="Fix699">中国_网管联盟</div> 
<p>　　2. 在实际的项目中，coverage.xml的文件尺寸非常大，如果在Java中尝试使用XmlProperty任务时可能会出现Java OutOfMemoryError错误。而我们只想从coverage.xml文件中获得以下的内容： </p><p class="Fix699">bitsCN_com</p><p> 
　　&lt;xslt in=&quot;coverage.xml&quot; out=&quot;build/coverage.properties&quot; style=&quot;src/xsl/coverage.xsl&quot; /&gt; </p><p>&nbsp;</p><p>上面的简单的XSL模板需要产生一个只包含我们需要的值的属性文件，内容如下： </p><div class="Rhr992">中国_网管联盟</div> 
<p>　　&lt;xsl：stylesheet xmlns：xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; version=&quot;1.0&quot;&gt; <span class="Rhr992">www_bitscn_com</span> </p>
<p>　　&lt;xsl：output method=&quot;text&quot; omit-xml-declaration=&quot;yes&quot;/&gt; <span style="color: #ffffff">DL.bitsCN.com网管软件下载</span> </p>
<p>　　&lt;xsl：template match=&quot;coverage&quot;&gt; </p><div class="Rhr992">中国.网管联盟</div> 
<p>　　total.line-rate= </p><p class="Rhr992">中国_网管联盟</p> 
<p>　　&lt;xsl：value-of select=&quot;floor（@line-rate*100）&quot;/&gt; <span class="Rhr992">BBS.bitsCN.com网管论坛</span> </p>
<p>　　&lt;/xsl：template&gt; <span class="Rhr992">中国.网管联盟</span> </p>
<p>　　&lt;/xsl：stylesheet&gt; </p><p class="Rhr992">bitsCN.Com</p> 
<p>　　要注意的是方法floor（@line-rate*100），可以将小数覆盖率转换为整型覆盖率。最终结果是一个只包含下面一行的coverage.properties文件： </p><p class="Rhr992">DL.bitsCN.com网管软件下载</p> 
<p>　　total.line-rate=44 </p><p class="Rhr992">bitsCN_com</p> 
<p>　　现在我们可以使用Ant的属性任务来从coverage.properties读取这个Ant属性所需要的覆盖率： <span class="Rhr992">中国网管论坛</span> </p>
<p>　　&lt;property file=&quot;build/coverage.properties&quot; /&gt; </p><p class="Rhr992">bitsCN_com</p> 
<p>　　最后，我们可以将最初的&quot;80&quot;使用新的Ant属性替换，代码如下： <span class="Rhr992">bitscn.com</span> </p>
<p>　　&lt;cobertura-check totallinerate=&quot;${total.line-rate}&quot;/&gt; </p><p class="Rhr992">bitsCN_com</p> 
<p>　　三、将内容放到一起 </p><div class="Rhr992">中国_网管联盟</div> 
<p>　　最后的build.xml文件看上去的形似如下： <span class="Rhr992">中国网管论坛</span> </p>
<p>　　&lt;target name=&quot;coverage_check&quot; depends=&quot;check_against_previous_rate&quot;&gt; <span class="Rhr992">bitsCN.Com</span> </p>
<p>　　&lt;antcall target=&quot;coverage_report&quot;/&gt; <span style="color: #ffffff">中国_网管联盟</span> </p>
<p>　　&lt;/target&gt; <span style="color: #ffffff">中国.网管联盟</span> </p>
<p>　　&lt;target name=&quot;coverage_report&quot;&gt; </p><p class="Rhr992">中国_网管联盟</p> 
<p>　　&lt;cobertura-report format=&quot;xml&quot; destdir=&quot;.&quot; /&gt; </p><div class="Rhr992">www_bitscn_com</div> 
<p>　　&lt;/target&gt; </p><p class="Rhr992">bitsCN_com</p> 
<p>　　&lt;target name=&quot;check_against_previous_rate&quot; depends=&quot;coverage_xml_to_properties&quot;&gt; <span class="Rhr992">www.bitsCN.com</span> </p>
<p>　　&lt;property file=&quot;build/coverage.properties&quot; /&gt; <span class="Rhr992">中国网管论坛</span> </p>
<p>　　&lt;cobertura-check totallinerate=&quot;${coverage.line-rate}&quot; /&gt; <span style="color: #ffffff">www.bitsCN.com</span> </p>
<p>　　&lt;/target&gt; <span style="color: #ffffff">DL.bitsCN.com网管软件下载</span> </p>
<p>　　&lt;target name=&quot;coverage_xml_to_properties&quot;&gt; <span class="Rhr992">bitsCN.nET中国网管博客</span> </p>
<p>　　&lt;xslt in=&quot;coverage.xml&quot; out=&quot;build/coverage.properties&quot; style=&quot;src/xsl/coverage.xsl&quot; /&gt; </p><div class="Rhr992">中国_网管联盟</div> 
<p>　　&lt;/target&gt; <span style="color: #ffffff">DL.bitsCN.com网管软件下载</span> </p>
<p>　　要注意一个新的覆盖报告仅仅当覆盖核对被通过后才能被产生，也就是说，每次提高覆盖率后，都会比上一次建立的代码质量有所提高。 </p><p class="Rhr992">中国网管论坛</p> 
<p>　　四、改善跟踪率的其他方法 </p><p class="Rhr992">BBS.bitsCN.com网管论坛</p> 
<p>　　还有一些递增地改善代码质量的方法是通过将覆盖率记录到文件中来跟踪代码改善率。我们可以通过Ant的echo任务建立如下的代码： </p><div class="Rhr992">中国.网管联盟</div> 
<p>　　&lt;target name=&quot;time&quot;&gt; </p><p class="Rhr992">www.bitsCN.com</p> 
<p>　　&lt;tstamp&gt; <span class="Rhr992">bitsCN.Com</span> </p>
<p>　　&lt;format property=&quot;date.time&quot; pattern=&quot;yyyy-MM-dd HH：mm&quot;/&gt; </p><div class="Rhr992">www.bitsCN.com</div> 
<p>　　&lt;/tstamp&gt; <span class="Rhr992">BBS.bitsCN.com网管论坛</span> </p>
<p>　　&lt;/target&gt; <span class="Rhr992">中国网管论坛</span> </p>
<p>　　&lt;target name=&quot;log&quot; depends=&quot;time&quot;&gt; </p><p class="Rhr992">中国.网管联盟</p> 
<p>　　&lt;echo file=&quot;${history.txt}&quot; append=&quot;true&quot;&gt; </p><div class="Rhr992">bitsCN.nET中国网管博客</div> 
<p>　　${date.time}；total.line-rate；${total.line-rate} <span style="color: #ffffff">中国.网管联盟</span> </p>
<p>　　&lt;/echo&gt; <span style="color: #ffffff">bbs.bitsCN.com</span> </p>
<p>　　&lt;/target&gt; <span class="Rhr992">DL.bitsCN.com网管软件下载</span> </p>
<p>　　五、结果可测量、改善可视化 <span class="Rhr992">bbs.bitsCN.com</span> </p>
<p>　　经过对一个工程的测试，在这个工作使用本文所提供的策略后的一周内定，这个工程的代码质量改善了超过30%.而更另人兴奋的是以前开发人员都不需要对代码进行测试，而现在它们会为通过测试而使他们的代码质量的提高感到骄傲。 <span style="color: #ffffff">DL.bitsCN.com网管软件下载</span> </p>
　　当然，我们不需要只停留在本文所介绍的方法和理论上。我们也可以将增量改善策略用在其他的代码规则中。因为大多数的代码核对工具都可以产生基于XML格式的输出，我们可以使用XSL模板来过滤出与之相关的代码规则，并将这些规则作为当前的代码核对工具的输入。 <p>&nbsp;</p><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://alanwu.javaeye.com/blog/173467#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 17:22:49 +0800</pubDate>
        <link>http://alanwu.javaeye.com/blog/173467</link>
        <guid>http://alanwu.javaeye.com/blog/173467</guid>
      </item>
          <item>
        <title>如何在代码中自动实现设计规范(组图)zz</title>
        <author>alanwu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alanwu.javaeye.com">alanwu</a>&nbsp;
                    链接：<a href="http://alanwu.javaeye.com/blog/173466" style="color:red;">http://alanwu.javaeye.com/blog/173466</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.bitscn.com/java/advanceprogram/200605/20754.html" target="_blank">http://www.bitscn.com/java/advanceprogram/200605/20754.html</a> </p><p>&nbsp;</p><p><strong>摘要</strong><br />　　<br />　　设计规范只表示纯粹的想法；但项目的成功来说，实现这些规范是必须的。传统的实现方式是代码评审。
Hammurapi是一个遵循设计的工具，提供了自动而且一致的方式来实现设计规范，因此使代码评审更加有效而轻松。在这篇文章中，作者介绍了
Hammurapi的使用，并与其他类似工具进行比较，最后还给出演示如何使用的例子。<br />　　<br />　　作为一个J2EE架构师，我需要分发详细
设计给项目团队。通过UML模型，我也会分发那些捕获最佳实践的设计规范。例如，在Struts应用中，我推荐避免在Action类中使用实例变量，因为
Action类是单例的，而且多个线程同时访问一个Action类实例是很平常的。其他例子如在任何DAO应用中，一个重要的设计方针是关闭所有打开的数
据库资源，如果没有这么做通常将导致灾难，尤其是在一个产品环境中。<br />　　<br />　　想法是很好的，但是实现才是关键。现在最常用的实现设计规范的方法是做代码评审，通常是有经验的成员检查代码来找出不符合规范的地方。这些代码可能是没有遵守编码规范或者设计规范。<br />　　<br />　　这是一种非常低效的方法，主要表现在两方面：1、这需要两种资源（开发人员和评审人员）。2、质量变成评审人员的职责。此外，在我的经历中，由于评审人员过于重视规范，使得他们与开发人员对立起来，而这对一个团队来说是不好的。 <span class="Ena913">bbs.bitsCN.com中国网管论坛</span> <br />　　<br />　　许多年前，我接触过Checkstyle，这是一个自动强制代码规范的工具。他与Ant无缝集成并且由基于XML配置文件来驱动。<br />　　<br />　
　Hammurapi是一个与Checkstyle类似的工具，只是他用来强制设计规范。Hammurapi是一个由Pavel
Vlasov开发的开源软件，他可以基于一套设计规范来分析代码库。当他遇到违反规范的地方，会在报告中标识。就像Checkstyle一样，他与Ant
无缝集成并且由基于XML配置文件来驱动。<br />　　<br />　　<strong>运行Hammurapi</strong><br />　　<br />　　你可以直接从命令行运行Hammurapi或者作为Eclipse的插件来使用。在这篇幅文章中，我主要讨论如何通过Ant任务来运行Hammurapi。<br />　　<br />　　注意：你可以从资源中下载与本文对应的源程序。<br />　　<br />　　与Ant集成非常容易，如下面代码所示：<br />　　<br />　　1　 &lt;target name=&quot;design_review&quot; depends=&quot;init&quot;&gt;2<br />　　&lt;taskdef name=&quot;hammurapi&quot; classname=&quot;org.hammurapi.HammurapiTask&quot;&gt;3<br />　　&lt;classpath&gt;4<br />　　&lt;fileset dir=&quot;${hammurapi.home}\lib&quot;&gt;5<br />　　&lt;include name=&quot;**\*.jar&quot;&gt;&lt;/include&gt;6<br />　　&lt;/fileset&gt;7<br />　　&lt;/classpath&gt;8<br />　　&lt;/taskdef&gt;9<br />　　&lt;hammurapi&gt;10 </p><p class="Ena913">中国_网管联盟bitsCN.com</p> <br />　　&lt;src dir=&quot;src&quot;/&gt;11<br />　　&lt;output dir=&quot;docs\review&quot;/&gt;12<br />　　&lt;classpath&gt;13<br />　　&lt;pathelement location=&quot;${$log4j.home}\lib\log4j.jar&quot;\/&gt;14<br />　　&lt;pathelement location=&quot;${weblogic.home}\lib\weblogic.jar&quot;\/&gt;15<br />　　&lt;/classpath&gt;16<br />　　&lt;/hammurapi&gt;17<br />　　&lt;/target&gt;<br />　　<br />　
　第一行定义了一个design_review的目标。他依赖于init目标&mdash;初始化构建的属性（如第四行的${hammurapi.home}）。第二
行定义了一个&ldquo;hammurapi&rdquo;新任务。这个Ant任务由org.hammurap.HammurapiTask类实现。内嵌的classpath元
素定义了定义这个任务所需要的类库。<br />　　<br />　　第九行声明了一个先前定义的hammurapi任务。运行这个任务相当简单：只要定义内嵌的
src元素就可以了，他会告诉任务上哪儿查找源程序；然后定义另一个元素output，这告诉任务在哪儿输出报告。第十行告诉任务在项目任务目录下的
src目录下查找需要评审的源程序。第十一行告诉任务输出报告到项目目录下的docs\review中。<br />　　<br />　　第十二行的classpath元素是可选的，他定义了源程序依赖的类库位置。<br />　　<br />　　Hammurapi带有100多个内建的检查器。每一个对应一个设计规范。<br />　　 <span style="color: #fafafd">[bitsCN_com]</span> <br />　　先前列出的Ant代码片断将在log4j源程序上运行Hammurapi。代码将被解压到项目目录下的src目录。图1显示了生成的报告的打开页面。Hammurapi最令人激动的特性就是他生成的全面的报告。<br />　　　<img src="http://www.bitscn.com/upimg/2006-05-07/161905_05_701.jpg" alt="" /><br />　　图1例示了报告report.html的主页，右边的框架显示了三个标题：结果、严重性小结和文件。<br />　　<br />　　结果段落显示整体评审的统计。如图1中所示，26个包中的179个文件被评审了；其中包含6344违反规范的地方。<br />　　<br />　　严重性小结段落以表的方式来显示违反规范的地方。每一项属于一个严重级别。预定义的级别包含1-5级。级别1是最严重的。<br />　　<br />　　文件段落(图2)列出了每一个被评审的文件和他所违反的规范。<br />　　　<img src="http://www.bitscn.com/upimg/2006-05-07/161906_06_835.gif" alt="" /><br />　
　虽然严重性小结段落可以回答如多少空catch块被找到，文件段落可以回答在Appender.java中多少规范被违反。但是Hammurapi最有
用的功能是他可以在报告中显示违反规范所在的代码行数。如让我们分析一下设计规范ER002：空catch块（图2）。点击数字列的超链就可以显示报告这
个违反的文件，如图3所示。<br />　　　<img src="http://www.bitscn.com/upimg/2006-05-07/161908_07_179.gif" alt="" /> <div class="Ena913">bitsCN#com中国网管联盟</div> <br />　　在很多文件中，报告显示LogRecord.java (3)在第307行违反了这个规范。在行数下的超链直接链接到源程序，如图4的示。<br />　　　<img src="http://www.bitscn.com/upimg/2006-05-07/161910_08_256.gif" alt="" /><br />　　虽然从整个代码库的运行Hammurapi是最常用的方式，但你也可以使用增量的评审自上一次评审后改变的代码。这在代码库非常大评审需要很长时间时非常有用。<br />　　<br />　　另一个运行Hammurapi的有效方式是可以处理压缩文件和其所依赖的并生成压缩的结果文件。这种方式在开发团队分布在不同的地理位置时非常有用。在这个情况下，源程序被压缩并传送到远程的评审点。<br />　　<br />　　<strong>其他设计评审工具</strong><br />　　<br />　
　Hammurapi并非是仅有的代码评审工具。Metrics也是一个可以作为Eclipse的很流行的类似工具。然而他有两个主要的缺点：首先他和
Eclipse紧密结合，想要与Ant结合相当麻烦。由于需要Eclipse的类库，这使得不使用Eclipse作为IDE的项目不能使用
Metrics。其次，你不能用Metrics构造自定义的检查器（Hammurapi可以）--这限制了用户只能使用内建的检查器。<br />　　<br />　　其他的工具还有PMD。类似于Hammurapi，他与Ant无缝集成而且允许自定义检查器。然而PMD生成的报告不如Hammurapi生成的报告全面。 <span class="Ena913">bbs.bitsCN.com中国网管论坛</span> <br />　　<br />　　<strong>Hammurapi如何工作</strong><br />　　<br />　
　Hammurapi这样的代码分析工具都带有语言分析器。语言分析器是一种输入语言代码并输出抽象语法树的工具。这个树上的节点代表语言标识。例如，考
虑一下简单的算术表达式：3+4. 语言分析器会解析他成为一个如图5所示的语法树。在这个树中，节点+代表操作符标识。节点3和4是操作数标识。<br />　　　<img src="http://www.bitscn.com/upimg/2006-05-07/161911_09_982.jpg" alt="" /><br />　　Hammurapi使用ANTLR（另一个语言识别工具）作为语言分析器。然而ANTLR API是相当底层的。为改善可用性，Hammurapi使用另一个API，基于ANTLR 的JSEL（Java源程序工程类库），来访问抽象语法树。<br />　　<br />　　一旦树构建完成，一种树遍历算法就被用来访问树中每一个节点。每次访问到一个节点，一种回调机制（Visitor模式）被用来提示相应的检查器。在这些回调方法中，检查器收集相关的信息来确定是否有违反规范的地方存在。<br />　　<br />　　<strong>构建自定义的检查器</strong><br />　　<br />　
　一个自定义检查器可以更好理解Hammurapi框架。如前面所提，一种Struts的最佳实践是避免Action类中的实例变量。所以我们会构建一个
自定义检查器ActionClassInspector，他扫描源程序中的Action类，如果一个Action类被发现，他就扫描是否存在实例变量。如
果一个以上的实例变量被发现，他就标识出相应的违反。 <span style="color: #fafafd">bbs.bitsCN.com</span> <br />　　<br />　　图6例示了ActionClassInspector类的变量和方法。所有的检查器都继承自org.hammurapi.InspectorBase类。<br />　　　<img src="http://www.bitscn.com/upimg/2006-05-07/161912_010_739.jpg" alt="" /><br />　
　图7例示了Hammurapi框架激活ActionClassInspector类的回调方法的时序图。框架解析源程序并构建一个抽象语法树，然后访问
树中的每一个节点。当一个类节点被访问时，他调用visit( v:VariableDefinition
)方法。因为通常一个类可能包含多个变量，这个方法可能会被调用多次。<br />　　  <img src="http://www.bitscn.com/upimg/2006-05-07/161912_011_602.jpg" alt="" /><br />　　下面的代码显示了visit( c:Class )方法：<br />　　<br />　　1　 public void visit( com.pavelvlasov.jsel.Class c ) throws Exception2<br />　　{3<br />　　isActionClass = c.isKindOf( &quot;org.apache.struts.action.Action&quot;);<br />　　45　　　return;6　 }<br />　　<br />　　这个方法负责确定是否一个特定的类是Action类。这个测试在第三行被执行。如果测试是肯定的，那么isActionClass被设置为真。这个规范仅应用于Action类。<br />　　<br />　　下面的代码例示了visit( v:VariableDefinition )方法：<br />　　<br />　　1　 public void visit( com.pavelvlasov.jsel.VariableDefinition v ) throws Exception2 <span class="Ena913">bitsCN#com中国网管联盟</span> <br />　　{3<br />　　List modifiers;4<br />　　Scope scope;56<br />　　if( this.isActionClass )7<br />　　{8<br />　　modifiers = v.getModifiers( );9<br />　　scope = v.getEnclosingScope( );10<br />　　if( scope instanceof com.pavelvlasov.jsel.impl.ClassImpl )11<br />　　{12<br />　　if( modifiers.contains( &quot;static&quot; ) )13<br />　　{14<br />　　;//Do nothing; this class is compliant.15<br />　　}16<br />　　else17<br />　　{18<br />　　context.reportViolation( (SourceMarker)d, &quot;Violation&quot; );19<strong><br />
</strong><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://alanwu.javaeye.com/blog/173466#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 17:20:49 +0800</pubDate>
        <link>http://alanwu.javaeye.com/blog/173466</link>
        <guid>http://alanwu.javaeye.com/blog/173466</guid>
      </item>
          <item>
        <title>zzInspection/Review Tools, Source/Binary Code Stat</title>
        <author>alanwu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alanwu.javaeye.com">alanwu</a>&nbsp;
                    链接：<a href="http://alanwu.javaeye.com/blog/173198" style="color:red;">http://alanwu.javaeye.com/blog/173198</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.laatuk.com/tools/review_tools.html" target="_blank">http://www.laatuk.com/tools/review_tools.html</a></p><p>&nbsp;</p><p>&nbsp;</p><div class="Section1">

<p class="tableentry"><strong>&nbsp;</strong></p>

<p class="tableentry" align="center" style="text-align: center"><strong>Inspection/Review
Tools, Source/Binary Code Static Analyzers</strong></p>

<p class="tableentry">&nbsp;</p>

<table cellspacing="0" border="1" style="border: medium none ; border-collapse: collapse" cellpadding="0">
 <tbody><tr>
  <td valign="top" style="border: 0.75pt solid windowtext; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry" align="center" style="text-align: center"><strong>Tool name</strong></p>
  </td>
  <td valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 0.75pt 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry" align="center" style="text-align: center"><strong>Platform</strong></p>
  </td>
  <td valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 0.75pt 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry" align="center" style="text-align: center"><strong>Tool vendor</strong></p>
  </td>
  <td valign="top" style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 0.75pt 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry" align="center" style="text-align: center"><strong>Comments</strong></p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://java-source.net/open-source/code-analyzers">Java-Source.org</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">links to Java open source code analysis tools</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.stickyminds.com/tools.asp">StickyMInds</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">links to tool vendors, check Reviews and Measurement
  tools</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.spinroot.com/static">SPIN</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">List static source code analysis tools for C</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.laatuk.com/tools/testing_tools.html">Laatukonsultointi
  - testing tools list</a> </p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Many testing tools provide metrics and can thus
  facilitate inspections/reviews, too</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.laatuk.com/tools/metric_tools.html">Laatukonsultointi
  - metrics tools list</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Some metrics tools facilitate inspections/reviews, too</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">Viva64</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows/add-in for Visual Studio</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.viva64.com/">Viva64</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="MsoNormal">A lint-like tool for searching
  of errors and possible problems in C/C++ code while porting the application
  to the 64-bit platform</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">TICS Solution</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows,  Linux</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.tiobe.com/">TIOBE Software</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="MsoNormal">Consists of 1. checking
  compliance to coding standards by means of code checkers 2. monitoring coding
  standard compliance through time by means of so called quality databases 3. 
  improving programs with the aid of code beautifier</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">Project Analyzer</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.aivosto.com/project/project.html">Aivosto</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="MsoNormal"><span>Static code analysis tool for Visual
  Basic, VB.NET and VBA. Code review, diagramming, document generation and
  generates 180 metrics.</span></p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">FlexeLint for C/C++</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Unix, Mac OS X, VMS</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.gimpel.com/">Gimpel</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">C/C++ source code analyzer</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">PC-Lint for C/C++</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows,  MS-DOS</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.gimpel.com/">Gimpel</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">C/C++ sourcpoe code analyzer</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">PMD</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://pmd.sourceforge.net/">http://pmd.sourceforge.net/</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Java source code analyzer</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">Aubjex</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.alajava.com/aubjex/products.htm#dynamic">Aubjex</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Java source analysis, dynamic analyzer, source code
  formatter, etc.</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">assent</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.tcs.com/0_products/assent/assent_rules.htm#java">Tata
  Consultancy Services</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">C and Java source code analyzer</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">AzoJavaChecker</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Java 2</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.andiz.de/azosystems/en/index.html">Aguntum</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Java source code analyzer</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">CodePro Analytix</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows, Linux</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.instantiations.com/codepro/analytix/default.htm">instantiations</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Java source code analysis  (700+ rules), code metrics,
  test generation, code coverage, dependency analyzer, etc.</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">crucible</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.cenqua.com/crucible/">cenqua</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Tool to facilitate code inspection process</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">QS-Enterprise</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows, Linux, Solaris</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.qa-systems.com/welcome.html">QA
  Systems</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Quality assesment and reporting tool which integrates
  with 3rd party code analysis tools</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">QJ-Pro</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows, Linux, SOlaris</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://qjpro.sourceforge.net/">http://qjpro.sourceforge.net/</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Open source tool for Java source code analysis</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">CodeScanner</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Symbian</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.mobileinnovation.co.uk/developer_tools/codeScanner/index.aspx">Mobile
  Innovation</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Static source code analysis tool</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">SourceAudit</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.frontendart.com/">FrontEndArt Ltd.</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Evaluates compliance to coding standards of C/C++ code</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">JStyle</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.mmsindia.com/">Man Machine Systems</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Java code review tool based on coding guidelines,
  provides also OO metrics</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">Code Analyzer</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">Windows, Unix, Linux, Mac OS X</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://www.appperfect.com/">AppPerfect</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Reviews Java code and enforces coding practices</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">CodeReviewer</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://smartbearsoftware.com/">SmartBear
  Software</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">&rdquo;Automates&rdquo; the peer code review process, supports
  multiple remote reviewers, automated audit trails, SCM integration, and
  custom reviewer checklists</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">Code Reports</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://smartbearsoftware.com/">SmartBear
  Software</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Correlates code changes with bug fixes, feature
  implementations</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tableentry">Code Collaborator</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 112.5pt" width="113">
  <p class="tableentry">&nbsp;</p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 279pt" width="279">
  <p class="tableentry"><a href="http://smartbearsoftware.com/">SmartBear
  Software</a></p>
  </td>
  <td valign="top" style="border-style: none solid solid none; border-color: -moz-use-text-color windowtext windowtext -moz-use-text-color; border-width: medium 0.75pt 0.75pt medium; padding: 0cm 5.4pt; width: 211.5pt" width="212">
  <p class="tableentry">Faclitates code inspection process</p>
  </td>
 </tr>
 <tr>
  <td valign="top" style="border-style: none solid solid; border-color: -moz-use-text-color windowtext windowtext; border-width: medium 0.75pt 0.75pt; padding: 0cm 5.4pt; width: 126.9pt" width="127">
  <p class="tablee