Junit et plusieurs instances d'un meme objet

Bon alors :
Je serialise des objets identiques avec des variables identiques mais des valeurs differentes.
Je veux faire une suite de test junit sur ces objets.
Or si les objets ont le meme nom (par un this.setName("testlaunch"); (qui doit avoir le nom d’une fonction lancée par junit), il ne me fait qu’un seul test.
Si je ne met pas de this.setName("testlaunch"); il gueule en me mettant un junit.framework.AssertionFailedError: TestCase.fName cannot be null.
Je ne sais pas trop quoi faire dans l’idéal je genererais du xml, qui serait deserialisé en objets identiques mais dont les variables auraient des valeurs differentes et chaque objet ferait l’objet d’un test unitaire.
voici le code

public class LanceurRegleGestion extends TestSuite
{



    public static Test suite()
    {
        Class maClasse = null;
        TestSuite suite = new TestSuite();
        
        String filtre = ".*.xml";
        // on compile le pattern pour l'expression réguliere
        Pattern p = Pattern.compile(filtre);
        String path = "D:/Documents/workspace/Solipsisme/src/ReglesGestion/XML/";
        // on liste les fichiers du repertoire
        String [] u = new File(path).list();
        // on parcours la liste de fichier
        System.out.println("Initialisation");

        
        for (int i=0; i<u.length;i++)
        {
            // on crée un matcher
            Matcher m = p.matcher(u[i]);
            // si ca match
            if ( m.matches())
            {
                try
                {
                    System.out.println(u[i]);
                    Application app = (Application) XMLTools.decodeFromFile(path+u[i]);
                    suite.addTest(app);
                }
                catch (Exception e)
                {
                    System.out.println(e);
                }
            }
        }   
        return suite;
    }  
}

et le code de l’objet serialisé

public class Application extends TestCase {
private String nomappli;
private String id2_1;
private String id3_1;
private String id4_1;
private String id2_2;
private String id3_2;
private String id4_2;
private String id5_2;
private String id6_2;
private String id7_2;
private String id8_2;
private String id9_2;
private String id2_3;
private String id3_3;
private String id4_3;
private String id2_4;
private String id3_4;
private String id4_4;
private String id2_5;
private  String id3_5;
private String id4_5;
private String id5_5;
private String id6_5;
private String id7_5;
private static Selenium selenium;
public Application(String nomappli,String id2_1,String id3_1,String id4_1,String id2_2,String id3_2,String id4_2,String id5_2,String id6_2,String id7_2,String id8_2,String id9_2,String id2_3,String id3_3,String id4_3,String id2_4,String id3_4,String id4_4,String id2_5, String id3_5,String id4_5,String id5_5,String id6_5,String id7_5)
{
this.setName("testlaunch");
this.nomappli = nomappli;
this.id2_1 = id2_1;
this.id3_1 = id3_1;
this.id4_1 = id4_1;
this.id2_2 = id2_2;
this.id3_2 = id3_2;
this.id4_2 = id4_2;
this.id5_2 = id5_2;
this.id6_2 = id6_2;
this.id7_2 = id7_2;
this.id8_2 = id8_2;
this.id9_2 = id9_2;
this.id2_3 = id2_3;
this.id3_3 = id3_3;
this.id4_3 = id4_3;
this.id2_4 = id2_4;
this.id3_4 = id3_4;
this.id4_4 = id4_4;
this.id2_5 = id2_5;
this.id3_5 = id3_5;
this.id4_5 = id4_5;
this.id5_5 = id5_5;
this.id6_5 = id6_5;
this.id7_5 = id7_5;
}

public Application(){
    
}
public String toString()
{
return getNomappli();
}
public void setNomappli(String nomappli)
{
this.nomappli = nomappli;
}

public String getNomappli()
{
return this.nomappli;
}
public void setId2_1(String id2_1)
{
this.id2_1 = id2_1;
}

public String getId2_1()
{
return this.id2_1;
}
public void setId3_1(String id3_1)
{
this.id3_1 = id3_1;
}

public String getId3_1()
{
return this.id3_1;
}
public void setId4_1(String id4_1)
{
this.id4_1 = id4_1;
}

public String getId4_1()
{
return this.id4_1;
}
public void setId2_2(String id2_2)
{
this.id2_2 = id2_2;
}

public String getId2_2()
{
return this.id2_2;
}
public void setId3_2(String id3_2)
{
this.id3_2 = id3_2;
}

public String getId3_2()
{
return this.id3_2;
}
public void setId4_2(String id4_2)
{
this.id4_2 = id4_2;
}

public String getId4_2()
{
return this.id4_2;
}
public void setId5_2(String id5_2)
{
this.id5_2 = id5_2;
}

public String getId5_2()
{
return this.id5_2;
}
public void setId6_2(String id6_2)
{
this.id6_2 = id6_2;
}

public String getId6_2()
{
return this.id6_2;
}
public void setId7_2(String id7_2)
{
this.id7_2 = id7_2;
}

public String getId7_2()
{
return this.id7_2;
}
public void setId8_2(String id8_2)
{
this.id8_2 = id8_2;
}

public String getId8_2()
{
return this.id8_2;
}
public void setId9_2(String id9_2)
{
this.id9_2 = id9_2;
}

public String getId9_2()
{
return this.id9_2;
}
public void setId2_3(String id2_3)
{
this.id2_3 = id2_3;
}

public String getId2_3()
{
return this.id2_3;
}
public void setId3_3(String id3_3)
{
this.id3_3 = id3_3;
}

public String getId3_3()
{
return this.id3_3;
}
public void setId4_3(String id4_3)
{
this.id4_3 = id4_3;
}

public String getId4_3()
{
return this.id4_3;
}
public void setId2_4(String id2_4)
{
this.id2_4 = id2_4;
}

public String getId2_4()
{
return this.id2_4;
}
public void setId3_4(String id3_4)
{
this.id3_4 = id3_4;
}

public String getId3_4()
{
return this.id3_4;
}
public void setId4_4(String id4_4)
{
this.id4_4 = id4_4;
}

public String getId4_4()
{
return this.id4_4;
}
public void setId2_5(String id2_5)
{
this.id2_5 = id2_5;
}

public String getId2_5()
{
return this.id2_5;
}
public void setId3_5( String id3_5)
{
this.id3_5 = id3_5;
}

public String getId3_5()
{
return this.id3_5;
}
public void setId4_5(String id4_5)
{
this.id4_5 = id4_5;
}

public String getId4_5()
{
return this.id4_5;
}
public void setId5_5(String id5_5)
{
this.id5_5 = id5_5;
}

public String getId5_5()
{
return this.id5_5;
}
public void setId6_5(String id6_5)
{
this.id6_5 = id6_5;
}

public String getId6_5()
{
return this.id6_5;
}
public void setId7_5(String id7_5)
{
this.id7_5 = id7_5;
}

public String getId7_5()
{
return this.id7_5;
}

public void setSelenium(Selenium selenium)
{
this.selenium = selenium;
}

public Selenium getSelenium()
{
return this.selenium;
}

public final static void login()
{
    selenium.open("apj/ident");
    selenium.type("username", "hsuzumiya-cp");
    selenium.type("password", "1");
    selenium.click("enterButton");
    selenium.waitForPageToLoad("9999999");
}

public void  testlaunch()
{
    generique(this.nomappli,this.id2_1,this.id3_1,this.id4_1,this.id2_2,this.id3_2,this.id4_2,this.id5_2,this.id6_2,this.id7_2,this.id8_2,this.id9_2,this.id2_3,this.id3_3,this.id4_3,this.id2_4,this.id3_4,this.id4_4,this.id2_5,this.id3_5,this.id4_5,this.id5_5,this.id6_5,this.id7_5);
}
public void setUp() throws Exception
{
    System.out.println("Initialisation");

    selenium = new DefaultSelenium("127.0.0.1",4444,"*iexplore", "http://hsuzumiya/");
    selenium.start();
    selenium.setTimeout("90000");
    selenium.setSpeed("500");
    login();
}



public void generique(String nomappli,String id2_1,String id3_1,String id4_1,String id2_2,String id3_2,String id4_2,
    String id5_2,String id6_2,String id7_2,String id8_2,String id9_2,String id2_3,String id3_3,String id4_3,String id2_4,
    String id3_4,String id4_4,String id2_5, String id3_5,String id4_5,String id5_5,String id6_5,String id7_5
)
{
    System.out.println(nomappli);
    selenium.click("valider");
    selenium.waitForPageToLoad("30000");
    selenium.click("validertout");
}


public final void tearDown() throws Exception
{
    System.out.println("Killing session");
    selenium.stop();
}


}

Si quelqu’un a une idée je suis preneur.
Merci
Bussiere
un curly a celui qui trouve la reference dans la description

Je n’ai rien compris à ce que tu souhaitais faire. Mais pourquoi tu n’utiliserais pas déjà JUnit4 à la place de JUnit3 car sauf si tu as des contraintes techniques Java 1.4. JUnit4 avec les annotations est quand même beaucoup plus souple.

ca ne change rien :confused: je me suis mis a junit 4.
Le but est de désérialiser des objets et de les passer a une suite de test junit.
Voila deux fichiers xml d’exemple :

<?xml version="1.0" encoding="UTF-8"?> <java version="1.6.0_05" class="java.beans.XMLDecoder"> <object class="ReglesGestion.Application"> <void property="id2_1"> <string>id2_example1</string> </void> <void property="id2_2"> <string>id2_example2</string> </void> <void property="id2_3"> <string>id2_example3</string> </void> <void property="id2_4"> <string>id2_example4</string> </void> <void property="id2_5"> <string>id2_example5</string> </void> <void property="id3_1"> <string>id3_example1</string> </void> <void property="id3_2"> <string>id3_example2</string> </void> <void property="id3_3"> <string>id3_example3</string> </void> <void property="id3_4"> <string>id3_example4</string> </void> <void property="id3_5"> <string>id3_example5</string> </void> <void property="id4_1"> <string>id4_example1</string> </void> <void property="id4_2"> <string>id4_example2</string> </void> <void property="id4_3"> <string>id4_example3</string> </void> <void property="id4_4"> <string>id4_example4</string> </void> <void property="id4_5"> <string>id4_example5</string> </void> <void property="id5_2"> <string>id5_example2</string> </void> <void property="id5_5"> <string>id5_example5</string> </void> <void property="id6_2"> <string>id6_example2</string> </void> <void property="id6_5"> <string>id6_example5</string> </void> <void property="id7_2"> <string>id7_example2</string> </void> <void property="id7_5"> <string>id7_example5</string> </void> <void property="id8_2"> <string>id8_example2</string> </void> <void property="id9_2"> <string>id9_example2</string> </void> <void property="name"> <string>testlaunch</string> </void> <void property="nomappli"> <string>nomexampleappli</string> </void> </object> </java>

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_05" class="java.beans.XMLDecoder"> 
 <object class="ReglesGestion.Application"> 
  <void property="id2_1"> 
   <string>id2_example2</string> 
  </void> 
  <void property="id2_2"> 
   <string>id2_example2</string> 
  </void> 
  <void property="id2_3"> 
   <string>id2_example3</string> 
  </void> 
  <void property="id2_4"> 
   <string>id2_example4</string> 
  </void> 
  <void property="id2_5"> 
   <string>id2_example5</string> 
  </void> 
  <void property="id3_1"> 
   <string>id3_example1</string> 
  </void> 
  <void property="id3_2"> 
   <string>id3_example2</string> 
  </void> 
  <void property="id3_3"> 
   <string>id3_example3</string> 
  </void> 
  <void property="id3_4"> 
   <string>id3_example4</string> 
  </void> 
  <void property="id3_5"> 
   <string>id3_example5</string> 
  </void> 
  <void property="id4_1"> 
   <string>id4_example1</string> 
  </void> 
  <void property="id4_2"> 
   <string>id4_example2</string> 
  </void> 
  <void property="id4_3"> 
   <string>id4_example3</string> 
  </void> 
  <void property="id4_4"> 
   <string>id4_example4</string> 
  </void> 
  <void property="id4_5"> 
   <string>id4_example5</string> 
  </void> 
  <void property="id5_2"> 
   <string>id5_example2</string> 
  </void> 
  <void property="id5_5"> 
   <string>id5_example5</string> 
  </void> 
  <void property="id6_2"> 
   <string>id6_example2</string> 
  </void> 
  <void property="id6_5"> 
   <string>id6_example5</string> 
  </void> 
  <void property="id7_2"> 
   <string>id7_example2</string> 
  </void> 
  <void property="id7_5"> 
   <string>id7_example5</string> 
  </void> 
  <void property="id8_2"> 
   <string>id8_example2</string> 
  </void> 
  <void property="id9_2"> 
   <string>id9_example2</string> 
  </void> 
  <void property="name"> 
   <string>testlaunch</string> 
  </void> 
  <void property="nomappli"> 
   <string>nomexampleappli2</string> 
  </void> 
 </object> 
</java> 

En fait imaginons que j’ai deux instance de la meme classe.
voila le probleme en plus cour :

TestSuite suite = new TestSuite();
Application app1 = new Application("titi");
Application app2 = new Application("toto");
suite.addTest(app1);
suite.addTest(app2);

la junit m’envoie bouler en ne me faisant qu’un seul test pour les deux instance de la meme classe.

Bussiere

Après relecture et analyse de ton code, je comprend bien que tu souhaites utiliser du XML pour les données de tes tests. Mais ça ne m’étonne pas que JUnit ne veuillent pas exécuter les tests deux fois pour une même classe car à mon avis : Une classe = Un test pour lui.

En essayant de comprendre ton code, j’ai pondu le code suivant, ça reprend ton principe d’utiliser du XML pour effectuer des tests mais ça les exécutes dans un unique test. L’inconvénient c’est qu’il ne séparera pas les rapports générés par JUnit par fichier XML :

[code]

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.inject.Inject;
import com.google.inject.name.Named;

import atunit.AtUnit;
import atunit.Container;
import atunit.Unit;
import atunit.guice.GuiceContainer;

/**

  • Test the selenium application.

  • @author bob
    */
    @RunWith(AtUnit.class)
    @Container(GuiceContainer.class)
    public class ApplicationTest {
    private static final Logger logger = LoggerFactory
    .getLogger(ApplicationTest.class);

    @Unit
    @Inject
    private Selenium selenium;

    @Inject
    @Named(“xmlFilesPath”)
    private File xmlFilesFolder;

    /**

    • Do the test from XML data.
    • @param testData
    •        the XML data
      

    */
    private void doTheTest(ApplicationTestData testData) {
    selenium.click(“valider”);
    selenium.waitForPageToLoad(“30000”);
    selenium.click(“validertout”);
    Assert.assertTrue(true);
    }

    private void login() {
    selenium.open(“apj/ident”);
    selenium.type(“username”, “hsuzumiya-cp”);
    selenium.type(“password”, “1”);
    selenium.click(“enterButton”);
    selenium.waitForPageToLoad(“9999999”);
    }

    @Before
    public void before() throws Exception {
    logger.debug(“Initialisation”);
    selenium.start();
    selenium.setTimeout(“90000”);
    selenium.setSpeed(“500”);
    login();
    }

    @After
    public void after() throws Exception {
    logger.debug(“Killing session”);
    selenium.stop();
    }

    /**

    • Test the Selenium application from XML Data files.

    • This test load all data from XML files and run the doTheTest method for

    • each file.
      /
      @Test
      public void testAllXMLFile() {
      String filtre = ".
      \.xml";
      // on compile le pattern pour l’expression réguliere
      Pattern p = Pattern.compile(filtre);

      // on liste les fichiers du repertoire
      for (String filePath : xmlFilesFolder.list()) {

        // on crée un matcher
        Matcher m = p.matcher(filePath);
      
        // si ca match
        if (m.matches()) {
        	logger.debug("Test the file {}", filePath);
        	ApplicationTestData applicationTestData = XMLTools
        			.decodeFromFile(filePath);
        	doTheTest(applicationTestData);
        }
      

      }
      }
      }[/code]

Le truc c’est que justement c’est dans un seul test :confused:
je pourrais aussi générer des classes differentes java et les lancer a la suite (ce que je vais finir par faire).
Je voulais m’affranchir du une classe un test (je cherche aussi a savoir si on peut lancer des tests junit sur des methodes d’objets uniquement et plusieurs fois la meme).

Bref c’est un peu le bordel.
voila mon code de lanceur de test pour pleins de classes :

public class LanceurBon extends TestSuite
{

    /**
     * @param args
     */
    public static Test suite()
    {
        // chemin a rechercher où se trouve les 
        String path= "D:/Documents/workspace/Solipsisme/src/CahierUtilisation";
        // expression reguliere
        String filtre = ".*.java";
        // suite de test
        TestSuite suite = new TestSuite();
        // classe receptacle
        Class maClasse = null;


        // on compile le pattern pour l'expression réguliere
        Pattern p = Pattern.compile(filtre);
        // on liste les fichiers du repertoire
        String [] s = new File(path).list();
        // on parcours la liste de fichier
        for (int i=0; i<s.length;i++)
        {
            // on crée un matcher
            Matcher m = p.matcher(s[i]);
            // si ca match
            if ( m.matches())
            {
                // on vire l'extension .java
                s[i]=s[i].replace(".java", "");
                System.out.println(s[i]);
                try
                {
                    // on met la classe obtenue dans la classe vide 
                    maClasse=Class.forName("CahierUtilisation."+s[i]);
                    // on rajoute la classe a la suite de test
                    suite.addTestSuite(maClasse);
                }
                catch (ClassNotFoundException e)
                {

                }
            }
        } 
        
        path = "D:/Documents/workspace/Solipsisme/src/AnomaliesPA";
        // on liste les fichiers du repertoire
        String [] t = new File(path).list();
        // on parcours la liste de fichier
        for (int i=0; i<t.length;i++)
        {
            // on crée un matcher
            Matcher m = p.matcher(t[i]);
            // si ca match
            if ( m.matches())
            {
                // on vire l'extension .java
                t[i]=t[i].replace(".java", "");
                System.out.println(t[i]);
                try
                {
                    // on met la classe obtenue dans la classe vide 
                    maClasse=Class.forName("Anomalies."+t[i]);
                    // on rajoute la classe a la suite de test
                    suite.addTestSuite(maClasse);
                }
                catch (ClassNotFoundException e)
                {

                }
            }
        } 

        
        path = "D:/Documents/workspace/Solipsisme/src/ReglesGestion";
        // on liste les fichiers du repertoire
        String [] v = new File(path).list();
        // on parcours la liste de fichier
        for (int i=0; i<v.length;i++)
        {
            // on crée un matcher
            Matcher m = p.matcher(v[i]);
            // si ca match
            if ( m.matches())
            {
                // on vire l'extension .java
                v[i]=v[i].replace(".java", "");
                System.out.println(v[i]);
                try
                {
                    // on met la classe obtenue dans la classe vide 
                    maClasse=Class.forName("ReglesGestion."+v[i]);
                    // on rajoute la classe a la suite de test
                    suite.addTestSuite(maClasse);
                }
                catch (ClassNotFoundException e)
                {

                }
            }
        }


        return suite;
    }


}

Je pense que ta manière de faire est quand même bien crade et compliqué, mais bon tu fais comme tu le sens !

Rappel sur les best practices des tests:

Un répertoire src, un repertoire test.
La hierarchie de test est la même que src
Une classe de test par classe applicative
Une classe de test s’appelle TestMaclassApplicative comme ça c’est facile à lire
Un seul test par méthode
Une méthode de test s’appelle TestUnTrucFacileAComprendre par exemple TestExceptionLeveeEnCasDerreur

Je te conseil les cours que j’ai eu, ce sont des slides, c’est assez synthétique mais c’est globalement de très bonne qualité.
http://www.fil.univ-lille1.fr/portail/index.php?dipl=M1&sem=S8&ue=SVL onglet documents.

Pour tester plusieurs classes d’un coup (en junit4, faut vivre avec son temps):

package test.appli.bidule;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
import org.junit.runner.RunWith;
@RunWith(Suite.class)
@SuiteClasses({TestMapremiereClasse.class, TestMaDeuxiemeClasse.class})
public class TestAll {} // vide

Que rajouter de plus ?-_-

Si, on peut rajouter que c’est vachement bien de faire la démarche de mettre en place des tests.
Je t’encourage à continuer, je suis sûr que ZGoblin sera d’accord avec moi pour dire qu’on est prêt à t’aider.

Oh puis c’est pas directement lié, mais hier dans un linux mag, je suis retombé sur un coup de gueule de Jean-Pierre Troll que je t’invite à lire : http://jean-pierre-troll.blogspot.com/2009/06/labus-de-composants.html

Marf ton JP Troll il decouvre Java. Il serait temps.

Son troll article n’a pas grand chose a voir avec Java, mais plutot sur les technos a framework et leur utilisation. Faut savoir lire aussi au lieu de critiquer betement un langage.

Beaucoup de vrai, un petit peu de mauvaise foi par omission sur certains points.

[Edit]
Raison de l’édition: don’t feed the troll

Sans denier forcer le trait, je maintiens a 100% ce que j’ai dit, j’ai écrit mes premières ligne de Java il y a 13 ans, ca a pas changé. Son article a tout a voir avec Java et la philosophie de dev qui va avec. Les choix de frameworks multipliés par 100 et les applis légos/transformers qui tirent plus souvent sur l’over-ingenierie que sur l’efficacité c’est le modèle et la philosophie acceptés et défendus par Java, c’est bien ce qui a fait sa force et qui fait ses faiblesses quand c’est amené trop loin. C’est un choix de politique de gestion de l’écosystème et c’est bien ce qui fait un langage, parce que ça fait 15 ans qu’un langage c’est loin d’être seulement une syntaxe et une grammaire pour parler a son ordinateur. Faut savoir de quoi on parle aussi au lieu de critiquer bêtement les réactions.