<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>Tellingmachine</title>
    <description>Vom Hundertsten ins Tausendste</description>
    <link>http://tellingmachine.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.6.1.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://tellingmachine.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.tellingmachine.com/syndication.axd</blogChannel:blink>
    <dc:creator>Klaus Graefensteiner</dc:creator>
    <dc:title>Tellingmachine</dc:title>
    <geo:lat>33.612740</geo:lat>
    <geo:long>117.656000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Momaraderie" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="momaraderie" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Learning IOS Development the Doer way</title>
      <description>&lt;p&gt;Learning IOS has a challenging learning curve, but luckily there all kinds of resources that will make the climb to the summit joyous. This blog post is my favorite collection of these resources.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/Learning-IOS-Development_CB55/photo.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="photo" border="0" alt="photo" src="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/Learning-IOS-Development_CB55/photo_thumb.png" width="484" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figure 1: Getting things moving&lt;/strong&gt;&lt;/p&gt;  &lt;h1&gt;Go shopping&lt;/h1&gt;  &lt;ol&gt;   &lt;li&gt;Go to the Apple Store and buy an &lt;a href="http://www.apple.com/imac/"&gt;iMac&lt;/a&gt;, an &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; and an &lt;a href="http://www.apple.com/ipad/"&gt;iPad&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Sign up for the &lt;a href="http://developer.apple.com/programs/ios/"&gt;Apple IOS Developer program&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Sign up for a Micro plan at &lt;a href="https://github.com/plans"&gt;Github&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Download &lt;a href="http://www.stanford.edu/class/cs193p/cgi-bin/drupal/"&gt;CS193P&lt;/a&gt; &lt;a href="http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255"&gt;videos&lt;/a&gt;, &lt;a href="http://www.stanford.edu/class/cs193p/cgi-bin/drupal/"&gt;slides, assignment and sample source&lt;/a&gt; from &lt;a href="http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255"&gt;ITunes U&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Go to &lt;a href="http://www.raywenderlich.com"&gt;RayWenderlich.com&lt;/a&gt; and purchase the &lt;a href="http://www.raywenderlich.com/store/ios-apprentice"&gt;iOS Apprentice tutorial series&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Buy &lt;a href="http://www.adobe.com/products/photoshop.html"&gt;Photoshop CS5&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Buy the &lt;a href="http://www.amazon.com/Tapworthy-Designing-Great-iPhone-Apps/dp/1449381650/ref=sr_1_1?ie=UTF8&amp;amp;qid=1328140749&amp;amp;sr=8-1"&gt;Tapworthy book&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;For game development&lt;/h2&gt;  &lt;ol&gt;   &lt;li&gt;For Game Development purchase the Ray Wenderlich’s &lt;a href="http://www.raywenderlich.com/store/space-game-starter-kit"&gt;Space Game Starter Kit&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Buy the &lt;a href="http://www.amazon.com/Learning-Cocos2D-Hands--Building-Chipmunk/dp/0321735625/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1328140838&amp;amp;sr=1-1"&gt;Cocos 2D&lt;/a&gt; book &lt;!--EndFragment--&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;h1&gt;Free reading&lt;/h1&gt;  &lt;p&gt;To get more read the following Apple Developer Guides &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html"&gt;iOS App Programming Guide&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/MobileHIG/Introduction/Introduction.html"&gt;Human Interface Design Guidelines&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html"&gt;View Controller Programming Guide&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/iPhoneCoreData01/Introduction/Introduction.html"&gt;Core Data Programming Guide&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://itunesconnect.apple.com/docs/iTunesConnect_DeveloperGuide.pdf"&gt;ItunesConnect Developer Guide&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.raywenderlich.com/tutorials"&gt;Ray Wenderlich Tutorials&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;h1&gt;Interesting iOS frameworks&lt;/h1&gt;  &lt;p&gt;These frameworks are covered by the ITunes U iOS lectures.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Accessibility &lt;/li&gt;    &lt;li&gt;Core Data &lt;/li&gt;    &lt;li&gt;Core Location &lt;/li&gt;    &lt;li&gt;Acceleration and Gyroscope &lt;/li&gt;    &lt;li&gt;Camera, sound recorder and media library &lt;/li&gt;    &lt;li&gt;Contacts &lt;/li&gt;    &lt;li&gt;Notification Services &lt;/li&gt;    &lt;li&gt;iCloud &lt;/li&gt;    &lt;li&gt;Game Center &lt;/li&gt; &lt;/ol&gt;  &lt;h1&gt;Interesting iOS apps to dissect&lt;/h1&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://ios.wordpress.org/development/"&gt;WordPress IOS app&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;h1&gt;Interesting 3rd party libraries&lt;/h1&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.eosgarden.com/en/opensource/opencv-ios/overview/"&gt;OpenCV for IOS&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://code.google.com/p/zxing/"&gt;Barcode scanning&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://box2d.org/"&gt;2D Physics Engine&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.cocos2d-iphone.org/"&gt;2D Graphics&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://code.google.com/p/wsdl2objc/"&gt;SOAP Client&lt;/a&gt; (&lt;a href="http://stackoverflow.com/questions/204465/how-to-access-soap-services-from-iphone"&gt;more&lt;/a&gt;)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://developer.neurosky.com/docs/doku.php?id=beta"&gt;NeuroSky ThinkGear SDK&lt;/a&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://bu.mp/apiresources"&gt;Bump API&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://odataobjc.codeplex.com/"&gt;OData&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://redpark.com/c2db9.html"&gt;Redpark Serial Cable SDK&lt;/a&gt;. A kit for the Arduino can be bought from the &lt;a href="http://www.makershed.com/Redpark_Breakout_Pack_for_Arduino_and_iOS_p/msrp02.htm"&gt;MakerShed&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://restkit.org/"&gt;REST client with JSON serializer&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://rentzsch.github.com/mogenerator/"&gt;Mogenerator&lt;/a&gt; Core Data code generator&lt;/li&gt;    &lt;li&gt;&lt;a href="http://code.google.com/p/flot/"&gt;Flot JQuery plotting plugin&lt;/a&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;h1&gt;Make it look and sound pretty&lt;/h1&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://www.pixelresort.com/blog/app-icon-template/"&gt;Photoshop template for iOS App icons&lt;/a&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://glyphish.com/"&gt;Glyphish icons&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Icons from &lt;a href="http://thenounproject.com/"&gt;The Noun Project&lt;/a&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://subtlepatterns.com/"&gt;Textures&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.freesound.org/"&gt;Sounds&lt;/a&gt;&amp;#160;&lt;/li&gt; &lt;/ol&gt;  &lt;h1&gt;Hook up with some Business Intelligence services&lt;/h1&gt;  &lt;ol&gt;   &lt;li&gt;Telemetry with &lt;a href="http://www.flurry.com/"&gt;Flurry&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Game Analytics with &lt;a href="http://playtomic.com/"&gt;Playtomic&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;h1&gt;Ausblick&lt;/h1&gt;  &lt;p&gt;There you go. Have a blast with IPhone app development!&lt;/p&gt;</description>
      <link>http://tellingmachine.com/post/Learning-IOS-Development-the-Doer-way.aspx</link>
      <author>Klaus Graefensteiner</author>
      <comments>http://tellingmachine.com/post/Learning-IOS-Development-the-Doer-way.aspx#comment</comments>
      <guid>http://tellingmachine.com/post.aspx?id=15390993-829f-4417-bb4a-6fa8a8b15c6f</guid>
      <pubDate>Wed, 01 Feb 2012 08:27:56 -1500</pubDate>
      <category>IOS</category>
      <category>Tips &amp; Tricks</category>
      <dc:publisher>Klaus Graefensteiner</dc:publisher>
      <pingback:server>http://tellingmachine.com/pingback.axd</pingback:server>
      <pingback:target>http://tellingmachine.com/post.aspx?id=15390993-829f-4417-bb4a-6fa8a8b15c6f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://tellingmachine.com/trackback.axd?id=15390993-829f-4417-bb4a-6fa8a8b15c6f</trackback:ping>
      <wfw:comment>http://tellingmachine.com/post/Learning-IOS-Development-the-Doer-way.aspx#comment</wfw:comment>
      <wfw:commentRss>http://tellingmachine.com/syndication.axd?post=15390993-829f-4417-bb4a-6fa8a8b15c6f</wfw:commentRss>
    </item>
    <item>
      <title>NUnit Test Start and End Time Logging Add-in</title>
      <description>&lt;h1&gt;Introduction&lt;/h1&gt;  &lt;p&gt;One of the shortcomings of the test results reporting of NUnit is the absence an absolute start and end time timestamp for each individual test execution. That makes it especially difficult to correlate failing tests with events in the test infrastructure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/MillisecondsTestTimestamps_2.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="MillisecondsTestTimestamps" border="0" alt="MillisecondsTestTimestamps" src="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/MillisecondsTestTimestamps_thumb.png" width="608" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figure 1: NUnit test results with start and end time timestamp for each individual test&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Luckily there is an easy way to hook into the NUnit test runner events using a custom Event Listener Addin. This blog post provides the Visual Studio 2010 project and some additional information about my &lt;strong&gt;NUnitTestLogger&lt;/strong&gt; Addin.&lt;/p&gt;  &lt;h1&gt;Reference links&lt;/h1&gt;  &lt;p&gt;Some information about the NUnit Event Listener hooks that I used for this Addin can be found in the &lt;a href="http://nunit.org/index.php?p=eventListeners&amp;amp;r=2.5.5"&gt;NUnit documentation&lt;/a&gt;. A more detailed overview is provided by a blog post that describes the &lt;a href="http://www.simple-talk.com/dotnet/.net-tools/testing-times-ahead-extending-nunit/"&gt;capabilities of the NUnit Addin framework&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;File format&lt;/h1&gt;  &lt;p&gt;I decided to write the additional test timestamp information into CSV files. Each test assembly would get its own file using the following file name format:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[Test assembly build version]_[Test assembly name]_[Test start time]_[Test computer name]_[Number of tests in test assembly].csv&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The following example file name shows the application of this format definition:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;0.1.0.28281_BlogShellTx.UnitTests.dll_20110819234257_LABSTATUS_24.csv&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/image_4.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/image_thumb_1.png" width="644" height="209" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figure 2: CSV file name format&lt;/strong&gt;&lt;/p&gt;  &lt;h1&gt;Addin implementation&lt;/h1&gt;  &lt;p&gt;The following screenshot shows the kind of information the NUnit Event Listener provides.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/image_2.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/image_thumb.png" width="644" height="325" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figure 3: Event Listener hooks capabilities&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Implementing the hooks is fairly easy. The following two cs files demonstrate how I did it :&lt;/p&gt;  &lt;h2&gt;TestRecord.cs&lt;/h2&gt;  &lt;pre class="brush: csharp"&gt;using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Reflection;

