Pourquoi mes tests échouent-ils lorsqu’ils sont exécutés ensemble, mais réussissent-ils individuellement ?

StackOverflow https://stackoverflow.com/questions/8987231

Question

Lorsque j'écris un test dans Visual Studio, je vérifie qu'il fonctionne en l'enregistrant, en le construisant puis en l'exécutant dans Nunit (clic droit sur le test puis exécutez).

Le test fonctionne ouais...donc je passe à autre chose...

Maintenant, j'ai écrit un autre test et cela fonctionne comme je l'ai enregistré et testé comme ci-dessus.Mais ils ne fonctionnent pas lorsqu’ils sont exécutés ensemble.

Voici mes deux tests qui fonctionnent lorsqu'ils sont exécutés individuellement mais échouent lorsqu'ils sont exécutés ensemble :

using System;
using NUnit.Framework;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;

namespace Fixtures.Users.Page1
{
    [TestFixture]
    public class AdminNavigateToPage1 : SeleniumTestBase
    {
        [Test]
        public void AdminNavigateToPage1()
        {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
            NavigateTo<Page1>();
            var headerelement = Driver.FindElement(By.ClassName("header"));

            Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
            Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
        }

        [Test]
        public void AdminNavigateToPage1ViaMenu()
        {
            NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
            Driver.FindElement(By.Id("menuitem1")).Click();
            Driver.FindElement(By.Id("submenuitem4")).Click();
            var headerelement = Driver.FindElement(By.ClassName("header"));

            Assert.That(headerelement.Text, Is.EqualTo("Page Title"));
            Assert.That(Driver.Url, Is.EqualTo("http://localhost/Page Title"));
        }
    }
}

Lorsque le deuxième test échoue parce qu'ils ont été exécutés ensemble

Nunit présente ceci :

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesViaMenu :OpenQA.Selenium.NoSuchElementException :L'élément est introuvable

Et cette ligne est mise en évidence :

var headerelement = Driver.FindElement(By.ClassName("header"));

Est-ce que quelqu'un sait pourquoi mon code échoue lorsqu'il est exécuté ensemble, mais réussit lorsqu'il est exécuté seul ?

Toute réponse serait grandement appréciée !

Était-ce utile?

La solution

Deux choses que vous pouvez essayer

  1. Mettez le point de rupture entre les deux lignes suivantes.Et voir quelle page êtes-vous dans quand la deuxième ligne est frappée
  2. introduit un léger délai entre ces deux lignes via thread.sleep

    pilote.findElement (by.id ("sous-lieuem4")). Cliquez sur (); Var HeaderElement= pilote.findElement (par.classname ("en-tête"));

Autres conseils

Une telle situation se produit normalement lorsque les tests de l'unité utilisent des ressources / données partagées d'une manière ou d'une autre.

  1. Cela peut également se produire si votre système sous test a des champs / propriétés statiques qui sont exploités pour calculer la sortie sur laquelle vous affirmez.
  2. Cela peut arriver si le système sous test est en cours de dépendances partagées (statiques).

Regardez dans le TestFixuuresTUP , Configuration , TestFixTureTeardown et dératrement .
Ces attributs vous permettent de configurer le testenvironnement une fois, au lieu d'une fois par test.

Sans savoir comment fonctionne Selenium, je parie sur Driver qui semble être une classe statique donc les 2 tests partagent l'état.Un exemple d'état partagé est Driver.Url.Étant donné que les tests sont exécutés en parallèle, il existe une condition de concurrence critique pour définir l'état de cet objet.

Cela dit, je n'ai pas de solution pour vous :)

Si aucune des réponses ci-dessus n'a fonctionné pour vous, j'ai résolu ce problème en ajoutant Thread.Sleep(1) avant l'assertion dans le test d'échec...

On dirait que la synchronisation des tests est manquée quelque part...Veuillez noter que mes tests ne dépendaient pas de l'ordre, que je n'avais aucun membre statique ni dépendance externe.

Êtes-vous sûr que, après avoir exécuté l'un des tests, la méthode

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();

vous ramène à l'endroit où vous devriez être?Il semblerait que l'échec est due à un gestionnaire de navigation inapproprié (supposant que l'élément d'en-tête soit présent et trouvé dans les deux tests).

Je pense que vous devez vous assurer que vous pouvez vous connecter au deuxième test, cela pourrait échouer, car vous êtes déjà connecté?

-> Mettre la connexion dans une méthode Configuration ou (car il semble que vous utilisiez le même utilisateur pour les deux tests), même jusqu'à la configuration Fixture -> La déconnexion (si nécessaire) peut être placée dans la méthode de la larme

     [SetUp]
     public void LaunchTest()
     {
        NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
     }

     [TearDown]
     public void StopTest()
     {
        // logoff
     }
     [Test]
     public void Test1()
     {...}
     [Test]
     public void Test2()
     {...}

S'il y a des retards dans le DOM au lieu d'un thread.sleep, je recommande d'utiliser webDriver.Wait en combinaison avec des conditions.Le sommeil pourrait fonctionner dans 80% et dans d'autres non.Les sondages d'attente jusqu'à ce qu'un délai d'attente soit atteint, ce qui soit plus fiable et également lisible.Voici un exemple de comment je m'approche habituellement:

    var webDriverWait = new WebDriverWait(webDriver, ..);
    webDriverWait.Until(d => d.FindElement(By.CssSelector(".."))
        .Displayed))

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top