Sometimes when programming I like to leave unit tests running repeatedly in one window while editing the code and tests in another. The bash command watch is useful for this, and can highlight the differences between one invocation and the next in inverse.

I wanted a version of watch for use on Windows, so I whipped up a quick Python script, testwatcher, which produces output very similar to watch, but is cross-platform, and features not just inverse text, but yellow inverse text. Woo-hoo!

python example_test.py
FAIL: testThat (__main__.TestWatcherTest)
Traceback (most recent call last):
  File "example_test.py", line 12, in testThat
    self.assertEquals(0, randint(0, 10))
AssertionError: 0 != 4

FAIL: testThis (__main__.TestWatcherTest)
Traceback (most recent call last):
  File "example_test.py", line 9, in testThis
    self.assertEquals('one', object())
AssertionError: 'one' != <object object at 0xb7d24460>

Ran 3 tests in 0.001s

FAILED (failures=2)

Incidentally, the above test makes it very clear that Python objects in successive processes get new addresses on Linux, but interestingly on Windows the same addresses seems to get re-used for different processes.

I can’t help but suspect this is a dumb script to have written – it should only be a:

 while True:

but in order to shoehorn the inverse text and colors in, it’s grown to 300 lines – a hideous bloat for a minor superficial thrill. Plus the Windows version flickers terribly – I’m currently using system('cls') to clear the screen and then redraw it every second. I’ll do some searching for better ways to do it.

However – I’ve long wanted a Python interface to perform simple terminal actions like colors and animation on different platforms (the standard library ‘curses’ module that would otherwise do the job is simply not implemented on Windows.) So maybe it’s time I used this script as an excuse to figure this out. Suggestions welcome.

Update: This idea may have now reached a viable fruition, documented here.

5 thoughts on “Testwatcher

  1. Yeah! I’m slowly coming round the the idea that for this to work properly, I’d have to whip up a double-buffer for the Windows terminal, assuming there’s some control character I can print to make the print position reset to (0, 0). I originally expected this would be a 20 line script, so this may be more effort that I can justify at the moment. Maybe someday…

Leave a Reply