namespace NUnitTestLogger
{
    class TestRecord
    {
        public string FullName { get; set; }
        public int ResultState { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }
        public string AssemblyName { get; set; }
        public string ComputerName { get; set; }
        public string BuildVersionNumber { get; set; }
        public DateTime RunDateTime { get; set; }
        public int Count { get; set; }
        public double Time { get; set; }
        

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(FullName);
            sb.Append(&amp;quot;,&amp;quot;);
            sb.Append(StartTime.ToString(&amp;quot;yyyy-MM-dd HH:mm:ss.fff&amp;quot;));
            sb.Append(&amp;quot;,&amp;quot;);
            sb.Append(EndTime.ToString(&amp;quot;yyyy-MM-dd HH:mm:ss.fff&amp;quot;));
            sb.Append(&amp;quot;,&amp;quot;);
            sb.Append(Time.ToString());
            sb.Append(&amp;quot;,&amp;quot;);
            sb.Append(ResultState.ToString());
            return sb.ToString();
        }

        public string GetContainerName()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(BuildVersionNumber);
            sb.Append(&amp;quot;_&amp;quot;);
            sb.Append(AssemblyName);
            sb.Append(&amp;quot;_&amp;quot;);
            sb.Append(RunDateTime.ToString(&amp;quot;yyyyMMddHHmmss&amp;quot;));
            sb.Append(&amp;quot;_&amp;quot;);
            sb.Append(ComputerName);
            sb.Append(&amp;quot;_&amp;quot;);
            sb.Append(Count);

