web-dev-qa-db-fra.com

Tests sans racines

Lors de l'exécution de tous mes tests dans Eclipse (Eclipse 3.4 'Ganymede'), un test est répertorié dans la rubrique "Tests non rootés". J'utilise Junit 3.8 et ce test particulier étend TestCase. Je ne vois aucune différence entre ce test et les autres tests. Je ne me souviens pas avoir vu cela se produire dans Eclipse 3.3 (Europa).

Clarification:

Nous n'avons pas encore migré vers JUnit 4.0, nous n'utilisons donc pas d'annotations. J'ai aussi cherché sur Google et il semblait que la plupart des gens avaient des problèmes avec JUnit 4, mais je ne voyais aucune solution. À ce stade, le test réussit à la fois localement et dans CruiseControl, je ne suis donc pas inquiet, mais curieux.

La première fois que j'ai vu cela, cependant, c'était sur un test qui a échoué et qui échouait uniquement lorsqu'il était exécuté avec d'autres tests. Cela m'a conduit dans le terrier des lapins à la recherche d'une solution au problème "Sans racines" que je n'ai jamais trouvée. Finalement, j'ai trouvé le coupable dans un autre test qui n'était pas en train de démolir correctement.

Je suis d'accord, cela semble être un problème Eclipse.

31
Paul Croarkin

Finalement j'ai trouvé la solution. Le problème est que vous ne définissez pas vos scénarios de test à l'aide d'annotations mais le faites toujours à l'ancienne. Dès que vous utiliserez les annotations, vous pourrez exécuter un test à la fois.

Voici un exemple de ce à quoi un test de base devrait ressembler en utilisant des annotations:

import static org.junit.Assert.*; // Notice the use of "static" here
import org.junit.Before;
import org.junit.Test;

public class MyTests { // Notice we don't extent TestCases anymore

  @Before
  public void setUp() { // Note: It is not required to call this setUp()
    // ...
  }

  @Test
  public void doSomeTest() { // Note: method need not be called "testXXX"
    // ...
    assertTrue(1 == 1);
  }
}
21
ra9r

Je recevais aussi le message d'erreur "tests sans racines" et tout s'est passé comme par magie. Je pense que c'était dû au fait que j'utilisais Eclipse avec un projet Maven. Lorsque j'ai ajouté une nouvelle méthode à ma classe Test et lui ai donné l'annotation @Test, le message d'erreur a commencé à s'afficher lorsque j'ai essayé d'exécuter cette méthode à l'aide de l'option de menu "Exécuter en tant que test Junit"; Cependant, une fois que j'ai lancé un maven, le message des tests sans racine a disparu et je pense que c'est la solution au problème à l'avenir. 

Exécutez une construction maven car elle actualisera la classe utilisée par JUnit.

16
Bob

Si votre classe étend TestCase quelque part dans sa hiérarchie, vous devez utiliser le programme d'exécution de test JUnit 3 répertorié dans la liste déroulante sous les configurations d'exécution. L'utilisation du runner JUnit 4 (valeur par défaut, à mon avis) provoque l'apparition de ce phénomène de test sans racine.

12
laz

J'ai eu cette erreur parce que j'ai renommé ma méthode de test, puis que j'ai essayé d'exécuter le test dans Eclipse en cliquant sur la même configuration d'exécution - en faisant référence à l'ancienne méthode qui n'existait pas à présent.

6
Zoltán

Nous avons résolu le problème en nous assurant que notre projet de test était construit. Nous avons eu un problème dans le chemin de construction qui ne permettait pas à notre classe de test d'être compilée. Une fois que nous avons résolu le problème du chemin de génération, le test compilé et la "nouvelle" méthode ont pu être exécutés. Nous pouvons donc supposer que les tests "sans racine" signifient également qu'ils n'existent pas dans le binaire compilé.

3
Ben Robie

Je n'ai jamais vu cela - mais d'après ce que je peux dire en parcourant Google pendant quelques minutes, il semble que cela puisse être un bogue dans Eclipse plutôt qu'un problème avec votre test. Vous n'avez pas l'annotation @Test sur le test, je suppose? Pouvez-vous supprimer le test et le recréer, et si oui, obtenez-vous la même erreur?

2
Jim Kiley

Un autre scénario à l'origine de ce problème est que je copie/colle aveuglément une méthode qui requiert un paramètre. c'est à dire.

import org.junit.Test;

public class MyTest {

    @Test
    public void someMethod(String param) {
          // stuff
    }

}

Vous avez quelques solutions simples:

  1. définir la variable dans la méthode de test spécifique

  2. ajoutez-le en tant que variable d'instance à la classe de test

  3. créer une méthode de configuration et l'annoter avec @Before

