eunit is good for simple functional tests (etap is another option here) but it is not really sufficient for testing things like gen_servers and more complex behavior. OTP includes a testing framework (common test) that does these sorts of tests and is in fact used to test the rest of OTP, but it is a PITA to configure and documentation is rather thin so most people opt for low-level eunit tests and hope for the best when it comes to the more complicated bahaviors of the system...