            return sb.ToString();
        }

        internal void StartRun(string name, int testCount)
        {
            RunDateTime = DateTime.UtcNow;
            Count = testCount;
            AssemblyName = GetAssemblyNameFromPath(name);
            BuildVersionNumber = GetAssemblyVersionFromPath(name);
            ComputerName = Environment.MachineName;
        }

        private string GetAssemblyVersionFromPath(string name)
        {
            var assemblies = AppDomain.CurrentDomain.GetAssemblies();
            string assemblyNameFromPath = GetAssemblyNameFromPath(name);
            foreach( Assembly a in assemblies)
            {
                string testAssemblyName = (a.GetName()).Name + &amp;quot;.dll&amp;quot;;
                if (String.Compare(testAssemblyName, assemblyNameFromPath, true) == 0)
                {
                    return a.GetName().Version.ToString();
                }
            }
            return &amp;quot;0.0.0000.0&amp;quot;;
        }

        private string GetAssemblyNameFromPath(string name)
        {
            if (!String.IsNullOrEmpty(name))
            {
                FileInfo fi = new FileInfo(name);
                return fi.Name;
            }
            else
            {
                return &amp;quot;unknown&amp;quot;;
            }
        }

        internal string GetHeader()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(&amp;quot;FullName&amp;quot;);
            sb.Append(&amp;quot;,&amp;quot;);
            sb.Append(&amp;quot;StartTime&amp;quot;);
            sb.Append(&amp;quot;,&amp;quot;);
            sb.Append(&amp;quot;EndTime&amp;quot;);
            sb.Append(&amp;quot;,&amp;quot;);
            sb.Append(&amp;quot;Duration&amp;quot;);
            sb.Append(&amp;quot;,&amp;quot;);
            sb.Append(&amp;quot;ResultState&amp;quot;);
            return sb.ToString();
        }

        internal void StartTest(NUnit.Core.TestName testName)
        {
            StartTime = DateTime.UtcNow;
            FullName = testName.FullName;
        }

        internal void CompleteTest(NUnit.Core.TestResult result)
        {
            EndTime = DateTime.UtcNow;
            Time = result.Time;
            if (result.Executed)
            {
                if (result.IsSuccess)
                {
                    ResultState = 0; //Successfull assertions
                }
                if (result.IsFailure)
                {
                    ResultState = 1; //Failed assertion
                }
                if (result.IsError)
                {
                    ResultState = 2; //Error
                }
            }
            else
            {
                ResultState = -1; //Not run
            }
        }

        internal void CompleteTestWith(Exception exception)
        {
            EndTime = DateTime.UtcNow;
            Time = 0;
            ResultState = 2; //Error
        }
    }
}&lt;/pre&gt;

