Best junit code snippet using junit.runner.Interface TestRunListener
Source:RemoteAdtTestRunner.java  
1/*2 * Copyright (C) 2009 The Android Open Source Project3 *4 * Licensed under the Eclipse Public License, Version 1.0 (the "License");5 * you may not use this file except in compliance with the License.6 * You may obtain a copy of the License at7 *8 *      http://www.eclipse.org/org/documents/epl-v10.php9 *10 * Unless required by applicable law or agreed to in writing, software11 * distributed under the License is distributed on an "AS IS" BASIS,12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13 * See the License for the specific language governing permissions and14 * limitations under the License.15 */16package com.android.ide.eclipse.adt.internal.launch.junit.runtime;17import com.android.ddmlib.AdbCommandRejectedException;18import com.android.ddmlib.IDevice;19import com.android.ddmlib.ShellCommandUnresponsiveException;20import com.android.ddmlib.TimeoutException;21import com.android.ddmlib.testrunner.IRemoteAndroidTestRunner.TestSize;22import com.android.ddmlib.testrunner.ITestRunListener;23import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;24import com.android.ddmlib.testrunner.TestIdentifier;25import com.android.ide.eclipse.adt.AdtPlugin;26import com.android.ide.eclipse.adt.internal.launch.LaunchMessages;27import org.eclipse.core.runtime.IProgressMonitor;28import org.eclipse.core.runtime.IStatus;29import org.eclipse.core.runtime.Status;30import org.eclipse.core.runtime.jobs.Job;31import org.eclipse.jdt.internal.junit.runner.IListensToTestExecutions;32import org.eclipse.jdt.internal.junit.runner.ITestReference;33import org.eclipse.jdt.internal.junit.runner.MessageIds;34import org.eclipse.jdt.internal.junit.runner.RemoteTestRunner;35import org.eclipse.jdt.internal.junit.runner.TestExecution;36import org.eclipse.jdt.internal.junit.runner.TestReferenceFailure;37import java.io.IOException;38import java.util.ArrayList;39import java.util.List;40import java.util.Map;41/**42 * Supports Eclipse JUnit execution of Android tests.43 * <p/>44 * Communicates back to a Eclipse JDT JUnit client via a socket connection.45 *46 * @see org.eclipse.jdt.internal.junit.runner.RemoteTestRunner for more details on the protocol47 */48@SuppressWarnings("restriction")49public class RemoteAdtTestRunner extends RemoteTestRunner {50    private static final String DELAY_MSEC_KEY = "delay_msec";51    /** the delay between each test execution when in collecting test info */52    private static final String COLLECT_TEST_DELAY_MS = "15";53    private AndroidJUnitLaunchInfo mLaunchInfo;54    private TestExecution mExecution;55    /**56     * Initialize the JDT JUnit test runner parameters from the {@code args}.57     *58     * @param args name-value pair of arguments to pass to parent JUnit runner.59     * @param launchInfo the Android specific test launch info60     */61    protected void init(String[] args, AndroidJUnitLaunchInfo launchInfo) {62        defaultInit(args);63        mLaunchInfo = launchInfo;64    }65    /**66     * Runs a set of tests, and reports back results using parent class.67     * <p/>68     * JDT Unit expects to be sent data in the following sequence:69     * <ol>70     *   <li>The total number of tests to be executed.</li>71     *   <li>The test 'tree' data about the tests to be executed, which is composed of the set of72     *   test class names, the number of tests in each class, and the names of each test in the73     *   class.</li>74     *   <li>The test execution result for each test method. Expects individual notifications of75     *   the test execution start, any failures, and the end of the test execution.</li>76     *   <li>The end of the test run, with its elapsed time.</li>77     * </ol>78     * <p/>79     * In order to satisfy this, this method performs two actual Android instrumentation runs.80     * The first is a 'log only' run that will collect the test tree data, without actually81     * executing the tests,  and send it back to JDT JUnit. The second is the actual test execution,82     * whose results will be communicated back in real-time to JDT JUnit.83     *84     * The tests are run concurrently on all devices. The overall structure is as follows:85     * <ol>86     *   <li> First, a separate job per device is run to collect test tree data. A per device87     *        {@link TestCollector} records information regarding the tests run on the device.88     *        </li>89     *   <li> Once all the devices have finished collecting the test tree data, the tree info is90     *        collected from all of them and passed to the Junit UI </li>91     *   <li> A job per device is again launched to do the actual test run. A per device92     *        {@link TestRunListener} notifies the shared {@link TestResultsNotifier} of test93     *        status. </li>94     *   <li> As tests complete, the test run listener updates the Junit UI </li>95     * </ol>96     *97     * @param testClassNames ignored - the AndroidJUnitLaunchInfo will be used to determine which98     *     tests to run.99     * @param testName ignored100     * @param execution used to report test progress101     */102    @Override103    public void runTests(String[] testClassNames, String testName, TestExecution execution) {104        // hold onto this execution reference so it can be used to report test progress105        mExecution = execution;106        List<IDevice> devices = new ArrayList<IDevice>(mLaunchInfo.getDevices());107        List<RemoteAndroidTestRunner> runners =108                new ArrayList<RemoteAndroidTestRunner>(devices.size());109        for (IDevice device : devices) {110            RemoteAndroidTestRunner runner = new RemoteAndroidTestRunner(111                    mLaunchInfo.getAppPackage(), mLaunchInfo.getRunner(), device);112            if (mLaunchInfo.getTestClass() != null) {113                if (mLaunchInfo.getTestMethod() != null) {114                    runner.setMethodName(mLaunchInfo.getTestClass(), mLaunchInfo.getTestMethod());115                } else {116                    runner.setClassName(mLaunchInfo.getTestClass());117                }118            }119            if (mLaunchInfo.getTestPackage() != null) {120                runner.setTestPackageName(mLaunchInfo.getTestPackage());121            }122            TestSize size = mLaunchInfo.getTestSize();123            if (size != null) {124                runner.setTestSize(size);125            }126            runners.add(runner);127        }128        // Launch all test info collector jobs129        List<TestTreeCollectorJob> collectorJobs =130                new ArrayList<TestTreeCollectorJob>(devices.size());131        List<TestCollector> perDeviceCollectors = new ArrayList<TestCollector>(devices.size());132        for (int i = 0; i < devices.size(); i++) {133            RemoteAndroidTestRunner runner = runners.get(i);134            String deviceName = devices.get(i).getName();135            TestCollector collector = new TestCollector(deviceName);136            perDeviceCollectors.add(collector);137            TestTreeCollectorJob job = new TestTreeCollectorJob(138                    "Test Tree Collector for " + deviceName,139                    runner, mLaunchInfo.isDebugMode(), collector);140            job.setPriority(Job.INTERACTIVE);141            job.schedule();142            collectorJobs.add(job);143        }144        // wait for all test info collector jobs to complete145        int totalTests = 0;146        for (TestTreeCollectorJob job : collectorJobs) {147            try {148                job.join();149            } catch (InterruptedException e) {150                endTestRunWithError(e.getMessage());151                return;152            }153            if (!job.getResult().isOK()) {154                endTestRunWithError(job.getResult().getMessage());155                return;156            }157            TestCollector collector = job.getCollector();158            String err = collector.getErrorMessage();159            if (err != null) {160                endTestRunWithError(err);161                return;162            }163            totalTests += collector.getTestCaseCount();164        }165        AdtPlugin.printToConsole(mLaunchInfo.getProject(), "Sending test information to Eclipse");166        notifyTestRunStarted(totalTests);167        sendTestTrees(perDeviceCollectors);168        List<TestRunnerJob> instrumentationRunnerJobs =169                new ArrayList<TestRunnerJob>(devices.size());170        TestResultsNotifier notifier = new TestResultsNotifier(mExecution.getListener(),171                devices.size());172        // Spawn all instrumentation runner jobs173        for (int i = 0; i < devices.size(); i++) {174            RemoteAndroidTestRunner runner = runners.get(i);175            String deviceName = devices.get(i).getName();176            TestRunListener testRunListener = new TestRunListener(deviceName, notifier);177            InstrumentationRunJob job = new InstrumentationRunJob(178                    "Test Tree Collector for " + deviceName,179                    runner, mLaunchInfo.isDebugMode(), testRunListener);180            job.setPriority(Job.INTERACTIVE);181            job.schedule();182            instrumentationRunnerJobs.add(job);183        }184        // Wait for all jobs to complete185        for (TestRunnerJob job : instrumentationRunnerJobs) {186            try {187                job.join();188            } catch (InterruptedException e) {189                endTestRunWithError(e.getMessage());190                return;191            }192            if (!job.getResult().isOK()) {193                endTestRunWithError(job.getResult().getMessage());194                return;195            }196        }197    }198    /** Sends info about the test tree to be executed (ie the suites and their enclosed tests) */199    private void sendTestTrees(List<TestCollector> perDeviceCollectors) {200        for (TestCollector c : perDeviceCollectors) {201            ITestReference ref = c.getDeviceSuite();202            ref.sendTree(this);203        }204    }205    private static abstract class TestRunnerJob extends Job {206        private ITestRunListener mListener;207        private RemoteAndroidTestRunner mRunner;208        private boolean mIsDebug;209        public TestRunnerJob(String name, RemoteAndroidTestRunner runner,210                boolean isDebug, ITestRunListener listener) {211            super(name);212            mRunner = runner;213            mIsDebug = isDebug;214            mListener = listener;215        }216        @Override217        protected IStatus run(IProgressMonitor monitor) {218            try {219                setupRunner();220                mRunner.run(mListener);221            } catch (TimeoutException e) {222                return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID,223                        LaunchMessages.RemoteAdtTestRunner_RunTimeoutException,224                        e);225            } catch (IOException e) {226                return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID,227                        String.format(LaunchMessages.RemoteAdtTestRunner_RunIOException_s,228                                e.getMessage()),229                        e);230            } catch (AdbCommandRejectedException e) {231                return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID,232                        String.format(233                                LaunchMessages.RemoteAdtTestRunner_RunAdbCommandRejectedException_s,234                                e.getMessage()),235                        e);236            } catch (ShellCommandUnresponsiveException e) {237                return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID,238                        LaunchMessages.RemoteAdtTestRunner_RunTimeoutException,239                        e);240            }241            return Status.OK_STATUS;242        }243        public RemoteAndroidTestRunner getRunner() {244            return mRunner;245        }246        public boolean isDebug() {247            return mIsDebug;248        }249        public ITestRunListener getListener() {250            return mListener;251        }252        protected abstract void setupRunner();253    }254    private static class TestTreeCollectorJob extends TestRunnerJob {255        public TestTreeCollectorJob(String name, RemoteAndroidTestRunner runner, boolean isDebug,256                TestCollector listener) {257            super(name, runner, isDebug, listener);258        }259        @Override260        protected void setupRunner() {261            RemoteAndroidTestRunner runner = getRunner();262            // set log only to just collect test case info,263            // so Eclipse has correct test case count/tree info264            runner.setLogOnly(true);265            // add a small delay between each test. Otherwise for large test suites framework may266            // report Binder transaction failures267            runner.addInstrumentationArg(DELAY_MSEC_KEY, COLLECT_TEST_DELAY_MS);268        }269        public TestCollector getCollector() {270            return (TestCollector) getListener();271        }272    }273    private static class InstrumentationRunJob extends TestRunnerJob {274        public InstrumentationRunJob(String name, RemoteAndroidTestRunner runner, boolean isDebug,275                ITestRunListener listener) {276            super(name, runner, isDebug, listener);277        }278        @Override279        protected void setupRunner() {280            RemoteAndroidTestRunner runner = getRunner();281            runner.setLogOnly(false);282            runner.removeInstrumentationArg(DELAY_MSEC_KEY);283            if (isDebug()) {284                runner.setDebug(true);285            }286        }287    }288    /**289     * Main entry method to run tests290     *291     * @param programArgs JDT JUnit program arguments to be processed by parent292     * @param junitInfo the {@link AndroidJUnitLaunchInfo} containing info about this test ru293     */294    public void runTests(String[] programArgs, AndroidJUnitLaunchInfo junitInfo) {295        init(programArgs, junitInfo);296        run();297    }298    /**299     * Stop the current test run.300     */301    public void terminate() {302        stop();303    }304    @Override305    protected void stop() {306        if (mExecution != null) {307            mExecution.stop();308        }309    }310    private void notifyTestRunEnded(long elapsedTime) {311        // copy from parent - not ideal, but method is private312        sendMessage(MessageIds.TEST_RUN_END + elapsedTime);313        flush();314        //shutDown();315    }316    /**317     * @param errorMessage318     */319    private void reportError(String errorMessage) {320        AdtPlugin.printErrorToConsole(mLaunchInfo.getProject(),321                String.format(LaunchMessages.RemoteAdtTestRunner_RunFailedMsg_s, errorMessage));322        // is this needed?323        //notifyTestRunStopped(-1);324    }325    private void endTestRunWithError(String message) {326        reportError(message);327        notifyTestRunEnded(0);328    }329    /**330     * This class provides the interface to notify the JDT UI regarding the status of tests.331     * When running tests on multiple devices, there is a {@link TestRunListener} that listens332     * to results from each device. Rather than all such listeners directly notifying JDT333     * from different threads, they all notify this class which notifies JDT. In addition,334     * the {@link #testRunEnded(String, long)} method make sure that JDT is notified that the335     * test run has completed only when tests on all devices have completed.336     * */337    private class TestResultsNotifier {338        private final IListensToTestExecutions mListener;339        private final int mDeviceCount;340        private int mCompletedRuns;341        private long mMaxElapsedTime;342        public TestResultsNotifier(IListensToTestExecutions listener, int nDevices) {343            mListener = listener;344            mDeviceCount = nDevices;345        }346        public synchronized void testEnded(TestCaseReference ref) {347            mListener.notifyTestEnded(ref);348        }349        public synchronized void testFailed(TestReferenceFailure ref) {350            mListener.notifyTestFailed(ref);351        }352        public synchronized void testRunEnded(String mDeviceName, long elapsedTime) {353            mCompletedRuns++;354            if (elapsedTime > mMaxElapsedTime) {355                mMaxElapsedTime = elapsedTime;356            }357            if (mCompletedRuns == mDeviceCount) {358                notifyTestRunEnded(mMaxElapsedTime);359            }360        }361        public synchronized void testStarted(TestCaseReference testId) {362            mListener.notifyTestStarted(testId);363        }364    }365    /**366     * TestRunListener that communicates results in real-time back to JDT JUnit via the367     * {@link TestResultsNotifier}.368     * */369    private class TestRunListener implements ITestRunListener {370        private final String mDeviceName;371        private TestResultsNotifier mNotifier;372        /**373         * Constructs a {@link ITestRunListener} that listens for test results on given device.374         * @param deviceName device on which the tests are being run375         * @param notifier notifier to inform of test status376         */377        public TestRunListener(String deviceName, TestResultsNotifier notifier) {378            mDeviceName = deviceName;379            mNotifier = notifier;380        }381        @Override382        public void testEnded(TestIdentifier test, Map<String, String> ignoredTestMetrics) {383            mNotifier.testEnded(new TestCaseReference(mDeviceName, test));384        }385        @Override386        public void testFailed(TestIdentifier test, String trace) {387            TestReferenceFailure failure =388                new TestReferenceFailure(new TestCaseReference(mDeviceName, test),389                        MessageIds.TEST_FAILED, trace, null);390            mNotifier.testFailed(failure);391        }392        @Override393        public void testAssumptionFailure(TestIdentifier test, String trace) {394            TestReferenceFailure failure =395                new TestReferenceFailure(new TestCaseReference(mDeviceName, test),396                        MessageIds.TEST_FAILED, trace, null);397            mNotifier.testFailed(failure);398        }399        @Override400        public void testIgnored(TestIdentifier test) {401            // TODO: implement me?402        }403        @Override404        public synchronized void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {405            mNotifier.testRunEnded(mDeviceName, elapsedTime);406            AdtPlugin.printToConsole(mLaunchInfo.getProject(),407                    LaunchMessages.RemoteAdtTestRunner_RunCompleteMsg);408        }409        @Override410        public synchronized void testRunFailed(String errorMessage) {411            reportError(errorMessage);412        }413        @Override414        public synchronized void testRunStarted(String runName, int testCount) {415            // ignore416        }417        @Override418        public synchronized void testRunStopped(long elapsedTime) {419            notifyTestRunStopped(elapsedTime);420            AdtPlugin.printToConsole(mLaunchInfo.getProject(),421                    LaunchMessages.RemoteAdtTestRunner_RunStoppedMsg);422        }423        @Override424        public synchronized void testStarted(TestIdentifier test) {425            TestCaseReference testId = new TestCaseReference(mDeviceName, test);426            mNotifier.testStarted(testId);427        }428    }429    /** Override parent to get extra logs. */430    @Override431    protected boolean connect() {432        boolean result = super.connect();433        if (!result) {434            AdtPlugin.printErrorToConsole(mLaunchInfo.getProject(),435                    "Connect to Eclipse test result listener failed");436        }437        return result;438    }439    /** Override parent to dump error message to console. */440    @Override441    public void runFailed(String message, Exception exception) {442        if (exception != null) {443            AdtPlugin.logAndPrintError(exception, mLaunchInfo.getProject().getName(),444                    "Test launch failed: %s", message);445        } else {446            AdtPlugin.printErrorToConsole(mLaunchInfo.getProject(), "Test launch failed: %s",447                    message);448        }449    }450}...Source:JUnitExecutor.java  
1package com.tngtech.jgiven.junit;2import org.junit.runner.Description;3import org.junit.runner.JUnitCore;4import org.junit.runner.Request;5import org.junit.runner.notification.RunListener;6import com.tngtech.jgiven.impl.Config;7import com.tngtech.jgiven.report.model.ReportModel;8import com.tngtech.jgiven.testframework.TestExecutionResult;9import com.tngtech.jgiven.testframework.TestExecutor;10public class JUnitExecutor extends TestExecutor {11    public JUnitExecutor() {}12    private JUnitExecutionResult execute( RequestSupplier requestSupplier ) {13        JUnitCore junitCore = new JUnitCore();14        JUnitExecutionResult result = new JUnitExecutionResult();15        TestRunListener runListener = new TestRunListener();16        junitCore.addListener( runListener );17        Config.config().setReportEnabled( false );18        result.result = junitCore.run( requestSupplier.supply() );19        Config.config().setReportEnabled( true );20        result.reportModel = runListener.reportModel;21        return result;22    }23    interface RequestSupplier {24        Request supply();25    }26    @Override27    public TestExecutionResult execute( final Class<?> testClass, final String testMethod ) {28        return execute( new RequestSupplier() {29            @Override30            public Request supply() {31                return Request.method( testClass, testMethod );32            }33        } );34    }35    @Override36    public TestExecutionResult execute(final Class<?> testClass ) {37        return execute( new RequestSupplier() {38            @Override39            public Request supply() {40                return Request.aClass( testClass );41            }42        } );43    }44    static class TestRunListener extends RunListener {45        ReportModel reportModel;46        @Override47        public void testIgnored( Description description ) throws Exception {48            getReportModel( description );49        }50        @Override51        public void testFinished( Description description ) throws Exception {52            getReportModel( description );53        }54        private void getReportModel( Description description ) {55            reportModel = ScenarioModelHolder.getInstance().getReportModel( description.getTestClass() );56        }57    }58}...Source:TestRunListener.java  
1package junit.runner;2public interface TestRunListener {3  public static final int STATUS_ERROR = 1;4  5  public static final int STATUS_FAILURE = 2;6  7  void testRunStarted(String paramString, int paramInt);8  9  void testRunEnded(long paramLong);10  11  void testRunStopped(long paramLong);12  13  void testStarted(String paramString);14  15  void testEnded(String paramString);16  17  void testFailed(int paramInt, String paramString1, String paramString2);18}19/* Location:              /home/arpit/Downloads/Picking-Tool-6.5.2.jar!/junit/runner/TestRunListener.class20 * Java compiler version: 5 (49.0)21 * JD-Core Version:       1.1.322 */...Interface TestRunListener
Using AI Code Generation
1public class TestListener implements TestRunListener {2    public void testRunStarted(String testName, int testCount) {3        System.out.println("Test run started: " + testName);4    }5    public void testStarted(String testName) {6        System.out.println("Test started: " + testName);7    }8    public void testFailed(int status, Test test, Throwable t) {9        System.out.println("Test failed: " + test);10    }11    public void testEnded(String testName) {12        System.out.println("Test ended: " + testName);13    }14    public void testRunEnded(long elapsedTime) {15        System.out.println("Test run ended: " + elapsedTime);16    }17    public void testRunStopped(long elapsedTime) {18        System.out.println("Test run stopped: " + elapsedTime);19    }20}21public class TestRunner {22    public static void main(String[] args) {23        TestSuite suite = new TestSuite();24        suite.addTestSuite(TestClass.class);25        TestResult result = new TestResult();26        result.addListener(new TestListener());27        suite.run(result);28    }29}30Test failed: test2(junit.framework.AssertionFailedError)31Test failed: test3(java.lang.NullPointerException)32Test failed: test4(java.lang.NullPointerException)33Test failed: test5(java.lang.NullPointerException)34Test failed: test6(java.lang.NullInterface TestRunListener
Using AI Code Generation
1import junit.runner.*;2import java.io.*;3{4    public void testRunStarted(String runName, int testCount)5    {6        System.out.println("Test Run Started");7    }8    public void testRunStopped(long elapsedTime)9    {10        System.out.println("Test Run Stopped");11    }12    public void testRunEnded(long elapsedTime)13    {14        System.out.println("Test Run Ended");15    }16    public void testStarted(String testName)17    {18        System.out.println("Test Started: " + testName);19    }20    public void testEnded(String testName)21    {22        System.out.println("Test Ended: " + testName);23    }24    public void testFailed(int status, Test test, Throwable t)25    {26        System.out.println("Test Failed: " + test.toString() + " " + t.toString());27    }28}29import junit.textui.*;30import java.io.*;31{32    public static void main(String[] args)33    {34        TestListener listener = new TestListener();35        TestRunner runner = new TestRunner();36        runner.addTestListener(listener);37        runner.run(new TestSuite(TestListener.class));38    }39}40import junit.swingui.*;41import java.io.*;42{43    public static void main(String[] args)44    {45        TestListener listener = new TestListener();46        TestRunner runner = new TestRunner();47        runner.addTestListener(listener);48        runner.run(new TestSuite(TestListener.class));49    }50}51import junit.awtui.*;52import java.io.*;53{54    public static void main(String[] args)55    {56        TestListener listener = new TestListener();57        TestRunner runner = new TestRunner();58        runner.addTestListener(listener);59        runner.run(new TestSuite(TestListener.class));60    }61}62import junit.ui.*;63import java.io.*;64{65    public static void main(String[] args)66    {67        TestListener listener = new TestListener();68        TestRunner runner = new TestRunner();69        runner.addTestListener(listener);70        runner.run(new TestSuite(TestListener.class));71    }72}73import junit.runnerInterface TestRunListener
Using AI Code Generation
1import junit.runner.*;2public class TestRunner implements TestRunListener {3public void testEnded(String testName) {4System.out.println("Test ended: " + testName);5}6public void testFailed(int status, Test test, Throwable t) {7System.out.println("Test failed: " + test + " with status " + status);8}9public void testStarted(String testName) {10System.out.println("Test started: " + testName);11}12public static void main(String[] args) {13TestSuite suite = new TestSuite();14suite.addTest(new TestClass("testMethod"));15TestRunner runner = new TestRunner();16suite.run(runner);17}18}Interface TestRunListener
Using AI Code Generation
1import junit.framework.*;2import java.util.*;3import java.io.*;4import java.lang.reflect.*;5import java.net.*;6import java.util.jar.*;7import java.util.zip.*;8import java.util.Enumeration;9import junit.runner.*;10import junit.runner.TestRunListener;11import junit.runner.BaseTestRunner;12public class TestRunner extends BaseTestRunner {13    public static void main(String[] args) {14        TestRunner aTestRunner = new TestRunner();15        aTestRunner.start(args);16    }17    public TestRunner() {18        this(System.out);19    }20    public TestRunner(PrintWriter writer) {21        fWriter = writer;22    }23    public void start(String[] args) {24        try {25            TestResult r = doRun(suite(), false);26            if (!r.wasSuccessful())27                System.exit(FAILURE_EXIT);28            System.exit(SUCCESS_EXIT);29        } catch(Exception e) {30            System.err.println(e.getMessage());31            System.exit(EXCEPTION_EXIT);32        }33    }34    public TestResult doRun(Test suite, boolean wait) {35        fPrinter = createPrinter();36        TestResult result = createTestResult();37        result.addListener(fPrinter);38        long startTime = System.currentTimeMillis();39        suite.run(result);40        long endTime = System.currentTimeMillis();41        long runTime = endTime-startTime;42        fPrinter.print(result, runTime);43        return result;44    }45    protected TestResult createTestResult() {46        return new TestResult();47    }48    protected TestSuite getTest(String suiteClassName) throws ClassNotFoundException {49        Class<?> suiteClass= getSuiteClass(suiteClassName);50        try {51            Method suiteMethod= suiteClass.getMethod("suite", new Class[0]);52            return (TestSuite) suiteMethod.invoke(null, new Class[0]);53        } catch (NoSuchMethodException e) {54        } catch (IllegalAccessException e) {55        } catch (InvocationTargetException e) {56        }57        return new TestSuite(suiteClass);58    }59    protected Class<?> getSuiteClass(String suiteClassName) throws ClassNotFoundException {60        return Class.forName(suiteClassName);61    }62    protected TestSuite newTestSuite(Class<?> theClass) {63        return new TestSuite(theClass);64    }65    protected TestSuite newTestSuite(Class<?> theClass, String name) {66        return new TestSuite(theClass, name);67    }68    protected void runFailed(String message) {69        System.err.println(message);Interface TestRunListener
Using AI Code Generation
1import junit.runner.*;2import java.io.*;3import java.util.*;4import java.lang.reflect.*;5import java.text.*;6import java.util.regex.*;7import java.net.*;8public class TestRunListener implements TestListener {9    public void testStarted(String testName) {10        System.out.println("Test started: " + testName);11    }12    public void testEnded(String testName) {13        System.out.println("Test ended: " + testName);14    }15    public void testFailed(int status, Test test, Throwable t) {16        System.out.println("Test failed: " + test + " with status " + status);17    }18}LambdaTest also has a detailed JUnit tutorial explaining its features, importance, advanced use cases, best practices, and more to help you get started with running your automation testing scripts.
Here are the detailed JUnit testing chapters to help you get started:
You can also check out our JUnit certification if you wish to take your career in Selenium automation testing with JUnit to the next level.
Get 100 minutes of automation test minutes FREE!!
