<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.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>Paulo Morgado : Debugging</title><link>http://msmvps.com/blogs/paulomorgado/archive/tags/Debugging/default.aspx</link><description>Tags: Debugging</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Improving Debugging And Testing Through Assertions</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/12/03/improving-debugging-and-testing-through-assertions.aspx</link><pubDate>Wed, 03 Dec 2008 02:56:52 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1655603</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1655603</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1655603</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/12/03/improving-debugging-and-testing-through-assertions.aspx#comments</comments><description>&lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Reading through the &lt;a title="The Typemock Insider" target="_blank" href="http://blog.typemock.com/"&gt;The Typemock Insider&lt;/a&gt; blog, I came across &lt;a title="Can Debugging Be Improved?" target="_blank" href="http://blog.typemock.com/2008/11/can-debugging-be-improved.html"&gt;this post&lt;/a&gt; from &lt;a title="Gil Zilberfeld" target="_blank" href="http://www.blogger.com/profile/18210181375618736629"&gt;Gil Zilberfeld&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;I myself tend to fall in Gil’s practice (&amp;quot;binary search&amp;quot; debugging), but I don’t think &lt;a title="Kent Beck" target="_blank" href="http://threeriversinstitute.org/Kent%20Beck.htm"&gt;Kent Beck&lt;/a&gt; has the right &lt;a title="Hit &amp;#39;em High, Hit &amp;#39;em Low" target="_blank" href="http://www.threeriversinstitute.org/HitEmHighHitEmLow.html"&gt;solution&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Gil’s suggestion of using &lt;a title="Typemock Isolator - Serious Development" target="_blank" href="http://www.typemock.com/Product.html"&gt;Isolator&lt;/a&gt; is tempting (I don’t miss an opportunity to use it), but still not my favorite one.&lt;/p&gt; &lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;I prefer to use &lt;a title="Assertions in Managed Code" target="_blank" href="http://msdn.microsoft.com/library/70ab2522-6486-4076-a1a9-e0f11cd0f3a1.aspx"&gt;debug assertions&lt;/a&gt;. Debug assertions can be used when running a debug version of the application to pop-up assertion messages and when running unit tests to fail tests.&lt;/p&gt; &lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;In order to use debug assertions in unit tests a “special” &lt;a title="Trace Listeners" target="_blank" href="http://msdn.microsoft.com/library/444b0d33-67ea-4c36-9e94-79c50f839025.aspx"&gt;trace listener&lt;/a&gt; is needed to make the test fail when its &lt;a title="TraceListener..::.Fail Method" target="_blank" href="http://msdn.microsoft.com/library/66a83512-a8fa-c745-bb43-a94518148fa4.aspx"&gt;Fail method&lt;/a&gt; is called.&lt;/p&gt; &lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UnitTestTraceListener &lt;/span&gt;: &lt;span style="color:blue;"&gt;global&lt;/span&gt;::System.Diagnostics.&lt;span style="color:#2b91af;"&gt;DefaultTraceListener
&lt;/span&gt;{
     &lt;span style="color:blue;"&gt;public &lt;/span&gt;UnitTestTraceListener() : &lt;span style="color:blue;"&gt;base&lt;/span&gt;()
    {
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Name = &lt;span style="color:#a31515;"&gt;&amp;quot;UnitTest&amp;quot;&lt;/span&gt;;
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.AssertUiEnabled = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;
    }

    &lt;span style="color:blue;"&gt;public override void &lt;/span&gt;Fail(&lt;span style="color:blue;"&gt;string &lt;/span&gt;message, &lt;span style="color:blue;"&gt;string &lt;/span&gt;detailMessage)
    {
        Microsoft.VisualStudio.TestTools.UnitTesting.&lt;span style="color:#2b91af;"&gt;Assert&lt;/span&gt;.Fail(&lt;span style="color:#a31515;"&gt;&amp;quot;Debug.Assert Failed: &amp;quot; &lt;/span&gt;+ message + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ detailMessage);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Now, all you need to do is register it.&lt;/p&gt;
&lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Registering the trace listener can either be done in code:&lt;/p&gt;
&lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.Listeners.Remove(&lt;span style="color:#a31515;"&gt;&amp;quot;Default&amp;quot;&lt;/span&gt;);
System.Diagnostics.&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.Listeners.Add(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;UnitTestTraceListener&lt;/span&gt;());&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;or configuration:&lt;/p&gt;
&lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;&amp;quot; &lt;span style="color:blue;"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.diagnostics&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assert &lt;/span&gt;&lt;span style="color:red;"&gt;assertuienabled&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;trace&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;listeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;clear&lt;/span&gt;&lt;span style="color:blue;"&gt;/&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UnitTest&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;UnitTestTraceListener&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;/&amp;gt;
      &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;listeners&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;trace&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.diagnostics&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;And if I’m using Isolator I have the take in account the accesses made in the call to the Assert method. More fun to me.&lt;/p&gt;
&lt;a href="http://PauloMorgad.NET/"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1655603" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Debugging/default.aspx">Debugging</category></item></channel></rss>