&lt;h2&gt;EventTracer.cs&lt;/h2&gt;

&lt;pre class="brush: csharp"&gt;using System;
using NUnit.Core.Extensibility;
using NUnit.Core;
using NUnit.Framework;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Collections.Generic;



namespace NUnitTestLogger
{
    [NUnitAddin(Description = &amp;quot;Event Timestamp Logger&amp;quot;)]
    public class EventTimestampLogger : IAddin, EventListener
    {
        public bool Install(IExtensionHost host)
        {
            if (host == null)
                throw new ArgumentNullException(&amp;quot;host&amp;quot;);

            IExtensionPoint listeners = host.GetExtensionPoint(&amp;quot;EventListeners&amp;quot;);
            if (listeners == null)
                return false;

            listeners.Install(this);
            return true;
        }

        TestRecord testRecord = new TestRecord();
        StringBuilder sb = new StringBuilder();


        #region EventListener Members

        public void RunStarted(string name, int testCount)
        {
            testRecord.StartRun(name, testCount);
            string logFileName = GetLogFileName(testRecord);
            LogHeader(logFileName, testRecord);
        }

        public void RunFinished(TestResult result)
        {
            return;
        }

        public void SuiteStarted(TestName testName)
        {
            return;
        }

        public void TestStarted(TestName testName)
        {
            testRecord.StartTest(testName);
        }

