Perché i miei test falliscono quando vengono eseguiti insieme, ma vengono superati individualmente?

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

Domanda

Quando scrivo un test in Visual Studio, controllo che funzioni salvandolo, costruendolo e quindi eseguendo il test in Nunit (fai clic con il pulsante destro del mouse sul test ed esegui).

Il test funziona eh...quindi vado avanti...

Ora ho scritto un altro test e funziona poiché l'ho salvato e testato come sopra.Ma non funzionano quando vengono eseguiti insieme.

Ecco i miei due test che funzionano se eseguiti individualmente ma falliscono se eseguiti insieme:

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"));
        }
    }
}

Quando il secondo test fallisce perché sono stati eseguiti insieme

Nunit presenta questo:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesViaMenu:OpenQA.Selenium.NoSuchElementException:Impossibile trovare l'elemento

E questa riga è evidenziata:

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

Qualcuno sa perché il mio codice fallisce quando viene eseguito insieme, ma passa quando eseguito da solo?

Qualsiasi risposta sarebbe molto apprezzata!

È stato utile?

Soluzione

Due cose che puoi provare

  1. inserisci il punto di interruzione tra le due righe seguenti.E vedi in quale pagina ti trovi quando viene raggiunta la seconda riga
  2. Introduci un leggero ritardo tra queste due righe tramite Thread.Sleep

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

Altri suggerimenti

Tale situazione si verifica normalmente quando i test unitari utilizzano in qualche modo risorse/dati condivisi.

  1. Può anche accadere se il sistema in test ha campi/proprietà statici che vengono sfruttati per calcolare l'output su cui si sta affermando.
  2. Può accadere se il sistema in test viene condiviso (statico) dipendenze.

Guarda nel TestFixTureSetup, Impostare, TestFixTureTearDown e Demolire.
Questi attributi consentono di configurare la TestEnvironment una volta, anziché una volta per test.

Senza sapere come funziona il selenio, la mia scommessa è attiva Driver Che sembra essere una classe statica, quindi i 2 test condividono lo stato. Un esempio di stato condiviso è Driver.Url. Poiché i test sono eseguiti in parallelo, esiste una condizione di gara per impostare lo stato di questo oggetto.

Detto questo, non ho una soluzione per te :)

Se nessuna delle risposte sopra ha funzionato per te, ho risolto questo problema aggiungendo Thread.Sleep(1) Prima dell'affermazione nel test fallito ...

Sembra che la sincronizzazione dei test sia persa da qualche parte ... Si prega di notare che i miei test non dipendevano dall'ordine, che non ho un membro statico né dipendenza esterna.

Sei sicuro che dopo aver eseguito uno dei test il metodo

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();

Ti sta riportando dove dovresti essere? Sembrerebbe che il fallimento sia dovuto al gestore di navigazione improprio (supponendo che l'elemento di intestazione sia presente e trovato in entrambi i test).

Penso che tu debba assicurarti che tu possa accedere per il secondo test, questo potrebbe fallire, perché hai già effettuato l'accesso?

-> Mettere l'accesso in a Metodo di configurazione o (perché sembra che tu stia usando lo stesso utente per entrambi i test) anche al Setup del dispositivo-> Il logoff (se necessario) potrebbe essere inserito nel metodo di strappo

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

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

Se ci sono ritardi nel DOM anziché in un thread. Sleep Consiglio di utilizzare WebDriver. Aspetta in combinazione con le condizioni. Il sonno potrebbe funzionare all'80% e in altri no. I sondaggi di attesa fino al raggiungimento di un timeout, che è più affidabile e anche leggibile. Qui un esempio come mi avvicino di solito a questo:

    var webDriverWait = new WebDriverWait(webDriver, ..);
    webDriverWait.Until(d => d.FindElement(By.CssSelector(".."))
        .Displayed))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top