Tests de junit sur le sélénium-comment exécuter des tests dans un test dans un ordre séquentiel?

j'utilise junit avec eclipse pour écrire des tests de fonction.

lors de l'exécution d'un test individuel, il fonctionne dans l'ordre où je les ai mis dans la classe.

par exemple.

testCreateUser
testJoinUserToRoom
testVerify
testDeleteUser

cependant, lorsque j'exécute ce test dans le cadre d'une suite (donc dans un paquet), l'ordre est aléatoire.

il va par exemple faire la vérification, puis supprimer l'utilisateur puis joinuserToRoom puis Createuser.

My les tests de la suite ne dépendent pas les uns des autres. Cependant, chaque test individuel d'un test dépend de son exécution dans le bon ordre.

est-ce que je peux y arriver?

Merci.

2
demandé sur Matthew Farwell 2011-12-15 14:08:55

2 réponses

Vous ne pouvez pas garantir que l'ordre d'exécution de test méthodes dans JUnit.

l'ordre d'exécution du test classes dans une suite est garanti (si vous utilisez Suite ), mais l'ordre d'exécution si les classes de test sont trouvées par réflexion n'est pas (par exemple, si vous exécutez un paquet dans Eclipse, ou un ensemble de tests de maven ou ant). Cela peut être définissable par ant ou maven, mais il n'est pas défini par JUnit.

en général, JUnit exécute les méthodes d'essai dans l'ordre où elles sont définies dans le fichier source, mais toutes les JVM ne le garantissent pas (notamment avec JVM 7). Si certaines des méthodes sont héritées d'une classe d'essai de base abstraite, cela peut ne pas être le cas. (Cela ressemble à votre cas, mais je ne peux pas dire à partir de votre description).

pour plus d'informations, voir ma réponse à est-ce que JUnit4 a commencé à soutenir l'ordre de test? Est-ce intentionnel? .

Alors, que pouvez-vous faire pour résoudre votre problème? Il y a deux solutions.

dans votre exemple original, vous n'avez en fait qu'un test (vérifier), mais vous avez 4 méthodes, deux setup (createUser, joinUserToRoom) et une teardown (deleteUser). Donc votre première option est de mieux définir vos cas de test, en utilisant un TestRule , en particulier ExternalResource . ExternalResource vous permet de définir avant/après comportement pour un test, similaire à @Before/@After . Cependant, l'avantage de ExternalResource est que vous pouvez tenir compte de votre test.

ainsi, vous créez / supprimez l'utilisateur dans votre ressource externe:

public class UsesExternalResource {
     @Rule
     public ExternalResource resource= new ExternalResource() {
         @Override
         protected void before() throws Throwable {
            // create user
         };

         @Override
         protected void after() {
            // destroy user
         };
     };

     @Test
     public void testJoinUserToRoom() {
        // join user to room
        // verify all ok
     }
}

Pour moi, c'est plus simple et plus facile à comprendre, et vous obtenez des tests indépendants, ce qui est une bonne chose. C'est ce que je ferais, mais vous il faudra remanier un peu vos tests. Vous pouvez également empiler ces règles en utilisant RuleChain .

votre deuxième option, si vous voulez vraiment introduire des dépendances entre vos méthodes de test, est de regarder TestNG , dans lequel vous pouvez définir des dépendances d'un test à l'autre.

6
répondu Matthew Farwell 2017-05-23 12:16:56

S'ils ont un ordre "correct", alors ils ne sont pas des tests multiples, mais un seul test que vous avez incorrectement annoté comme étant plusieurs tests indépendants.

Meilleure pratique serait de les réécrire dans approuvée junit style (installation - loi - à vérifier), soutenu par @Avant ou @BeforeClass méthodes qui n'ont de toute installation commune.

solution rapide serait d'avoir une seule méthode @Test-annotated qui a appelé les autres méthodes d'essai dans séquence. Cela devient quelque chose comme l'alternative préférée si vous utilisez Junit pas pour faire des tests unitaires stricts, mais quelque chose comme les tests de systèmes basés sur des scénarios. Ce n'est pas nécessairement le meilleur outil pour une telle utilisation, mais il fonctionne parfaitement dans certains cas.

alors, ce que vous auriez jusqu'à présent est d'avoir un seul test:

@Test public void testUserNominalLifeCycle(...

qui pourrait alors, si vous vous sentez vertueux, être complété par de nouveaux tests supplémentaires comme

@Test public void testUserWhoNeverJoinsARoom(...
0
répondu soru 2011-12-15 12:19:01