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. Insert/Delete data script that could run on test suit 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 test 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 externalized is an Art.
No comments:
Post a Comment