Monday, August 06, 2007

Dear VSTS Test: I Hate You

I cannot even count the ways that VSTS Test is inferior to NUnit (or MbUnit).

I’ve been running my tests via TestDriven.NET (right-click, Run Test) and it has been working just fine.  The tests run, I get my results.  The reason I do this is because the built-in test runner sucks leaves something to be desired.

I went to a teammates machine the other day and he ran the test suite and most of the tests failed.  In fact, any test that hit the database failed.  All of them had the same error message: 

ConfigurationException:  Could not load the configSource ‘local-connectionStrings.config’.

This file is copied (via pre-build event) from a root location, to the output directory.  This file is, by nature, different for each developer.  It contains connection strings that are specific to the machine.

Using FileMon I was able to see that the VSTS Test Runner was looking in the ..\..\TestResults\{TIMESTAMP FOLDER HERE}\Out\ directory.  The VSTS product team claims that this is for remote running of tests, but I suspect that it is just a poor solution to the problem.  Anyway, there is no way that I can (via a batch file) copy the config file to this folder.  So Pre-Build events are out.

I read up on the issue and find that it is possible to have items copied to the Test Results folder.  You have to add this attribute to a test method:

[DeployItem(“local-connectionStrings.config”)]

…and yes, I said to a test method.  It will not work on a [TestInitialize] or [TestClass].  So basically if I want to use this feature, I have to retro fit around 80 tests to include this attribute, then tell my whole team to do it as well.  No thank you.

You can also add the Deployment Item to the localtestrun.testrunconfig file (under Solution Items).  This file says “local” but it is checked into source control, so it is not clear if this change will be applied to everyone’s working copy or my own.

This is a stupid, hacky solution to a problem that doesn’t even exist with the other unit test frameworks.  Since we aren’t really using any TFS test features yet (Web Tests will come) —I’m tempted to just rewrite them all for NUnit.  Of course I will get pushback from management, but these little issues are becoming a hinderance. 

If it is cumbersome to test, developers won’t write unit tests.

(Oh, and JetBrains:  when will you release support for the VSTS Tests?  I’m dying over here!)

Friday, August 03, 2007

Decorator - The Cool Pattern with the Stupid Name

So I have a logging class that is implementation agnostic.  Under the hood it uses an Adapter for Enterprise Library Logging, however we could easily switch it out for log4net if needed without changing the code.

So you can imagine that I have an interface that looks like this:

public interface ILogger

{

    void Write(string text);

    void Warn(string text);

    void Error(string text, Exception msg);

}

… and there is currently an implementation of this class called EntLibLogger:

public class EntLibLogger : ILogger

{       

    public void Write(string text)

    {

        //ent. lib write log entry

    }

 

    public void Warn(string text)

    {

        //ent. lib warn

    }

 

    public void Error(string text, Exception msg)

    {

        //ent. lib error

    }       

}

The specific logger that is used is abstracted behind a factory of course.  However, some of the applications that use this component will not have the logging configuration.  It is perfectly feasible to ignore logging in this scenario (ie: swallow exceptions) however this is something that any logging component would do.  I don’t want to add it to each and every implementation of ILogger.

So here’s where the decorator comes in.  This pattern could really use a better name, but I can’t think of one, so I’ll leave that up to you.

A Decorator implements the same interface, however it wraps each method with its own behavior before deferring the call to an inner implementation.  Wow, that doesn’t really make much sense, so how about an example…

public class SilentlyFailLoggingDecorator : ILogger

{

    private readonly ILogger _innerLogger;

 

    public SilentlyFailLoggingDecorator(ILogger innerLogger)

    {

        _innerLogger = innerLogger;

    }

 

    public void Write(string text)

    {

        try

        {

            _innerLogger.Write(text);

        }

        catch

        {

            //swallow exception

        }

    }

 

    public void Warn(string text)

    {

        try

        {           

            _innerLogger.Warn(text);               

        }

        catch

        {

            //swallow exception           

        }

    }

 

    public void Error(string text, Exception exc)

    {

        try

        {

            _innerLogger.Error(text, exc);

        }

        catch

        {

            //swallow

        }

    }

 

}

All of the actual implementation comes from whatever ILogger is sent via the constructor.  All this class does is “decorate” the method calls with additional behavior.  (This time, we’re choosing to silently ignore errors rather than throw exceptions that cause the program to stop)

To wire this up, wherever the factory method resides that creates the actual logger, you’d write…

public static ILogger GetLogger()

{

    //via IoC or just hard-coding

    return new SilentlyFailLoggingDecorator(

         new EntLibLogger()

    );

}

So there you have it!  The decorator pattern can do all kinds of Aspect-Oriented things such as Log a message each time a method is called, or possibly massage parameters before sending them to an inner class.

ReSharper Coolness - Move Methods

Every once and a while I come across a new feature that just makes me stop and think “ReSharper, I love you MAN!”

If you have your cursor on a method, press CTRL+ALT+SHIFT  and the Up or Down arrow keys.

Here it is in action:

Resharper:  move method

Thursday, August 02, 2007

How Does YouTube Handle It?

I ran across an excellent read about how YouTube's architecture handles so much bandwidth and traffic.

The core of it is:

  • SuSe Linux
  • Apache + lighttpd (for videos only)
  • Python + C extensions for expensive operations
  • Lots of caching