        public void TestFinished(TestResult result)
        {
            testRecord.CompleteTest(result);
            string logFileName = GetLogFileName(testRecord);
            LogResult(logFileName, testRecord);
        }

        public void SuiteFinished(TestResult result)
        {
            return;
        }
        
        public void RunFinished(Exception exception)
        {
            testRecord.CompleteTestWith(exception);
            string logFileName = GetLogFileName(testRecord);
            LogResult(logFileName, testRecord);
        }


        private string GetLogFileName(TestRecord testRecord)
        {
            if (testRecord != null)
            {
                string fileName = testRecord.GetContainerName() + &amp;quot;.csv&amp;quot;;
                string filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + &amp;quot;\\&amp;quot; + fileName;
                return filePath;
            }
            else
            {
                return &amp;quot;testresultlog.csv&amp;quot;;
            }
        }

        public void TestOutput(TestOutput testOutput)
        {
            return;
        }

        public void UnhandledException(Exception exception)
        {
            Debug.Write(&amp;quot;UnhandledException &amp;quot; + exception);
        }

        private void LogHeader(string logFileName, TestRecord testRecord)
        {
            string message = testRecord.GetHeader();
            LogMessage(logFileName, message);
        }

        private void LogResult(string logFileName, TestRecord testRecord)
        {
            string message = testRecord.ToString();
            LogMessage(logFileName, message);
        }

        private void LogMessage(string logFileName, string message)
        {
            using (StreamWriter sw = File.AppendText(logFileName))
            {
                    sw.WriteLine(message);
            }
        }
        #endregion
    }
}&lt;/pre&gt;

&lt;h1&gt;Installation&lt;/h1&gt;

&lt;p&gt;The Addin assemblies need to be copied into a folder called “addins”, which is a subfolder of the directory where the test runners like for example nunit.exe are located.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/NUnitAddinLocation_2.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="NUnitAddinLocation" border="0" alt="NUnitAddinLocation" src="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/NUnitAddinLocation_thumb.png" width="644" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure 4: Addin assemblies location&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NUnit will pick up and load the Addin assemblies automatically. The Registered Addins dialog shows which Addins have been loaded. For my assembly to load successfully in NUnit 2.5 it needed to be build for the &lt;strong&gt;x64 processor&lt;/strong&gt; architecture using the .&lt;strong&gt;NET Framework 2.0&lt;/strong&gt; binding. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/NUnit64BitSeeingAddin_2.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="NUnit64BitSeeingAddin" border="0" alt="NUnit64BitSeeingAddin" src="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/NUnit64BitSeeingAddin_thumb.png" width="644" height="467" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure 5: NUnit is loading Addins automatically&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;Download&lt;/h1&gt;

&lt;p&gt;The Visual Studio 2010 project with the built Addin assembly and an example test result CSV file can be downloaded here: &lt;a title="NUnitTestLogger.zip" href="http://tellingmachine.com/file.axd?file=NUnitTestLogger.zip" rel="enclosure"&gt;NUnitTestLogger.zip&lt;/a&gt; &lt;/p&gt;

&lt;h1&gt;Ausblick&lt;/h1&gt;

