Startup and Cleanup functions in Erlang EUnit tests
I’ve got the basic grasp on Erlang but before I can do anything meaningful I need to learn how to test my code EUnit is the de-facto test framework. There are a ton of great sites that talk about testing with EUnit – I have linked to several at the end of this post. I’m going to focus on the problem I ran into – needing to run some startup and cleanup code around the test suite.
I started by writing a very simple dictionary that lived in it’s own process. The interface is:
start() -> ok stop() -> ok write(Key, Element) -> ok delete(Key) -> ok read(Key) -> {ok, Value} | not_found
Calling start() spawns and registers the process the dictionary lives in. Calling stop ends the process. The rest do what you expect.
I started by writing some basic tests for each function but I didn’t really think it through. The start test ran somewhere in the middle so all the tests prior to start either failed or timed out (because I was waiting on a receive that would never come since the process wasn’t started). Very quickly I smacked my forehead and said “I need the test suite to have a pre and post function to start and stop the process”.
It took about 15 minutes of reading to realize that I needed to create a test generator with a setup tuple that defined the startup, cleanup and list of tests to run.
Conceptually it was easy to understand but getting the syntax right was a royal pain. Basically you do this (I’m not sure if giving the function arity is the preferred method but it saved some keystrokes so I went with it):
my_db_test_() -> {spawn, {setup, fun start/0, fun stop/1, [ fun write_new/0, fun write_existing/0, fun read_existing/0, fun read_missing/0, fun delete_existing/0, fun delete_missing/0 ] } }.
The test methods are exactly what you’d expect so I won’t repeat them. The syntax feels a little foreign and uncomfortable but it’s very easy to understand and I totally get why it’s written this way. I’m just so used to MSTest attributes and RSpec that this new way is going to take a night or two to feel like an old friend.
Some Eunit resources
Prag Dave – Test-First Word Wrap in Erlang