Many more points to read, but a great reference indeed.  Check it out here:  http://highscalability.com/youtube-architecture.

Excellent Advice from a Hibernate Expert

I just stumbled on this list of 10 Things I Learned About Using Hibernate Successfully.

It is excellent advice for anyone using Hibernate or NHibernate.  I fully agree with each point on this list.

http://www.spenceruresk.com/2007/07/27/10-things-i-learned-about-using-hibernatejpa-successfully/

Wednesday, August 01, 2007

Robert Martin at AgileHouston Last Night

I just got home after attending a talk by Robert Martin on Code Quality.  It was really great to meet him after reading his book, to which I gave an excellent review.

Bob (that’s what people call him when you know him, kind of like Bob De Niro, though I don’t know him at all — what was I saying?) is very animated and pretty weird.  He pulled out his geek card a few times which was funny.  He even acted out a scene from Star Trek 2 where he was Ricardo Monteban.  Yeah.

Anyway, the talk was very much like his book and enjoyed it thoroughly.  It was also good to see other folks in the room interested in agility from around Houston.  Most of them were .NET developers.

Robert Martin will be in town again next month giving a similar (but different) talk about clean code, possibly with Ruby.  Hopefully I will be able to attend that as well.

I’ll leave you with some R.M. quotes…

“Not cleaning up your code is like not doing the dishes after dinner.  The longer you wait, the more the mess piles up.  Eventually it impedes you so much that you can’t even work”

Having management dictate a specific code coverage percentage is madness.  Code Coverage is a great tool for developer feedback, but mandating it will not provide value.”

The great redesign in the sky fails — always.”

So you want to clean up some code but it is just a mess?  Uh [snickering] do you have tests?  No?  Your pretty much screwed.. [smiles]” — after which the book Working Effectivly with Legacy Code was recommended.

“Professionals write tests — first”

Sunday, July 29, 2007

My Presentation at OKCodeCamp - DDD with NHibernate

I presented a talk on Domain Driven Design with NHibernate at the OKC code camp yesterday.

It started out a bit rough because I had some missing references and some confusing exceptions, however once I got the ball rolling I think it went pretty well.

I ran way short on time, however, and I promised the crowd that I would post the completed files on my blog tonight .

So, here is the powerpoint, demo applications, and all of the referenced dlls from my presentation.  Let me hear your feedback in the comments!

File Attachment: ddd with nhibernate.zip (7694 KB)

(the file is large because I have the complete references to specific versions of NHibernate and NUnit, so you shouldn’t have to worry about references at all.)

To get the sample running, change the app.config to point to an actual database.  The database should be empty.

OKC Code Camp - After Thoughts

I’m in the airport now awaiting my flight home.  The code camp was a blast!  I was very glad to meet a bunch of very smart folks and pick their brains.  I also miss my family, so I’m glad to be going home.

Being surrounded by like-minded people really validates that the things that we are doing are of value, and I really think that the industry is poised for a change as a whole.  At the code camp there was an Agile Experts Panel (which I was a part of somehow  )  — anyway, there was only one guy up there that was questioning the things that we were talking about.  In my experience the agile ones are the outnumbered ones.  There were a number of .NET newcomers who were just getting into development, and it was really good to recommend some solid books and blogs to get them started.

It was fun to listen to Scott Bellware not pull any punches and be incredibly blunt about what he believes about agile. 

A couple of my favorite quotes of the day:

  • “God forbid we ask our developers to LEARN…” – Scott Bellware
  • “When you fire up the debugger to verify something and then click stop, the ‘test’ that you just performed goes into the ether.  Every time someone does that, God kills a kitten…” – Dave Laribee

I can’t wait to get together with these guys again at the ALT.NET open spaces conference in October.

(oh — I’m working on finishing the example from my presentation, so I’ll post the files for that as soon as I finish)

Wednesday, July 25, 2007

The Results are In!

Our little dasBlog theme contest has ended.

Here are the votes:

drum roll please…

Dandelion: 6 votes
Expression: 2 votes
Funky: 1 vote
Lizard Lounge: 2 votes (even though I told them not to vote for it :P )

So, Tim Sherrill, your $100 Amazon Gift Card is forthcoming, and thank you!

Thanks also to the others who submitted their themes.  Maybe we can do a larger contest in the future.

Dandelion DasBlog Theme

Monday, July 23, 2007

dasBlog Theme Contest - The Contenders

Here are the contenders for the dasBlog theme contest (in no particular order)…

Entry #1:  Dandelion, by Tim Sherrill

CropperCapture[5]

Entry #2:  Tractor Pull, by Tim Sherrill

CropperCapture[6]

Entry #3: Expression, by Janakiram MSV

CropperCapture[7]

Entry #4:  Funky, by Tony Bouch

CropperCapture[8]

Entry #5: JDasBlog, by Justin-Josef Angel

CropperCapture[10]

Entry #6: VitaminCSS, by James Green

CropperCapture[9]

Entry #7:  Lizard Lounge, by yours truly (this one can’t receive any votes, since I am a sponsor of the contest)

CropperCapture[11]

All of these themes are available online at the dasblog sample blog (http://www.dasblog.info/dasblog).

Thanks to all who submitted entries!

The dasBlog team will vote on the winner and I will post the results here.

 

Loan - Mortgage Calculator - Homeowner Loans - Bad Credit Loans