&lt;p&gt;By the way, have you ever tried to specify a date time format in Excel that displays milliseconds? Here is how you can do it. Select the Custom Category in Format Cells and use the following format specifier: &lt;strong&gt;m/d/yyyy h:mm:ss.000&lt;/strong&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/ExcelCustomDateFormat_2.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ExcelCustomDateFormat" border="0" alt="ExcelCustomDateFormat" src="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/NUnit-Test-Start-and-End-Time-Logging-Ad_D464/ExcelCustomDateFormat_thumb.png" width="516" height="462" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Figure 6: Excel custom format for displaying milliseconds in a date time field&lt;/strong&gt;&lt;/p&gt;</description>
      <link>http://tellingmachine.com/post/NUnit-Test-Start-and-End-Time-Logging-Add-in.aspx</link>
      <author>Klaus Graefensteiner</author>
      <comments>http://tellingmachine.com/post/NUnit-Test-Start-and-End-Time-Logging-Add-in.aspx#comment</comments>
      <guid>http://tellingmachine.com/post.aspx?id=d805dc9b-fb37-4c8f-a3ac-34d9700420c8</guid>
      <pubDate>Mon, 21 Nov 2011 08:37:23 -1500</pubDate>
      <category>.NET Framework</category>
      <category>Test Automation</category>
      <category>How To</category>
      <category>Debugging</category>
      <dc:publisher>Klaus Graefensteiner</dc:publisher>
      <pingback:server>http://tellingmachine.com/pingback.axd</pingback:server>
      <pingback:target>http://tellingmachine.com/post.aspx?id=d805dc9b-fb37-4c8f-a3ac-34d9700420c8</pingback:target>
      <slash:comments>81</slash:comments>
      <trackback:ping>http://tellingmachine.com/trackback.axd?id=d805dc9b-fb37-4c8f-a3ac-34d9700420c8</trackback:ping>
      <wfw:comment>http://tellingmachine.com/post/NUnit-Test-Start-and-End-Time-Logging-Add-in.aspx#comment</wfw:comment>
      <wfw:commentRss>http://tellingmachine.com/syndication.axd?post=d805dc9b-fb37-4c8f-a3ac-34d9700420c8</wfw:commentRss>
    </item>
    <item>
      <title>US to metric volume conversion Excel spreadsheet</title>
      <description>&lt;h1&gt;&lt;/h1&gt;  &lt;h1&gt;One A is x B&lt;/h1&gt;  &lt;p&gt;A lot of times I need an quick answer to questions like “How may liters is one Gallon?”. This blog post is my personal one-stop-shop for these kind of volume conversion factors.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/09101dfb2f26_DF75/image_2.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.tellingmachine.com/image.axd?picture=Windows-Live-Writer/09101dfb2f26_DF75/image_thumb.png" width="644" height="409" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Figure 1: Metric to US volume conversion table&lt;/strong&gt;&lt;/p&gt;  &lt;h1&gt;Download&lt;/h1&gt;  &lt;p&gt;The conversion Excel spreadsheet can be downloaded here: &lt;a title="VolumeMetricToUSConversions.zip" href="http://tellingmachine.com/file.axd?file=VolumeMetricToUSConversions.zip" rel="enclosure"&gt;VolumeMetricToUSConversions.zip&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Ausblick&lt;/h1&gt;  &lt;p&gt;Happy converting!&lt;/p&gt;</description>
      <link>http://tellingmachine.com/post/US-to-metric-volume-conversion-Excel-spreadsheet.aspx</link>
      <author>Klaus Graefensteiner</author>
      <comments>http://tellingmachine.com/post/US-to-metric-volume-conversion-Excel-spreadsheet.aspx#comment</comments>
      <guid>http://tellingmachine.com/post.aspx?id=3470766e-396e-4504-8d8c-f66e19b43e85</guid>
      <pubDate>Thu, 17 Nov 2011 09:11:09 -1500</pubDate>
      <category>Tips &amp; Tricks</category>
      <dc:publisher>Klaus Graefensteiner</dc:publisher>
      <pingback:server>http://tellingmachine.com/pingback.axd</pingback:server>
      <pingback:target>http://tellingmachine.com/post.aspx?id=3470766e-396e-4504-8d8c-f66e19b43e85</pingback:target>
      <slash:comments>107</slash:comments>
      <trackback:ping>http://tellingmachine.com/trackback.axd?id=3470766e-396e-4504-8d8c-f66e19b43e85</trackback:ping>
      <wfw:comment>http://tellingmachine.com/post/US-to-metric-volume-conversion-Excel-spreadsheet.aspx#comment</wfw:comment>
      <wfw:commentRss>http://tellingmachine.com/syndication.axd?post=3470766e-396e-4504-8d8c-f66e19b43e85</wfw:commentRss>
    </item>
  </channel>
</rss>

