Come faccio a livello di codice eseguire tutti i test JUnit nella mia applicazione Java?

StackOverflow https://stackoverflow.com/questions/2411938

  •  18-09-2019
  •  | 
  •  

Domanda

Da Eclipse posso facilmente eseguire tutti i test JUnit nella mia applicazione.

Vorrei poter eseguire i test sui sistemi di destinazione dal barattolo applicazione, senza Eclipse (o formica o Maven o qualsiasi altro strumento di sviluppo).

Posso vedere come eseguire un test specifico o suite dalla riga di comando.

ho potuto creare manualmente una suite che elenca tutti i test nella mia richiesta, ma che sembra soggetto a errori -. Sono sicuro che ad un certo punto creerò un test e dimenticare per aggiungerlo alla suite

Il plugin Eclipse JUnit ha una procedura guidata per creare una suite di test, ma per qualche motivo non "vede" i miei classi di test. Può essere alla ricerca di JUnit 3 test, non JUnit 4 annotato test.

Potrei scrivere uno strumento che creerebbe automaticamente la suite attraverso la scansione dei file di origine.

Oppure avrei potuto scrivere codice in modo che la domanda sarebbe eseguire la scansione di un proprio file jar per le prove (sia per convenzione di denominazione o cercando per l'annotazione @Test).

Sembra che ci dovrebbe essere un modo più semplice. Che cosa mi manca?

È stato utile?

Soluzione 2

Mi sono imbattuto in un piccolo problema con la mia ultima soluzione. Se ho eseguito "tutte le prove" da Eclipse correvano due volte perché hanno finito le prove individuali e la suite. Avrei potuto lavorato in tutto questo, ma poi ho capito che c'era una soluzione più semplice:

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");
    }

}

Altri suggerimenti

un recente thread sul JUnit mailing list, ClasspathSuite può raccogliere ed eseguire tutti i test JUnit sul classpath. Non è esattamente quello che si vuole, dal momento che è un'annotazione a livello di classe, ma la fonte è disponibile, in modo da essere in grado di estendere il suo meccanismo di scoperta interna.

In base a http://burtbeckwith.com/blog/?p=52 mi si avvicinò con il seguente. Sembra che funzioni bene.

posso eseguirlo da dentro il mio codice con:

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

Un punto debole è che si basa su una convenzione di denominazione (suffisso "Test") per identificare le prove. Un altro punto debole è che il nome del file jar è rigido codificato.

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;
        }
    }

}

Non ho ancora provato questo come di, ma sono imbattuto in questo blog di recente: http: // burtbeckwith.com/blog/?p=52

L'autore fornisce una classe che scopre tutte le junits e li esegue, quindi se si SLOT questo al vostro progetto, può fornire la capacità necessaria?

Spero che questo aiuti.

Prendi il progetto Java e passare il progetto

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

È inoltre possibile utilizzare ANT , che ha compito built-in. Scrivere lo script ANT ed eseguire sul computer di destinazione. ANT potrebbe creare report come risultato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top