I’ve heard a lot about property-based testing in the last 2 years but haven’t really had a chance to try it out. I first heard about it when I was learning Haskell, but at the time I thought regular bog-standard unit testing was a better option. I didn’t want to learn a new language (and one notoriously difficult at that) and a new way of testing at the same time. Since then I haven’t written anything else in Haskell for multiple reasons and it’s always been something I’ve been wanting to try out.
I decided that the best way to do it is just to implement property-based testing myself, and I’ve started with preliminary support in my unit-threaded library for basic types and arrays thereof. The main issue was knowing how to write the new tests. It wasn’t clear at all and if you’re in the same situation I highly recommend this talk on the subject. Fortunately, one of the examples in those slides was serialization, and since I wrote a library for that too, I immediately started transitioning some pre-existing unit tests. I have to say that I believe the new tests are much, much better. Here’s one test “on paper” but that actually runs 100 random examples for each of the 17 types mentioned in the code, checking that serializing then deserializing should yield the same value:
@Types!(bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double, char, wchar, dchar, ubyte[], ushort[], int[]) void testEncodeDecodeProperty(T)() { check!((T val) { auto enc = Cerealiser(); enc ~= val; auto dec = Decerealiser(enc.bytes); return dec.value!T == val; }); }
I think that’s a pretty good test/SLOC ratio. Now I just have to find more applications for this.