Saturday, June 19, 2010

Unit Tests - "Written Once and Forgotten Forever"

I have come across many unit test cases that are written once and forgotten for ever, with all the dataset/environmental dependencies in it. What is the importance of dataset/environment? Let's take an example, observe the test case below.

public void testEmpFinder () {
//Weird Test case for Fun!!!
String result = "JOHN";

//Passing employee id returns employee object.

//verify the name matches.

Employee emp = EmpFinder.find(1);



What's wrong? The developer had made an assumption, that on querying with employeeid='1' will return employee with the name "JOHN". The data could be coming from a database table "EMPLOYEE". But It’s very evident this test case would fail if run on an environment where the employeeid='1' data doesn't exists. This makes the test cases obsolete the moment they are written.


1. Save Insert/Delete datascript, that could be run on test setup () and delete test data on completion of test.

2. You could use something like DBUnit ( which exports and imports the database data into an XML dataset. - Not sure of DBUnit support for modern day ORM's (Hibernate).


Unit tests should match & sustain life time of source, after all its a guarantee card to your source code. We just looked at database dependency for example, how about dependencies such as JMS, Content Repository, LDAP etc. Writing a test case with all its data & environmental dependencies Mocked & externalized is an Art.

Chekout In Dzone


Srikanth said...

Both the proposed solutions in your blog are still brittle, and do not meet the one of the requirements of unit tests that they should run in isolation. A correct approach will be to use a mock library such as Mockito and mock the DAO layer.

Senthil Balakrishnan said...

I agree with you mock frameworks are the way to go, I am trying my hands on it already...

Thanks for your comment.