Thursday, January 27, 2011

Very very simple testing in bash

Imagine I'm starting today on a software system that I expect to spend
at least a year on. Being me, somewhere in the top five questions I
ask myself is "How am I going to test this?" Frequent automated testing
gives me confidence that I won't find out next week that today I broke
something that was working last week. Writing tests is also an important way
to organize my thinking about what I'm doing. Once I've spent time specifying
where I'm going, it's easier to get there quickly.

Since I'm going to be spending a year on this, it's worth my time to invest time
in tools and frameworks that will make specifying and running these tests easy.
I might even write some of my own.

However, suppose that I'm working on a quick demo that I'm only going to spend
a couple weeks on. Or a data-processing script that I need to have finished
tomorrow. Or a sysadmin task that I expect will only take half an hour?

In these cases, I still want the benefits of testing, but I want to spend
as little time as possible getting started. Also, it's not always clear
what technologies I'll be using: I may start in Java, and then find that
a Python library will give me 80% of what I need.
So, I've started to write start projects with test suites that consist of
nothing more than a bash script with a standard footer I copy-and-paste
from project to project. The advantages:

  • Fast startup: I don't need to download anything or
    run through any "new project" wizards.
  • If my project lasts longer than I expected, it's easy to remember how
    to run the tests: just run the script.
  • I can easily refactor to use a more heavyweight framework like JUnit by
    calling out to it from the script.
  • It isn't tied to any underlying implementation choice.
  • Perhaps best of all, it rewards a UNIX style of small stdin-to-stdout
    plug-and-play components.

With no further ado, here's an example script, this one drawn from
the JUnit build process:

Friday, January 21, 2011

JUnit 4.9b2 (beta-)released

This release's theme is Test-class and suite level Rules. Please read the release notes, download, and give feedback before the final release.

Tuesday, January 4, 2011

Running a JUnit 4 test from a Scala script

I'm using Scala now and then as a language for side projects. One of the nice things about Scala is that you can bootstrap with a single-file script, similar to Python or Ruby. Since I enjoy building things with test-driven development, it's not long after I write a script that I want to start writing tests for classes and functions. However, when I tried to do this in the straight-forward way, it doesn't quite work. Herein, the problem, and its solution.

As a first attempt, I expected this to work:

However, running this produces a failure in the infrastructure:

What's going on here is that when scala is run in single-file script mode, it implicitly wraps all of the declarations within the declaration of an anonymous singleton object (Main$$anon). When JUnit tries to reflectively create an ArithmeticTest object, it runs into the fact that, from the Java perspective, ArithmeticTest is a non-static inner class of Main$$anon. To get around this requires a bit of a dance, luckily made fairly short due to Scala's compact OO verbiage:

If I find myself doing this often, I imagine I'll be pulling this out into an importable library. Share and Enjoy.