The original Java white paper cites robustness as a key design goal of the language [1]. Java attempts to make quality assurance easier by identifying programming errors at both compile time and run time, and by adopting a policy of type safety. The Java compilers address the conformity of a program to language rules, but what about user inputs to a program that has survived compilation? Robustness testers, such as JCrasher, test public methods against random data, to determine if they throw an undeclared runtime exception.
This paper begins by briefly discussing testing protocols, and by advocating for a random testing paradigm, which JCrasher implements. It explains the inner workings of JCrasher, and provides empirical assessments of its quality. One distinguishing feature of JCrasher is that it can determine whether an exception results from an error in the program, or from user inputs that violate preconditions of the code. The paper explains how JCrasher generates test cases, and how it resets the Java Virtual Machine (JVM) so that a failure occurs in a state unaffected by prior failures. Although JCrasher can be used independently, it can be integrated into JUnit, a popular regression testing framework.
A valuable adjunct to the paper is a Web site that provides downloads of the software, and other useful information that supplements the paper (http://www.cc.gatech.edu/~csallnch/jcrasher/).
The paper will be of interest to software engineers and researchers who develop complex Java applications that must run reliably under a wide range of inputs.