Part IV. Unit Testing

The next moment the day became very bothering indeed, because Pooh was so busy not looking where he was going that he stepped on a piece of the Forest which had been left out by mistake.

“A Search is Organized, and Piglet Nearly Meets the Heffalump Again,” The House at Pooh Corner, A. A. Milne

Software development is very much a trial-and-error process, and it pays to proceed cautiously, little-by-little. This is why good testing is an essential part of the software development process. Although in practice it is often neglected, few developers today would deny the fundamental value of proper testing. Unit tests, especially when used in conjunction with modern agile development processes and techniques such as Test-Driven Development, have the potential to drastically increase the quality and reliability of your code.

Unit tests are also a very effective means of detecting regressions, especially when Continuous Integration techniques (Chapters 5, 6, 7) is being used. Whether you are adding functionality or refactoring existing code, a comprehensive set of unit tests provide a quick way of verifying that no existing functionality has been broken by recent changes.

Unit testing basically involves writing test cases to ensure that your classes function correctly. Unit tests are typically fairly low-level and modular—ideally, you should be able to execute a unit test in isolation, and not depend on any other test cases to be run beforehand. In other words, your tests should be able to be executed in any order, or individually, and still work correctly.

Another important best practice regarding unit tests is that unit test should leave the system in the same state as it was in before the test. For example, if you are testing a DAO class, your tests may well insert, update, and delete data in the database, but once the test has finished, the database should be in the same state as before the test was started. This is not always easy, as a failed test may well leave your environment in an unstable state. Developers often need to write special code (generally known as “fixture code”) designed to set up a clean test environment before testing and to tidy up afterward.

Although it is possible to write unit tests entirely from scratch, unit testing frameworks make things at lot easier. By providing a simple, well-understood framework in which to write your tests, libraries such as JUnit and TestNG let developers concentrate on writing high quality unit tests. Testing frameworks also make it easier to organize your tests, to selectively run individual tests, to report on test results, and to write supporting fixture code.

Many books and articles have been written on unit testing, and on recommended testing practices in general. In this section, we will look at tools and techniques that can improve your productivity when it comes to testing your application.

We will also be looking at that vital complement to unit testing, code coverage, as well as at one of the leading open source code coverage tools, Cobertura. Code coverage tools help you verify what parts of your code are being tested by your unit tests, and, more important, what parts aren’t. Although code coverage statistics offer little guarantee that your code is being tested well, they are certainly better than nothing and can give valuable tips on any shady areas of code that have been left untested. And it is well known that bugs like to accumulate in the shadows.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.137.212.124