Testing randomness
The problem you run into when trying to write unit tests for methods using random data is that you can’t predict what random data it’s going to use. The idea behind a unit test is that you control the input and test whether the output is as you expected, so that’s a problem.
Let’s assume you have a token generator like this:
Now you can write tests to see if it generates tokens of the correct length, doesn’t generate homogeneous tokens and doesn’t generate the same token a number of times in a row. Unfortunately these tests could succeed a number of times and suddenly fail for no apparent reason. Usually this happens when you’re on vacation and one of your collegues is running the test on some weird architecture leaving them baffled.
The solution is to make Array#rand predictable by stubbing out the normal implementation:
Now you can write a test that checks the output, because you control what the random method returns:
Obviously you need to clean up after yourself in tests so you can’t just redefine methods. It would be really cool if we could do something like this:
We’ve implemented this as round_robin_method.rb, complete with its own testsuite. You could go even further and hook it into TestUnit to automatically undefine the round robin methods after a test has run. We’ll leave that as an exercise for another day.