1
Kenny Cason

Pour moi, c'était dû au problème de construction du projet. La configuration de mes dépendances maven doit être mise à jour. 

1
lwpro2

J'ai eu le même problème avec Java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

vous avez besoin du bocal hamcrest ... même question 14539072: Java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

Ce sont les deux scénarios que les erreurs sans racine apparaissent. 

  1. Si vous avez manqué l'annotation @Test avant le test.

    @Tester

    public void foo () { }

  2. S'il s'agit d'un projet Gwt et que deux modèles du même objet sont définis. Disons qu’il existe une classe de classe A et 

    @ GwtMock privé atest; 

    @ GwtMock private A a; Ceci affichera également une erreur de test sans racine.

1

J'ai eu ce problème et en mettant un " @Test " avant la méthode de test résolue! 

comme ça:

@Test public void testOne() { // ... assertTrue(1 == 1); }

1
Nuno77

Ne prolongez pas junit.framework.TestCase dans votre classe de test avec junit1.4 et cela devrait résoudre le problème. 

0
geo

Je pourrais résoudre le problème en passant de TestRunner version 4.0 à 3 dans des configurations d'exécution pour la méthode de test individuelle.

0
Krishna Kumar

Vous utilisez Hamcrest? ou une autre bibliothèque pour vous aider dans votre test ?. Vous n'utilisez pas  

import static org.junit.Assert.*;

Vérifiez si vous utilisez dans votre test:

import static org.hamcrest.MatcherAssert.assertThat;

ou autre affirmation n'est pas JUnit assert.

0
Jose Manuel Prieto

Peut-être que c'est juste une confusion logique sur le but de la méthode. Souvenons-nous: 

Par exemple. bonne méthode de test étiquetée: 

@Test
@Transactional
@Rollback(true)
public void testInsertCustomer() {  
    (...)
}

-Avec le plugin Eclipse Junit, vous pouvez exécuter cette méthode de test en utilisant le menu contextuel par-dessus la méthode (par exemple, dans l'explorateur de paquet développant la classe et les méthodes et en sélectionnant la méthode "testInsertCustomer ()" et en sélectionnant "Exécuter en tant que >> JUnit test") .

Si vous avez oublié la balise "@Test", ou simplement que la méthode n'est pas un test, mais une méthode commune (privée ou non) d'utilisation comme utilitaire pour les autres tests (par exemple, "private fillCustomerObject ()"), la méthode ne fonctionne pas. nécessite la balise "@Test", et vous ne pouvez simplement pas l'exécuter en tant que test JUnit!

Il est facile de créer une méthode utilitaire et plus tard, vous avez oublié l'objectif réel de cette méthode. Par conséquent, si vous essayez de l'exécuter en tant que test, JUnit criera "Tests sans racines". 

0
Fran G Aparicio

J'ai rencontré ce problème en ne déclarant pas également que le test était static.

0
Stubbs

Pour moi, le problème était qu’une exception avait été levée dans les méthodes @BeforeClass ou @AfterClass. Cela entraînera également la catégorisation des tests comme non racinés.

0
Tobber

Une autre chose que vous pouvez essayer est de mettre à jour votre version de JUnit à au moins 4.12.

Je rencontrais ce problème depuis un moment avec une classe qui en étendait une qui utilisait @RunWith (Parameterized.class).

Après un moment, et je suis désolé de ne pas savoir exactement ce que j'ai fait, le message "Tests sans racines" a disparu, mais le test n'a toujours pas fonctionné correctement. Le constructeur qui aurait dû accepter les arguments de la méthode @Parameters n'a jamais été appelé; l'exécution est passée directement de @BeforeClass à @AfterClass.

La solution à ce problème consistait à mettre à niveau JUnit à partir de la version 4.8.1 qu’elle utilisait, à la dernière version (4.12). Alors peut-être que cela pourrait aider quelqu'un d'autre à l'avenir.

0
Charlie Hurrell

Il s'est avéré que mon chemin de construction comportait une erreur ... il manquait quelques fichiers jar. J'ai reconfiguré le chemin de compilation et cela a fonctionné!

0
Vikrant K

J'ai eu cette erreur avec le nom de la méthode de test comme "test"

@Test 
public void test() {
 // ... assertTrue(1 == 1); 
}

J'ai renommé la méthode et cela a fonctionné 

0
Neil

Pour moi, ce problème a été créé par une exception en temps réel levée dans la méthode @AfterClass (jetez un oeil ici pour la documentation):

En gros, toutes les méthodes de test ont réussi mais à la fin de la classe, cette méthode échouait. Par conséquent, tous les tests semblent bien, mais il y avait sur mon Eclipse un "test sans racine" supplémentaire qui a échoué.

0
rakwaht