Dans la plupart des cas, l'écriture de tests JUnit se base sur plusieurs classes, contenant chacune des méthodes représentant les différents cas à tester. Ce concept permet l'organisation de tests visant à mettre à l'épreuve une série de fonctionnalités (métier ou techniques) dans différents scénarios. Or il est parfois nécessaire de réaliser le processus inverse : éprouver le même scénario plusieurs fois à partir d'un jeu de données précis...
Pour cela, le framework propose, dans sa dernière version, un nouveau runner permettant de réaliser ce genre d'action : les tests paramétrés. Voici le code à mettre en place :
import java.io.File; import java.util.ArrayList; import java.util.Collection; import junit.framework.TestCase; 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 JUnitParameters extends TestCase { private File ctlFile; protected static Collection<Object[]> filesToTest = new ArrayList<Object[]>(); @Parameters public static Collection<Object[]> getTestsFiles() throws Exception { return parseFolderForFilesToTest("C:\\JUnit"); } protected static Collection<Object[]> parseFolderForFilesToTest(String folderPath) throws Exception { File folder = new File(folderPath); parseFolder(folder); return filesToTest; } private static void parseFolder(File folder) throws Exception { for (File f : folder.listFiles()) { if (f.isDirectory()) { parseFolder(f); } else { filesToTest.add(new Object[] { f }); } } } /** Parameters inject by JUnit */ public JUnitParameters(File file) { ctlFile = file; } @Test public void testGenerate() { assertTrue("Le fichier est vide!", ctlFile.exists() && ctlFile.length()>0); } }
La première annotation @RunWith
permet d'indiquer au runner qu'il s'agit d'un test paramétré. Il va donc avant toute action (avant même le @BeforeClass
) appeler la méthode marquée par @Parameters
afin de constituer le jeu de données. Chaque tableau d'objets est par la suite injecté au constructeur du test, rappelé à chaque jeu de données.
La suite du test s'exécute de manière classique, les méthodes marquées @Test
sont appelées successivement par introspection.
Comme on peut le voir ci-dessous, ma classe ne contenant qu'une méthode de test a été exécutée autant de fois que nécessaire :
0 commentaires:
Enregistrer un commentaire