Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

How do I capture and save the results of a JUnit 4 test suite run?

Posted on 2007-12-03
3
Medium Priority
?
2,483 Views
Last Modified: 2012-08-13
Hello, I have created a test suite using JUnit 4.  It uses JUnit 4 annotations so it is essentially an empty class that looks like this:

package mypackage;

import org.junit.runners.Suite;

@Suite.SuiteClasses(value={TesClass1.class,TestClass2.class})
public class MySuite
{
}

I'm developing in Eclipse and when I execute this as a JUnit test everything works.  The only problem is that ultimately I want this to run in an automated environment after installation on a machine where there will be no eclipse set up.  Essentially I want to wrap the execution of this test suite in a script (possibly using Ant, not sure yet).  Further, I want to capture the results of each test and store them in an HTML file that I can then look at the results using a browser.

Question: how can I capture the results of the tests in the suite when my test suite class does not even have a body to it?  

I looked into writing a class that extended Runner but without much success.  It seems that I am missing something.  Has anybody else done anything like this?

I have also experimented with building the suite using the JUnit 3 pattern of building a test suite, but that seems to break since my test case classes (TestClass1 and TestClass2) are using JUnit 4 annotations.  JUnit 4 does not seem to like being mixed with JUnit 3.

Thanks in advance,

Bill
0
Comment
Question by:billybobc
3 Comments
 
LVL 92

Expert Comment

by:objects
ID: 20398804
ant has a task to run junit tests

http://ant.apache.org/manual/OptionalTasks/junit.html
0
 
LVL 3

Expert Comment

by:humergu
ID: 20398971
maybe what you want is a build server, which integrates with ant (and JUnit) and stores the results, etc...

the abstraction of MAVEN is a bit higher than ant (but maven is no build server - a bit like ant, but at a higher level) (OpenSource Software!)
http://maven.apache.org/

CruiseControl is a build server which integrates with Ant (and therefore JUnit) (OpenSource Software!)
http://cruisecontrol.sourceforge.net/

alternative build servers:
continuum (http://maven.apache.org/continuum/) integrates with ant, maven ... OpenSource Software!
anthillAnthill (http://www.anthillpro.com/)
0
 

Accepted Solution

by:
billybobc earned 0 total points
ID: 20577789
I found a solution that utilizes the following JUnit classes:

org.junit.runner.JUnitCore
org.junit.runner.notification.RunListener:

First I created a few support classes:

RegTestResult - this is a simple bean class that contains four fields: String testMethodName,  String description, String failureMessage, long duration.

RegTestRestultRecorder - this class extends org.junit.runner.notification.RunListener and takes an empty Vector<RegTestResult> on construction.  By implementing the testFailure(), testStarted() and testFinished() methods I can capture test results and store them in the Vector<RegTestResult> passed on construction.  

RunSuite - class containing my "main" method.  Instantiates a JUnitCore class to run the JUnit test suite adds a RegTestResultRecorder instance as a RunListener using the addListener() method.  The suite is executed using JUnitCore's run() method.   When the suite is finished, the Vector<RegTestResult> passed to the RegTestResultRecorder on construction, contains the results of all the tests and I can output them in whatever fashion I want.  

My RunSuite.main() method looks like this:

        // Check that at least the test class name is specified.
        if (args.length == 0)
        {
            System.err.println("Usage: java RunSuite <testSuiteClass>");
        }

        String testSuiteClassName = args[0];
        Class testSuiteClass = null;

        try
        {
            testSuiteClass = Class.forName(testSuiteClassName);
        }
        catch (ClassNotFoundException e1)
        {
            System.err.println("Unknown test suite class '" + testSuiteClassName + "'");
            System.exit(1);
        }

        // Create a JUnitCore instance to run the tests with.
        JUnitCore core = new JUnitCore();
       
        // Create a Vector of RegTestResults in which reg test results will be stored.
        Vector<RegTestResult> testResults = new Vector<RegTestResult>();
        // Add RegTestResultRecorder (which extends RunListener) instance to JUnitCore instance
        // in order to capture test results.
        core.addListener(new RegTestResultRecorder(testResults));

       // Run the test class.  testResults will have the results of all test runs on return.
        core.run(testSuiteClass);
   
 
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
This was posted to the Netbeans forum a Feb, 2010 and I also sent it to Verisign. Who didn't help much in my struggles to get my application signed. ------------------------- Start The idea here is to target your cell phones with the correct…
Video by: Michael
Viewers learn about how to reduce the potential repetitiveness of coding in main by developing methods to perform specific tasks for their program. Additionally, objects are introduced for the purpose of learning how to call methods in Java. Define …
Viewers will learn one way to get user input in Java. Introduce the Scanner object: Declare the variable that stores the user input: An example prompting the user for input: Methods you need to invoke in order to properly get  user input:
Suggested Courses

877 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question