<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>testing ledger</title><link>http://blogs.msdn.com/b/tim_lamey/</link><description>Some ruminations about the process of testing ERP software systems</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>Automation Accuracy</title><link>http://blogs.msdn.com/b/tim_lamey/archive/2010/08/24/automation-accuracy.aspx</link><pubDate>Tue, 24 Aug 2010 18:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10053703</guid><dc:creator>Tim Lamey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/tim_lamey/rsscomments.aspx?WeblogPostID=10053703</wfw:commentRss><comments>http://blogs.msdn.com/b/tim_lamey/archive/2010/08/24/automation-accuracy.aspx#comments</comments><description>&lt;p&gt;&lt;span lang="en-US" style="mso-armenian-font-family: Calibri; mso-hebrew-font-family: Calibri; mso-arabic-font-family: Calibri; mso-thai-font-family: Calibri; language: en-US; mso-ansi-language: en-US; mso-ligatures: none;"&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;To help drive test quality improvements, Dynamics CRM, Dynamics AX, and Dynamics NAV are using a metric that indicates the percentage of all tests that are passing or which fail due to a product issue.&amp;nbsp; This metric is called Automation Accuracy (although Dynamics NAV has used the term Test Reliability, at least to this point).&amp;nbsp; Automation Accuracy has several desirable characteristics, but it is important to understand the limitations of this metric to avoid misuse or misinterpretation.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="en-US" style="mso-armenian-font-family: Calibri; mso-hebrew-font-family: Calibri; mso-arabic-font-family: Calibri; mso-thai-font-family: Calibri; language: en-US; mso-ansi-language: en-US; mso-ligatures: none;"&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="en-US" style="font-family: Calibri; mso-armenian-font-family: Calibri; mso-hebrew-font-family: Calibri; mso-arabic-font-family: Calibri; mso-thai-font-family: Calibri; language: en-US; mso-ansi-language: en-US; mso-ligatures: none;"&gt;&lt;span style="font-family: helvetica;"&gt;In software testing we want tests that are likely to detect product defects when present (high Sensitivity) and which do not result in a large number of false failures (high Specificity; Lamey 2009).&amp;nbsp; It would be nice to be able to measure Sensitivity and Specificity and drive towards high values for each, but we are unable to assign values to these metrics because they suffer from the difficulty of separating True Pass (no issues) from False Pass (undetected product issues).&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="en-US" style="mso-armenian-font-family: Calibri; mso-hebrew-font-family: Calibri; mso-arabic-font-family: Calibri; mso-thai-font-family: Calibri; language: en-US; mso-ansi-language: en-US; mso-ligatures: none;"&gt;&lt;span lang="en-US" style="mso-armenian-font-family: Calibri; mso-hebrew-font-family: Calibri; mso-arabic-font-family: Calibri; mso-thai-font-family: Calibri; language: en-US; mso-ansi-language: en-US; mso-ligatures: none;"&gt;&lt;span lang="en-US" style="mso-armenian-font-family: Calibri; mso-hebrew-font-family: Calibri; mso-arabic-font-family: Calibri; mso-thai-font-family: Calibri; language: en-US; mso-ansi-language: en-US; mso-ligatures: none;"&gt;&lt;span style="font-family: helvetica;"&gt;It is easier to assign a value to Automation Accuracy because it does not differentiate between tests that are passing when there is no product issue and those that do not detect a product issue and pass anyway.&amp;nbsp; As a result, Automation Accuracy is not directly related to either Sensitivity or Specificity.&amp;nbsp; For example, the following diagram depicts the relationship between Automation Accuracy, Sensitivity, Specificity, and Positive Predictive Value when only the percentage of True Pass and False Pass are allowed to vary.&amp;nbsp; Tests with the highest quality should appear in the upper right corner of the diagram (where Sensitivity and Specificity are highest).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="en-US" style="mso-armenian-font-family: Calibri; mso-hebrew-font-family: Calibri; mso-arabic-font-family: Calibri; mso-thai-font-family: Calibri; language: en-US; mso-ansi-language: en-US; mso-ligatures: none;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;img width="550" src="http://blogs.msdn.com/resized-image.ashx/__size/750x476/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-31-48/5025.Untitled1.jpg" style="vertical-align: middle; border: 0px;" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;Notice that while Automation Accuracy and Positive Predictive Value do not vary, Sensitivity and Specificity vary based on the percentage of True Pass results. &amp;nbsp;&amp;nbsp;If high Sensitivity and Specificity are desirable test quality attributes, Automation Accuracy does not help much in the pursuit of these attributes.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;&lt;span style="font-family: helvetica;"&gt;Automation Accuracy can be used as a rough measure of test quality if we assume that the rate of True Passes (pass result correctly indicates there are no product issues) is relatively high.&amp;nbsp; Rigorous test design techniques might help to keep the rate of True Passes high, but we can only verify our assumption by looking at the number of product issues that are discovered in the field and determining if tests should have detected the issue.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;Automation Accuracy is a bit like Code Coverage:&amp;nbsp;&amp;nbsp; high values do not indicate high-quality tests, but low values are a sign&amp;nbsp;of a serious problem.&amp;nbsp; Despite its limitations, Automation Accuracy is a useful measure as it exposes poor test quality and because it is a driver of several desirable behaviors, notably&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;Prompt and complete analysis of failure causes (unanalyzed failures lead to low Automation Accuracy)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;&lt;span style="font-size: small;"&gt;Focused attention on test failures that occur due to non-product causes&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;Recommended Reading&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;Lamey, T.&amp;nbsp; 2009.&amp;nbsp; Test Quality Metrics:&amp;nbsp; Diagnosing the Problem.&amp;nbsp; Testing Ledger, MSDN Blogs:&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://blogs.msdn.com/b/tim_lamey/archive/2009/11/21/test-quality-metrics-diagnosing-the-problem.aspx"&gt;&lt;span style="font-family: trebuchet ms,geneva;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: helvetica;"&gt;http://blogs.msdn.com/b/tim_lamey/archive/2009/11/21/test-quality-metrics-diagnosing-the-problem.aspx&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: helvetica;"&gt;&amp;nbsp;&amp;nbsp;&lt;span lang="en-US" style="mso-armenian-font-family: Calibri; mso-hebrew-font-family: Calibri; mso-arabic-font-family: Calibri; mso-thai-font-family: Calibri; language: en-US; mso-ansi-language: en-US; mso-ligatures: none;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10053703" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Test+Quality/">Test Quality</category><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Testing/">Testing</category></item><item><title>Making Code Coverage Useful</title><link>http://blogs.msdn.com/b/tim_lamey/archive/2010/03/02/making-code-coverage-useful.aspx</link><pubDate>Tue, 02 Mar 2010 11:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9971434</guid><dc:creator>Tim Lamey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/tim_lamey/rsscomments.aspx?WeblogPostID=9971434</wfw:commentRss><comments>http://blogs.msdn.com/b/tim_lamey/archive/2010/03/02/making-code-coverage-useful.aspx#comments</comments><description>&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;&lt;o:p&gt;&lt;span style="font-family: Calibri; font-size: small;"&gt;&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;em&gt;[This is an updated version of a note that was first published to a Microsoft internal blog in November 2008]&lt;o:p&gt;&lt;/o:p&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;i style="mso-bidi-font-style: normal"&gt;&lt;span style="mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;&lt;o:p&gt;&lt;span style="font-family: Calibri; font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;There are many opportunities to misuse code coverage (see Marick 1999 or Lamey 2010).&amp;nbsp; Focusing solely on code coverage numbers can lead to some very bad behaviors, but it does not follow that code coverage does not have the potential to add value.&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Here is a short list of ways to make code coverage a useful part of the software development process.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Additional suggestions for how to get the most from code coverage can be found in Rollison (2009 and 2010).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Identification of Testing Gaps&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Code coverage measures whether a test (or suite of tests) exercises the application code.&amp;nbsp; It does not tell us, at least not directly, how well the application code is tested, only that the code is touched.&lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Code coverage can be used as a tool to help build a better suite of tests by identifying the gaps in the existing testing.&amp;nbsp; Because 0% code coverage is an indication that the test(s) fail to touch a unit of code, 0% code coverage can be used as a quick, coarse-grained way to &amp;ldquo;triage&amp;rdquo; areas that need additional testing effort.&amp;nbsp; The metric can be applied sequentially at multiple levels to identify assemblies, files, classes, or even methods that require additional testing focus.&lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;A refinement of this methodology is to treat any code coverage value less than 100% as an indication of some weakness in the design of the test suite (Marick 1999).&amp;nbsp; The idea goes something like this.&amp;nbsp; For non-zero code coverage values, spend time analyzing the areas that are not covered.&amp;nbsp; Consider what categories of tests are missing or what modifications to existing tests could be included to improve the original test design.&amp;nbsp; Modify the test design, create the tests, and measure code coverage again.&amp;nbsp; Iterate between measuring code coverage and modifying the test design until the desired level of code coverage is achieved.&amp;nbsp; The important point is that the focus should be on improving the test design and not on improving code coverage (Marick 1999).&amp;nbsp; Good test design is correlated with high code coverage values, but high code coverage values do not necessarily imply you have a good set of tests (Lamey 2010).&lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Risk Mitigation&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Assuming the tests do a good job of testing the code they cover, code coverage can help point out areas in the code base where there may still be substantial risk of a fault.&amp;nbsp; Code coverage can be a valuable tool when attempting to decide if a product is ready for release, provided there has been some analysis of the areas that were not covered during testing.&amp;nbsp; As long as the code coverage information is used to understand exactly what code is not covered by testing, then the actual code coverage value is of little significance.&amp;nbsp; Regardless of whether the coverage value is 58% or 92% it is important to identify the portions of the application that are not exercised and to come to some agreement that the lack of coverage in these areas is an acceptable risk.&lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Dead Code Removal&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Analysis of code coverage values that are less that 100% can unearth cases where the application code is unreachable (i.e. dead code).&amp;nbsp; Once the dead code is identified, it can be removed to improve the hygiene of the code base.&amp;nbsp; This is another case where the benefit comes from striving to fully understand the reasons for incomplete code coverage and not from the actual code coverage number.&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Testability &lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Product code that is difficult to reach with tests may represent a testability problem.&amp;nbsp; Systems that are testable are likely to the associated with high code coverage values, so code coverage can provide an indirect indicator of the level of testability in the product.&amp;nbsp; Again, it is the analysis of the code that is not covered that provides the insight into the testability or lack of testability of the application, not the actual code coverage number.&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Test Case Selection&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;Code coverage information can be cross referenced with code changes to the application to select the test cases that, because they exercise the affected code, are the best choice to run to detect regressions.&amp;nbsp; Use of code coverage to select a set of tests maximizes the chances of detecting an error as the result of a particular product code change while reducing the need to run all possible tests.&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Test Case Prioritization&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;In some cases, execution of a subset of tests may not be an option (e.g. perhaps because of legal or contractual requirements), but it may still be of value to know which tests are most likely to detect problems so they could be executed first.&amp;nbsp; Code coverage information can used as a heuristic for prioritizing the order in which tests are run to improve the rate of fault detection early in a regression run (Elbaum et al. 2002).&amp;nbsp; These prioritization techniques improve the odds that regression testing will provide valuable early feedback even in cases where for other reason, it is still necessary to run all tests.&lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;In summary, code coverage numbers in and of themselves are of little value.&amp;nbsp; With the exception of using code coverage in test case selection or test case prioritization, code coverage information only adds value to the software development process when the organization is committed to analyzing the implications of code coverage values that are less than 100%.&amp;nbsp; Failure to reach 100% coverage may be indicative of one or more of the following:&amp;nbsp; poor test design, limited testability support, the presence of dead code, and exposure to undiscovered faults.&amp;nbsp; Understanding which issue underlies the observed code coverage number is only possible after spending time analyzing the portions of the product code that are not covered. &lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; VERTICAL-ALIGN: top"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Recommended Reading&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Calibri;"&gt;&lt;b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;
&lt;p class="MsoNormal" style="text-indent: -0.5in; margin: 0in 0in 6pt 0.5in; padding-left: 30px; vertical-align: top;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;Elbaum, S.,&amp;nbsp; Malishevsky, A., and G. Rothermel.&amp;nbsp; 2002.&amp;nbsp; Test Case Prioritization:&amp;nbsp; A Family of Empirical Studies.&amp;nbsp;&lt;i&gt;IEEE Transactions on Software Engineering&lt;/i&gt;, 28-2:159-182.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.cse.unl.edu/~elbaum/papers/journals/tse01.pdf"&gt;&lt;span style="COLOR: blue; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;http://www.cse.unl.edu/~elbaum/papers/journals/tse01.pdf&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: -0.5in; margin: 0in 0in 6pt 0.5in; padding-left: 30px; vertical-align: top;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;Kaner, C.&amp;nbsp; 1996.&amp;nbsp; Software negligence and testing coverage.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.kaner.com/coverage.htm"&gt;&lt;span style="COLOR: blue; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;http://www.kaner.com/coverage.htm&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: -0.5in; margin: 0in 0in 6pt 0.5in; padding-left: 30px; vertical-align: top;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Lamey, T.C.&amp;nbsp; 2010.&amp;nbsp; Don&amp;rsquo;t be seduced by numbers.&amp;nbsp; Testing Ledger b&lt;/span&gt;&lt;span lang="DE" style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA; mso-ansi-language: DE"&gt;log post:&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;a href="http://blogs.msdn.com/tim_lamey/archive/2010/02/08/don-t-be-seduced-by-numbers.aspx"&gt;&lt;span lang="DE" style="COLOR: blue; mso-bidi-font-family: Arial; mso-ansi-language: DE"&gt;http://blogs.msdn.com/tim_lamey/archive/2010/02/08/don-t-be-seduced-by-numbers.aspx&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="DA" style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-language: AR-SA; mso-fareast-language: JA; mso-ansi-language: DA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: -0.5in; margin: 0in 0in 6pt 0.5in; padding-left: 30px; vertical-align: top;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;&lt;span style="font-size: small;"&gt;Marick, B.&amp;nbsp; 1999.&amp;nbsp; How to misuse code coverage.&amp;nbsp; International Conference and Exposition on Testing Computer Software.&amp;nbsp; &lt;/span&gt;&lt;a href="http://www.exampler.com/testing-com/writings/coverage.pdf"&gt;&lt;span style="COLOR: black; TEXT-DECORATION: none; text-underline: none"&gt;&lt;span style="font-size: small;"&gt;http://www.exampler.com/testing-com/writings/coverage.pdf&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;
&lt;p class="MsoNormal" style="text-indent: -0.5in; margin: 0in 0in 6pt 0.5in; padding-left: 30px; vertical-align: top;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Rollison, Bj.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;2009.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Reconsidering code coverage.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="DA" style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA; mso-ansi-language: DA"&gt;I.M. Testy blog post:&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span lang="DE" style="COLOR: blue; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA; mso-ansi-language: DE"&gt;&lt;a href="http://www.testingmentor.com/imtesty/2009/11/25/reconsidering-code-coverage/"&gt;&lt;span style="COLOR: blue"&gt;http://www.testingmentor.com/imtesty/2009/11/25/reconsidering-code-coverage/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="DA" style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA; mso-ansi-language: DA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-indent: -0.5in; margin: 0in 0in 6pt 0.5in; padding-left: 30px; vertical-align: top;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA"&gt;Rollison, Bj.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;2010.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Code coverage: more than just a number.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang="DA" style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA; mso-ansi-language: DA"&gt;I.M. Testy blog post:&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span lang="DE" style="COLOR: blue; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA; mso-ansi-language: DE"&gt;&lt;a href="http://www.testingmentor.com/imtesty/2010/01/21/code-coverage-more-than-just-a-number/"&gt;&lt;span style="COLOR: blue"&gt;http://www.testingmentor.com/imtesty/2010/01/21/code-coverage-more-than-just-a-number/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="DA" style="COLOR: black; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: Arial; mso-bidi-language: AR-SA; mso-fareast-language: JA; mso-ansi-language: DA"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9971434" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Test+Quality/">Test Quality</category><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Testing/">Testing</category><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Code+Coverage/">Code Coverage</category></item><item><title>Don’t Be Seduced By Numbers</title><link>http://blogs.msdn.com/b/tim_lamey/archive/2010/02/08/don-t-be-seduced-by-numbers.aspx</link><pubDate>Mon, 08 Feb 2010 08:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9959613</guid><dc:creator>Tim Lamey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/tim_lamey/rsscomments.aspx?WeblogPostID=9959613</wfw:commentRss><comments>http://blogs.msdn.com/b/tim_lamey/archive/2010/02/08/don-t-be-seduced-by-numbers.aspx#comments</comments><description>&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;FONT size=3&gt;&lt;EM&gt;[This note was first published to a Microsoft internal blog in October 2008]&lt;/EM&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;FONT size=3&gt;It is common to include code coverage goals as key criteria for deciding if is time to exit various milestones in the software development cycle.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;This suggests that code coverage numbers must be providing value; why else would so many teams use them?&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;There appear to be three reasons that code coverage metrics are used as exit criteria:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;FONT size=3&gt;Code coverage is relatively easy to measure and provides a quantitative value that can be compared against some numeric criteria to determine success or failure.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;FONT size=3&gt;Code coverage is an indication of the quality of the test suite and/or testing efforts.&lt;/FONT&gt;&lt;/FONT&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;There is an underlying assumption that code coverage is correlated in some tangible way with product quality.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;(That is, teams use code coverage as a surrogate for the admittedly harder to measure product quality.)&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Management likes an unambiguous way to make decisions, and code coverage numbers seem to provide exactly the type of hard data that is useful for making a critical ship/no ship decision.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;However, don’t be seduced by code coverage numbers.&lt;/B&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The numbers must be used with extreme caution as low code coverage values are associated with low quality test suites, but higher code coverage values do not automatically imply a test suite is of high quality.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;And the relationship between code coverage and product quality is rarely, if ever validated.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Failing to validate the relationship between code coverage and product quality renders code coverage numbers effectively useless as a measure of product quality.&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Only very low code coverage values (at or near 0%) have any meaning without additional investigation: &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;these values are a clear indication that the test suite is woefully inadequate.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Larger values for code coverage, including 100% coverage, require additional investigation in order to make a useful interpretation of the value.&amp;nbsp; Code coverage measures quality of the test site along a single dimension:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;how much of the product code is exercised.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;It does not measure product quality.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Product quality is how well the software meets the user’s needs and expectations.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;For the sake of illustration, imagine that product quality can be evaluated and assigned a numeric value from 0 to 100 (worst to best, respectively). &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;Consider two extreme cases.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In one case, the tests fully exercise product code and verify that the code works as specified, but the product was improperly specified and does not fulfill any of the end user expectations (coverage is 100% and quality is 0).&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In the other case, the product does exactly what the customer wants it to do, but the tests are poorly designed and exercise none of the product code (coverage is 0% and quality is 100).&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;We do not have a clear understanding of the relationship between code coverage and product quality.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;If the two are correlated at all, there is no reason to assume the relationship is linear or that it is consistent from one portion of the product to another (without incorrectly assuming that all teams and developers produce code of similar quality and complexity and that all test teams are equally adept at creating tests that provide the same coverage per code complexity).&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;There are just too many variables to provide confidence in the numbers. &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt" class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0cm 0cm 0pt; VERTICAL-ALIGN: top" class=MsoNormal&gt;&lt;SPAN style="COLOR: black; FONT-SIZE: 12pt; mso-ascii-font-family: Calibri; mso-fareast-font-family: 'Times New Roman'; mso-hansi-font-family: Calibri; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;FONT face=Calibri&gt;If code coverage cannot be effectively used as a surrogate for product quality and only correlates with test suite quality at low coverage values, then when does it add value?&amp;nbsp; Next time I will discuss some of the scenarios where code coverage is a useful tool in the software development process.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9959613" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Test+Quality/">Test Quality</category><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Code+Coverage/">Code Coverage</category></item><item><title>Test Automation as a Product</title><link>http://blogs.msdn.com/b/tim_lamey/archive/2010/01/25/test-automation-as-a-product.aspx</link><pubDate>Mon, 25 Jan 2010 07:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9952817</guid><dc:creator>Tim Lamey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/tim_lamey/rsscomments.aspx?WeblogPostID=9952817</wfw:commentRss><comments>http://blogs.msdn.com/b/tim_lamey/archive/2010/01/25/test-automation-as-a-product.aspx#comments</comments><description>&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;FONT size=3&gt;Treating test automation as a product changes the way we design and implement test code and helps to ensure that the tests provide cost-effective feedback for their entire lifespan.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The time a test spends being used for the verification of new functionality is relatively short, but the same tests must continue to run for many years as a guard against regressions during the creation of service packs for a released version of the software or during development of newer versions.&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;FONT size=3&gt;While it is essential to not lose sight of the importance of the software that is being tested, considering “test automation as a product” provides some interesting additional perspective on what constitutes good test automation.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Some of the implications are: &lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;The product should be easy to use.&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&amp;nbsp; For tests, that implies they should have ‘push button’ execution in a variety of ways.&amp;nbsp; Results should be reported consistently, should be easy to access and understand.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=3&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;The product should be reliable&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;.&amp;nbsp; For tests, the results should not include intermittent failures.&amp;nbsp; False failures should be minimized and false positives should never happen.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=3&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;The product should perform well&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;.&amp;nbsp; Tests provide feedback on the state of the software that is being developed.&amp;nbsp; The speed with&amp;nbsp;which this feedback is provided is important.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=3&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;The product should be easy to maintain&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;.&amp;nbsp; In the case of test hand-off and re-use, source code is provided and needs to be maintained and extended.&amp;nbsp; This is a huge requirement for the test automation product.&amp;nbsp; To be easily maintained, the code must be well designed, use consistent underlying test frameworks, and be implemented with quality engineering standards.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT size=3&gt;&lt;B style="mso-bidi-font-weight: normal"&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;The product should be developed using state of the art software engineering practices&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;.&amp;nbsp; Tests should go through design and code reviews and have supporting documentation.&amp;nbsp; Test frameworks should go through design and code reviews, include unit tests, be subject to rigorous pre-check-in verification, and must include a set of user documentation.&amp;nbsp; &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style="MARGIN: 0in 0in 0pt 21pt" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;FONT size=3&gt;Attention to crafting the test automation product involves more than just sound engineering.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;There should be a conscious effort to limit the portfolio of frameworks and libraries used in test development.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;In many cases, ownership of tests is transferred to other teams for long-term support of the released software.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;The down-stream teams are often smaller than the development teams and cannot afford the extra effort that is required to understand and maintain tests running on a diverse set of test tools.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; When&amp;nbsp;&lt;/SPAN&gt;confronted with the choice of creating a new test framework or test library, think hard about the users of the automation product you are creating.&amp;nbsp; Do they benefit from the new tools or is it just creating an additional barrier to the uptake and long-term maintenance of these tests?&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;B&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;Recommended Reading&lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT size=3&gt;&lt;B&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;FONT size=3&gt;Page, A., Johnston, K. and Bj Rollison.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;2009.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;How we test software at Microsoft.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Microsoft Press, Redmond, WA.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-latin"&gt;&lt;o:p&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9952817" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Test+Quality/">Test Quality</category><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Testing/">Testing</category></item><item><title>Test Quality Metrics:  Diagnosing the Problem</title><link>http://blogs.msdn.com/b/tim_lamey/archive/2009/11/21/test-quality-metrics-diagnosing-the-problem.aspx</link><pubDate>Sat, 21 Nov 2009 02:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9924166</guid><dc:creator>Tim Lamey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/tim_lamey/rsscomments.aspx?WeblogPostID=9924166</wfw:commentRss><comments>http://blogs.msdn.com/b/tim_lamey/archive/2009/11/21/test-quality-metrics-diagnosing-the-problem.aspx#comments</comments><description>&lt;SPAN style="FONT-FAMILY: 'times new roman', 'serif'; COLOR: #4c4c4c; FONT-SIZE: 12pt"&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&lt;SPAN id=ms-rterangecursor-start&gt;&lt;/SPAN&gt;A key attribute of test quality is that the tests must be effective, that is, there must be a high probability that they will detect defects in the product.&amp;nbsp; Conceptually this is simple, but it is more difficult to come up with simple metrics that can be used to determine how effective existing tests are or if we are making progress in attempts to drive process improvements based on test effectiveness.&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'tahoma', 'sans-serif'; FONT-SIZE: 13.5pt"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN style="FONT-FAMILY: 'tahoma', 'sans-serif'; FONT-SIZE: 13.5pt"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;The fields of epidemiology and medical diagnostics use some simple quantitative measures (sensitivity, specificity, and positive predictive value) in discussions of how good diagnostic procedures are at detecting the presence of disease (see University of Iowa, Department of Pathology 2007 for additional details).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000 face=Calibri&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;In medical diagnostics, sensitivity is the percentage of patients with the disease that are correctly identified as having the disease.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Specificity is&lt;/SPAN&gt; the &lt;SPAN&gt;percentage of patients that do not have the disease that are correctly identified as not having the disease.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Positive Predictive Value (PPV) is the percentage of patients correctly identified as having the disease among all individuals identified as having the disease.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;In medical terms, good diagnostic tests have high sensitivity, specificity, and positive predictive value.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000 face=Calibri&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;Parallels can be drawn between medical tests for the diagnosis of disease and software testing for the diagnosis of product defects.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Conceptually, sensitivity and specificity should translate well to software testing as we want tests that are likely to detect product defects when present (high sensitivity) and which do not result in a large number of false failures (high specificity).&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN id=ms-rterangecursor-start&gt;&lt;/SPAN&gt;The matrix of the possible software test outcomes is:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&lt;SPAN id=ms-rterangecursor-end&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;
&lt;TABLE style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; MARGIN: auto auto auto 0.5in; WIDTH: 322.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid" class=MsoNormalTable border=1 cellSpacing=1 cellPadding=0 width=430 class="MsoNormalTable"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 96.7pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=129&gt;&lt;FONT face=Calibri&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 223.7pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=298 colSpan=2&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;&lt;STRONG&gt;Test Result&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 96.7pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=129&gt;&lt;FONT face=Calibri&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 111.45pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=149&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;&lt;STRONG&gt;Fail&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 111.55pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=149&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;&lt;STRONG&gt;Pass&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 96.7pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=129&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;&lt;STRONG&gt;Product Issue&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 111.45pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=149&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;True Fail (TF)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 111.55pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=149&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;False Pass (FP)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 96.7pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=129&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;&lt;STRONG&gt;No Product Issue&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 111.45pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=149&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;False Fail (FF)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 1.5pt; BACKGROUND-COLOR: transparent; PADDING-LEFT: 1.5pt; WIDTH: 111.55pt; PADDING-RIGHT: 1.5pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 1.5pt" vAlign=top width=149&gt;
&lt;P style="TEXT-ALIGN: center; MARGIN: 0in 0in 0pt" class=MsoNormal align=center&gt;&lt;SPAN&gt;&lt;FONT face=Calibri&gt;True Pass (TP)&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;The formulae for the relevant metrics are:&amp;nbsp;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;B&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Sensitivity&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN&gt;=&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;I&gt;&lt;SPAN&gt;(TF / (TF + FP)) * 100 &lt;/SPAN&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;B&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Specificity&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN&gt;=&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;I&gt;(TP / (FF + TP)) * 100 &lt;/I&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;B&gt;&lt;SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;Positive Predictive Value&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN&gt;=&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;I&gt;(TF / (FF + TF)) * 100&lt;/I&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000 face=Calibri&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;However, calculation of accurate values for sensitivity and specificity are near impossible in software testing because there is no “golden standard test” that can be used as the reference to distinguish between tests that pass because nothing is wrong with the product &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;(True Pass) and tests that pass but do not detect a defect when present (False Pass).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;(In this case, sensitivity can be described as the percentage of tests that detect a product issue among all tests that &lt;B&gt;could have&lt;/B&gt; detected a product issue.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;The practical problem is determining how many tests could have detected a problem.) &lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;FONT face=Calibri&gt;Positive predictive value (PPV) is relatively easy to calculate for software testing (as long as we have good data on the root cause of test failures).&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Test quality improvement efforts should track PPV and should include activities designed to improve the metric over time.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Any activities which reduce the number of false failures will help to drive up PPV, and while it cannot be measured directly, an increase in PPV will tend to be correlated with an increase in testing specificity.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Reducing the number of false failures makes it easier to quickly and accurately diagnose when the product contains a defect.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt; BACKGROUND: white" class=MsoNormal&gt;&lt;SPAN&gt;&lt;FONT color=#000000 face=Calibri&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;B&gt;&lt;SPAN style="COLOR: #4c4c4c; FONT-SIZE: 12pt"&gt;Recommended Reading&lt;/SPAN&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0in 0in 0pt" class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;SPAN&gt;&lt;SPAN id=ms-rterangecursor-start&gt;&lt;/SPAN&gt;University of Iowa, Department of Pathology. 2007.&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;Online Laboratory Services Handbook (Appendix).&amp;nbsp; &lt;A href="http://www.medicine.uiowa.edu/path_handbook/Appendix/Chem/pred_value_theory.html" target=_blank mce_href="http://www.medicine.uiowa.edu/path_handbook/Appendix/Chem/pred_value_theory.html"&gt;&lt;FONT face=Calibri&gt;&lt;SPAN id=ms-rterangecursor-start&gt;&lt;/SPAN&gt;http://www.medicine.uiowa.edu/path_handbook/Appendix/Chem/pred_value_theory.html&lt;SPAN id=ms-rterangecursor-end&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9924166" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Test+Quality/">Test Quality</category><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Testing/">Testing</category></item><item><title>Testing Efficiency and Effectiveness</title><link>http://blogs.msdn.com/b/tim_lamey/archive/2009/11/16/testing-efficiency-and-effectiveness.aspx</link><pubDate>Mon, 16 Nov 2009 13:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9922925</guid><dc:creator>Tim Lamey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/tim_lamey/rsscomments.aspx?WeblogPostID=9922925</wfw:commentRss><comments>http://blogs.msdn.com/b/tim_lamey/archive/2009/11/16/testing-efficiency-and-effectiveness.aspx#comments</comments><description>&lt;P&gt;&lt;FONT size=3 face=Calibri&gt;Efficiency was a recurring sub-theme at the Ørdev software conference in Malmö, appearing explicitly in at least five of the presentation titles.&amp;nbsp; However, most of the speakers were quick to point out that efficiency has little meaning without a focus on effectiveness.&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=3 face=Calibri&gt;Scott Hanselman (&lt;A href="http://www.hanselman.com/blog/" target=_blank mce_href="http://www.hanselman.com/blog/"&gt;http://www.hanselman.com/blog/&lt;/A&gt;) &lt;/FONT&gt;&lt;FONT size=3 face=Calibri&gt;made the point most clearly in his keynote “Information Overload and Managing the Flow:” &lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size=3 face=Calibri&gt;Efficiency is doing something right&lt;/FONT&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;FONT size=3 face=Calibri&gt;Effectiveness is doing the right thing&lt;/FONT&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT size=3 face=Calibri&gt;This point is very relevant to software testing efforts.&amp;nbsp; W&lt;/FONT&gt;&lt;FONT size=3 face=Calibri&gt;e want our software testing efforts to be as efficient as possible, but because we&lt;/FONT&gt;&lt;FONT size=3 face=Calibri&gt; always face more potential tests than can be created and executed in the time that is allotted, it is important that we focus on testing activities that are the most effective.&amp;nbsp; It doesn’t do the users much good if we are very efficient at doing the wrong types of testing.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3 face=Calibri&gt;Efficiency is often an important consideration because management would like to maximize the return on invest (ROI) for the testing efforts.&amp;nbsp; The premise is that being able to complete the planned testing faster or for less effort will have a positive impact on ROI.&amp;nbsp; This makes sense, but it is still a good idea to ask the question,&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=3 face=Calibri&gt;&lt;EM&gt;“Is this the best way to test?”&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=3 face=Calibri&gt;as improving the effectiveness of the testing is likely to have a larger impact on ROI than performing the existing testing as efficiently as possible.&lt;/FONT&gt;&lt;FONT size=3 face=Calibri&gt;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=3 face=Calibri&gt;&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3 face=Calibri&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3 face=Calibri&gt;&lt;FONT size=3 face=Calibri&gt;Qualitatively, effective testing activities are those that maximize the opportunity to discover problems with the software under test.&amp;nbsp; However, the effectiveness of testing is difficult to evaluate quantitatively.&amp;nbsp; &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=3 face=Calibri&gt;In future posts, I will consider quantitative metrics for test effectiveness and and touch a little more on test efficiency.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3 face=Calibri&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9922925" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Test+Quality/">Test Quality</category><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Testing/">Testing</category></item><item><title>Cucumber = plain text + Ruby</title><link>http://blogs.msdn.com/b/tim_lamey/archive/2009/11/11/cucumber-plain-text-ruby.aspx</link><pubDate>Wed, 11 Nov 2009 08:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9920672</guid><dc:creator>Tim Lamey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/tim_lamey/rsscomments.aspx?WeblogPostID=9920672</wfw:commentRss><comments>http://blogs.msdn.com/b/tim_lamey/archive/2009/11/11/cucumber-plain-text-ruby.aspx#comments</comments><description>&lt;P ms-rteFontSize-3?&gt;The Agile software development track during the Ørdev conference in Malmö last week included several sessions on Behavior Driven Development (BDD). This development methodology is one of the latest of the "driven development" paradigms and is positioned by its proponents as the evolution of Test Driven Development (TDD). &lt;/P&gt;
&lt;P ms-rteFontSize-3? mce_keep="true"&gt;Like TDD, BDD permits developers to focus on what the code should do, rather than on the technical details of the implementation. And like TDD, BDD retains the process of first writing code that encapsulates "stories" used to validate the system under development before writing the code for the system itself. Code for the system is then written such that the executable validation stories pass. The development rhythm consists of alternating between adding validation stories and writing the code to support those stories. &lt;/P&gt;
&lt;P ms-rteFontSize-3? mce_keep="true"&gt;BDD asserts that the activity of writing the validation first has very little to do with testing and thus it is unfortunate that TDD semantically places such emphasis on "test" (North 2006). The focus in BDD is on describing how the system should behave in a language (either native language or a ubiquitous domain-specific language) that is easily shared with, and understood by, the stakeholders, rather than being semantically bound by the language of "testing."&lt;/P&gt;
&lt;P ms-rteFontSize-3? mce_keep="true"&gt;One of the more interesting presentations, which ironically was part of the Test track, was by Aslak Hellesøy, the creator of Cucumber (&lt;A title=http://cukes.info/ href="http://cukes.info/" target=_blank mce_href="http://cukes.info/"&gt;http://cukes.info/&lt;/A&gt;), a tool for combining plain text descriptions of how a system should behave with step definitions written in Ruby (or a number of other languages, including .NET languages). The presentation was a combination of an introduction to BDD, some coding using Cucumber and Ruby, and a live cooking show. How many software development presentations have you been to that included a cucumber, ginger, a little basil, and a blender?&amp;nbsp; I left hungry for test code that is an easily readable description of the intent of the test rather than a reflection of the implementation details of the application or semantics of the test frameworks that were used. &lt;/P&gt;
&lt;P ms-rteFontSize-3? mce_keep="true"&gt;&lt;STRONG&gt;Recomended Reading&lt;/STRONG&gt;&lt;/P&gt;
&lt;P ms-rteFontSize-3? mce_keep="true"&gt;Astels, D.&amp;nbsp; 2009.&amp;nbsp; Introduction to BDD with Cucumber.&amp;nbsp; Engine Yard (23 June 2009).&amp;nbsp; &amp;nbsp;&lt;A title=http://www.engineyard.com/blog/2009/cucumber-introduction/ href="http://www.engineyard.com/blog/2009/cucumber-introduction/" target=_blank mce_href="http://www.engineyard.com/blog/2009/cucumber-introduction/"&gt;http://www.engineyard.com/blog/2009/cucumber-introduction/&lt;/A&gt; &lt;/P&gt;
&lt;P ms-rteFontSize-3? mce_keep="true"&gt;North, D. 2006.&amp;nbsp; Introducinng BDD.&amp;nbsp; &lt;A title=http://dannorth.net/introducing-bdd href="http://dannorth.net/introducing-bdd" target=_blank mce_href="http://dannorth.net/introducing-bdd"&gt;http://dannorth.net/introducing-bdd&lt;/A&gt;&amp;nbsp; &lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9920672" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Agile/">Agile</category></item><item><title>Welcome</title><link>http://blogs.msdn.com/b/tim_lamey/archive/2009/11/10/welcome.aspx</link><pubDate>Tue, 10 Nov 2009 23:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9920497</guid><dc:creator>Tim Lamey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/tim_lamey/rsscomments.aspx?WeblogPostID=9920497</wfw:commentRss><comments>http://blogs.msdn.com/b/tim_lamey/archive/2009/11/10/welcome.aspx#comments</comments><description>&lt;P&gt;I am finally taking&amp;nbsp;the plunge and starting&amp;nbsp;an external blog on software testing.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;My views on software testing have been acquired on the job during&amp;nbsp;13 years of&amp;nbsp;helping to test&amp;nbsp;a number of ERP (Enterprise Resource Planning) systems in the Microsoft Dynamics family of products.&amp;nbsp; I have worked on Dynamics GP, Dynamics AX, and am now working on Dynamics NAV.&amp;nbsp; I was also&amp;nbsp;involved with several projects exploring the possibilities of creating a new framework for building ERP applications.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;While the emphasis of this blog will be on issues, techniques, and practices that are common to testing ERP systems, many of the lessons learned will be generally applicable to testing any large, complex software system.&amp;nbsp; &lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9920497" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/tim_lamey/archive/tags/Testing/">Testing</category></item></channel></rss>