Pourquoi mes tests échouent-ils lorsqu'ils sont exécutés ensemble, mais passent individuellement?
Quand j'écris un test dans Visual Studio, j'ai vérifier qu'il fonctionne par l'épargne, de la construction puis de l'exécution de l'essai dans Nunit (clic droit sur le test, puis exécuter).
Le test fonctionne yay...
j'ai donc passer à la suite...
Maintenant, j'ai écrit un autre test et cela fonctionne comme je l'ai sauvé et l'a testé, comme ci-dessus. Mais, elles ne fonctionnent pas lorsqu'ils sont exécutés ensemble.
Voici mes deux tests qui fonctionnent quand exécuter en tant qu'individus, mais ne parviennent pas quand courir 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"));
}
}
}
Lors de la deuxième test échoue parce qu'ils ont été exécutés ensemble
Nunit présente:
Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesviamenu:
OpenQA.Le sélénium.NoSuchElementException : L'élément n'a pas pu être trouvé
Et cette ligne est mise en surbrillance:
var headerelement = Driver.FindElement(By.ClassName("header"));
Personne ne sait pourquoi mon code ne fonctionne pas lorsqu'il est exécuté ensemble, mais passe lorsque vous exécutez seul?
Toute réponse serait grandement apprécié!
source d'informationauteur Graeme Secondwave
Vous devez vous connecter pour publier un commentaire.
Deux choses que vous pouvez essayer
Introduire un léger retard entre ces deux lignes par Thread.Sommeil
Pilote.FindElement(Par.Id("submenuitem4")).Cliquez sur();
var headerelement = Pilote.FindElement(Par.ClassName("header"));
Sans savoir comment le Sélénium travaille, mon pari est sur
Driver
qui semble être une classe statique si les 2 tests sont le partage de l'état. Un exemple d'un état partagé estDriver.Url
. Parce que les tests sont exécutés en parallèle, il est une condition de concurrence pour définir l'état de cet objet.Cela dit, je n'ai pas de solution pour vous 🙂
regarder dans le TestFixtureSetupLe programme d'installationTestFixtureTearDown et Démontage.
Ces attributs vous permettent de configurer le testenvironment une fois, au lieu d'une fois par test.
Si aucune des réponses ci-dessus a travaillé pour vous, j'ai résolu ce problème en ajoutant
Thread.Sleep(1)
avant l'affirmation dans le test en échec...Ressemble à des tests de synchronisation est oubliée quelque part... s'il vous Plaît noter que mes tests ne sont pas d'ordre de personne à charge, que je n'ai pas tout membre statique ni dépendance externe.
Une telle situation se produit normalement lorsque les tests unitaires de l'utilisation partagée des ressources/données d'une certaine façon.
Êtes-vous sûr qu'après l'exécution de l'un des tests de la méthode
est de prendre votre retour à l'endroit où vous devriez être? Il avait l'impression que le manquement est dû à une mauvaise navigation handler (en supposant que l'élément d'en-tête est présent et a trouvé dans les deux tests).
Je pense que vous devez vous assurer, que vous pouvez vous connecter pour le deuxième test, il peut échouer, parce que vous êtes déjà connecté?
-> mettre de l'ouverture de session dans un configurer la méthode ou (car il semble que vous utilisez le même utilisateur pour les deux tests), même jusqu'à la la configuration de la fixture
-> la fermeture de session (si nécessaire) peut être mis dans le démolir la méthode
Si il y a des retards dans les DOM au lieu d'un thread.le sommeil, je recommande d'utiliser webdriver.attendre en combinaison avec des conditions. Le sommeil peut fonctionner à 80% et dans d'autres non. L'attente des sondages jusqu'à ce qu'un délai est atteint ce qui est plus fiable et aussi lisible. Ici un exemple de la façon dont j'ai l'habitude de cette approche: