96 votes

Test JUnit avec nombre de tests dynamique

Dans notre projet, j'ai plusieurs JUnit tests, par exemple tous les fichiers d'un répertoire et d'exécuter un test sur elle. Si j'mettre en œuvre un testEveryFileInDirectory méthode dans le cas de test, cela apparaît comme un seul test peut échouer ou réussir. Mais je suis intéressé par les résultats sur chacun des fichiers. Comment puis-je écrire un cas de test / TestSuite à ce que chaque fichier apparaît comme un critère distinct par exemple, dans le graphique lanceur d'eclipse? (Codage explicite d'une méthode de test pour chaque fichier n'est pas une option.)

Comparer aussi la question ParameterizedTest avec un nom dans Eclipse Lanceur.

105voto

bruno conde Points 28120

Jetez un oeil à Paramétrée Tests dans JUnit 4.

En fait je l'ai fait il y a quelques jours. Je vais essayer de l'expliquer ...

Construisez d'abord votre classe de test normalement, comme vous, où tout simplement de le tester avec un fichier d'entrée. Décorer à votre classe:

@RunWith(Parameterized.class)

Construire un constructeur qui prend en entrée qui va changer dans chaque appel d'essai (dans ce cas, il peut être le fichier lui-même)

Ensuite, construire une méthode statique qui renvoie une Collection de tableaux. Chaque tableau dans la collection contiendra les arguments d'entrée pour votre constructeur de la classe par exemple, le fichier. Décorer cette méthode:

@Parameters

Voici un exemple de classe.

@RunWith(Parameterized.class)
public class ParameterizedTest {

    private File file;

    public ParameterizedTest(File file) {
        this.file = file;
    }

    @Test
    public void test1() throws Exception {  }

    @Test
    public void test2() throws Exception {  }

    @Parameters
    public static Collection<Object[]> data() {
        // load the files as you want
        Object[] fileArg1 = new Object[] { new File("path1") };
        Object[] fileArg2 = new Object[] { new File("path2") };

        Collection<Object[]> data = new ArrayList<Object[]>();
        data.add(fileArg1);
        data.add(fileArg2);
        return data;
    }
}

Vérifiez également cet exemple

27voto

McDowell Points 62645

JUnit 3

 public class XTest extends TestCase {

    public File file;

    public XTest(File file) {
    	super(file.toString());
    	this.file = file;
    }

    public void testX() {
    	fail("Failed: " + file);
    }

}

public class XTestSuite extends TestSuite {

    public static Test suite() {
    	TestSuite suite = new TestSuite("XTestSuite");
    	File[] files = new File(".").listFiles();
    	for (File file : files) {
    		suite.addTest(new XTest(file));
    	}
    	return suite;
    }

}
 

JUnit 4

 import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class TestY {

    @Parameters
    public static Collection<Object[]> getFiles() {
    	Collection<Object[]> params = new ArrayList<Object[]>();
    	for (File f : new File(".").listFiles()) {
    		Object[] arr = new Object[] { f };
    		params.add(arr);
    	}
    	return params;
    }

    private File file;

    public TestY(File file) {
    	this.file = file;
    }

    @Test
    public void testY() {
    	fail(file.toString());
    }

}
 

3voto

Michael Borgwardt Points 181658

Cela devrait être possible dans JUnit 3 en héritant de TestSuite et en surchargeant la méthode tests() pour répertorier les fichiers et pour chaque renvoi une instance d'une sous-classe de TestCase qui prend le nom de fichier en tant que paramètre de constructeur et possède une méthode de test qui teste le fichier indiqué dans le constructeur.

Dans JUnit 4, cela pourrait être encore plus facile.

1voto

Aldaviva Points 356

Si TestNG est une option, vous pouvez utiliser les Paramètres avec DataProviders.

Chaque fichier de test aura son résultat indiqué dans le texte du rapport ou de l'Éclipse du plugin TestNG de l'INTERFACE utilisateur. Le nombre total de tests de la compteront chacun de vos fichiers individuellement.

Ce comportement diffère de JUnit Théories, dans lequel tous les résultats sont regroupés sous un même "théorie" et qu'il ne compte que 1 test. Si vous voulez séparer de rapports sur les résultats dans JUnit, vous pouvez essayer Paramétrée Tests.

Test et entrées

public class FileTest {

    @DataProvider(name="files")
    public File[][] getFiles(){
        return new File[][] {
            { new File("file1") },
            { new File("file2") }
        };
        // or scan a directory
    }

    @Test(dataProvider="files")
    public void testFile(File file){
        //run tests on file
    }
}

Exemple de sortie

PASSED: testFile(file1)
PASSED: testFile(file2)

===============================================
    Default test
    Tests run: 2, Failures: 0, Skips: 0
===============================================

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X