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);


assertEquals(emp.getName,result);


}


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.

Approach

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 (http://www.dbunit.org/) which exports and imports the database data into an XML dataset. - Not sure of DBUnit support for modern day ORM's (Hibernate).

Conclusion:

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

2 comments:

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. http://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/Mockito.html#2

Software Consultant said...

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

Thanks for your comment.