Frage

Von Eclipse kann ich einfach alle JUnit-Tests in meiner Anwendung.

Ich möchte in der Lage sein, die Tests auf den Zielsystemen aus der Anwendung Glas laufen, ohne von Eclipse (oder Ant oder Maven oder anderen Entwicklungs-Tool).

Ich kann sehen, wie einen bestimmten Test oder eine Suite von der Kommandozeile ausgeführt werden.

Ich konnte manuell eine Suite schaffen die Tests alle in meiner Anwendung Auflistung, aber das scheint fehleranfällig. - Ich bin sicher, irgendwann ich einen Test erstellen werden und vergessen, es zu der Suite hinzufügen

Die Eclipse JUnit-Plugin hat einen Assistenten, um eine Test-Suite zu erstellen, aber aus irgendeinem Grunde ist es nicht meine Testklassen „sehen“. Es kann für JUnit-3-Tests, nicht JUnit 4 kommentierten Tests suchen werden.

Ich konnte ein Werkzeug schreiben, das die Suite automatisch durch Scannen der Quelldateien erstellen würde.

Oder ich könnte Code schreiben, so dass die Anwendung scannen würde seine eigene JAR-Datei für Tests (entweder durch Namenskonvention oder für die @Test Anmerkung suchen).

Es scheint, wie es sollte ein einfacherer Weg geben. Was bin ich?

War es hilfreich?

Lösung 2

Ich lief in ein kleines Problem mit meiner letzten Lösung. Wenn ich „alle Tests“ von Eclipse-lief lief sie zweimal, weil sie die einzelnen Tests und die Suite lief. Ich hätte um das funktionierte, aber dann merkte ich es eine einfachere Lösung war:

package suneido;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class RunAllTests {

    public static void run(String jarfile) {
        String[] tests = findTests(jarfile);
        org.junit.runner.JUnitCore.main(tests);
    }

    private static String[] findTests(String jarfile) {
        ArrayList<String> tests = new ArrayList<String>();
        try {
            JarFile jf = new JarFile(jarfile);
            for (Enumeration<JarEntry> e = jf.entries(); e.hasMoreElements();) {
                String name = e.nextElement().getName();
                if (name.startsWith("suneido/") && name.endsWith("Test.class")
                        && !name.contains("$"))
                    tests.add(name.replaceAll("/", ".")
                            .substring(0, name.length() - 6));
            }
            jf.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return tests.toArray(new String[0]);
    }

    public static void main(String[] args) {
        run("jsuneido.jar");
    }

}

Andere Tipps

Nach einem kürzlichen Thread auf der JUnit-Mailingliste, ClasspathSuite können alle JUnit-Tests auf dem classpath sammeln und ausführen. Es ist nicht genau das, was Sie wollen, da es sich um eine Klasse-Ebene Anmerkung ist, aber die Quelle ist verfügbar, so Sie in der Lage sein könnte, seinen internen Ermittlungsmechanismus zu verlängern.

Basierend auf http://burtbeckwith.com/blog/?p=52 ich kam mit dem Follow-up. Es scheint gut zu funktionieren.

Ich kann es läuft aus meinem Code mit:

org.junit.runner.JUnitCore.main("suneido.AllTestsSuite");

Ein Schwachpunkt ist, dass es auf einer Namenskonvention ( „Test“ Suffix) verlässt sich Tests zu identifizieren. Ein weiterer Schwachpunkt ist, dass der Name der JAR-Datei ist hart codiert.

package suneido;

import java.io.IOException;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.model.InitializationError;

/**
 * Discovers all JUnit tests in a jar file and runs them in a suite.
 */
@RunWith(AllTestsSuite.AllTestsRunner.class)
public final class AllTestsSuite {
    private final static String JARFILE = "jsuneido.jar";

    private AllTestsSuite() {
    }

    public static class AllTestsRunner extends Suite {

        public AllTestsRunner(final Class<?> clazz) throws InitializationError {
            super(clazz, findClasses());
        }

        private static Class<?>[] findClasses() {
            List<String> classFiles = new ArrayList<String>();
            findClasses(classFiles);
            List<Class<?>> classes = convertToClasses(classFiles);
            return classes.toArray(new Class[classes.size()]);
        }

        private static void findClasses(final List<String> classFiles) {
            JarFile jf;
            try {
                jf = new JarFile(JARFILE);
                for (Enumeration<JarEntry> e = jf.entries(); e.hasMoreElements();) {
                    String name = e.nextElement().getName();
                    if (name.startsWith("suneido/") && name.endsWith("Test.class")
                            && !name.contains("$"))
                        classFiles.add(name.replaceAll("/", ".")
                                .substring(0, name.length() - 6));
                }
                jf.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        private static List<Class<?>> convertToClasses(
                final List<String> classFiles) {
            List<Class<?>> classes = new ArrayList<Class<?>>();
            for (String name : classFiles) {
                Class<?> c;
                try {
                    c = Class.forName(name);
                }
                catch (ClassNotFoundException e) {
                    throw new AssertionError(e);
                }
                if (!Modifier.isAbstract(c.getModifiers())) {
                    classes.add(c);
                }
            }
            return classes;
        }
    }

}

Ich habe nicht versucht, als der noch, aber in diesem Blog vor kurzem kam: http: // burtbeckwith.com/blog/?p=52

Der Autor stellt eine Klasse, die alle Ihre junits und führt sie entdeckt, so dass, wenn Sie diese zu Ihrem Projekt in Steckplatz kann es die Fähigkeit erforderlich zur Verfügung stellen?

Hope, das hilft.

das Java-Projekt Erhalten und das Projekt übergeben

JUnitLaunchShortcut jUnitLaunchShortcut = new JUnitLaunchShortcut();
jUnitLaunchShortcut.launch("Pass the Java Project containing JUnits Classes", "run");

Sie können auch mit ANT die integrierte Task hat. Schreiben Sie ANT-Skript und führen Sie es auf Zielmaschine. ANT könnte Bericht als Ergebnis erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top