17 January 2006

XUnit is the family name given to bunch of testing frameworks that have become widely known amongst software developers. The name is a derivation of JUnit, the first of these to be widely known.

The origins of these frameworks actually started in Smalltalk. Kent Beck was a big fan of automated testing at the heart of software development. To help him, and his clients, do this he would build a simple framework to organize and run unit tests. The focus was on making it easy for programmers to define the tests using their regular smalltalk environment, and then to run either a subset or a full set of tests quickly. Kent and his followers would run unit tests after every change to the system going through a rapid edit and test cycle in the Smalltalk IDE.

I ran into Kent at this time. I'd already done the same thing myself, but Kent's framework had a nice combination of absurd simplicity and just the right features for me. Basically he did a better job of it than I did so I just used his. In particular we used the framework on C3, where Ron Jeffries was also introduced to it.

I say 'it' but that's really a misnomer. There was no single kent-beck-smalltalk-unit-testing framework. Kent wants people to control their own environment, so he liked to have each team build the framework themselves (it only took a couple of hours), that way they would feel happy to change it to suit their particular circumstances - essentially it was really a Seedwork.

It was still unknown outside the Smalltalk community, so it's fair to give JUnit the credit for spreading the idea more. JUnit was born on a flight from Zurich to the 1997 OOPSLA in Atlanta. Kent was flying with Erich Gamma, and what else were two geeks to do on a long flight but program? The first version of JUnit was built there, pair programmed, and done test first (a pleasing form of meta-circular geekery). I heard about it and demanded a copy, which makes me one of the first alpha users. I felt free to change things I didn't like, sending some contributions back to Kent and Erich. If you're wondering who to blame for the fact that assertion messages are the first argument instead of following the java convention of putting optional arguments at the end....

JUnit also introduced the red/green bar progress indicator. At C3 we would color the whole window red once a test failed and green if they all passed. It was easy to see the window on the central build machine when you were integrating. JUnit introduced doing this as a progress bar, and thus added some new vocabulary to software developers.

JUnit took off like a rocket - and was essential to supporting the growing movement of Extreme Programming and Test Driven Development. I've seen a huge change of attitude towards testing in the last decade, and I think JUnit played a big role in that. By being small and simple it encouraged people to learn and use it. It also proved amenable to others extending it integrating it into tools. (Although I wish Sun would just bundle the whole thing into the JDK.)

As JUnit became more popular, other languages wanted one as well. I remember Michael Feathers putting together CppUnit for C++, which may have been the first port. Tons followed, nearly every language has at least one JUnit port. I suppose it was inevitable that it was also 'ported' back to Smalltalk as a real framework.

The ports vary. Some are line by line reworkings of the original JUnit, with little concession to the target language. The first version of NUnit even had a "isVAforJava" method which originated in special handling for Visual Age for Java. Others have been more sophisticated: NUnit 2.0 was praised by Anders Heljsberg for its use of attributes in C# - experience that has come back to the Java community and JUnit itself as Java developed annotations.