2012-01-24 6 views
15

Domanda veloce per voi ... Quando scrivo un test in Visual Studio, verifico che funziona salvando, costruzione e quindi eseguire il test in Nunit (tasto destro del mouse su il test quindi funziona).La mia prova non riuscire quando correre insieme, ma passano individualmente

Il test funziona yay ... così ho andare avanti ...

Ora ho scritto un altro test e funziona come ho salvato e testato come sopra. Ma, non funzionano quando vengono gestiti insieme.

Qui sono i miei due test che funzionano quando viene eseguito come individui, ma fallire quando correre 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 state correre insieme

Nunit presenta in questo modo:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesV iaMenu: OpenQA.Selenium.NoSuchElementException: L'elemento non è stato trovato

E questa linea è evidenziata:

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

Qualcuno sa il motivo per cui il mio codice non riesce quando viene eseguito insieme, ma passa quando corri da solo?

Qualsiasi risposta sarebbe molto apprezzato!

+4

Sei sicuro che i test non condividono lo stato? Il browser si chiude e riapre tra i test? Quale test fallisce quando vengono eseguiti insieme? BOTH fallisce, o uno passa e uno fallisce? –

+0

Il browser si chiude e così fa la finestra di comando .. riaprono nuovamente per elaborare il seguente test ... Il primo test che passa poi tutti i seguenti test generalmente falliscono e falliscono sempre per lo stesso motivo pubblicato sopra. –

+0

Non aiuta la tua domanda specifica, ma controlla http://www.ncrunch.net/, esegue i tuoi test in background. Sbarazzarsi dell'intera faccenda di "salvare, costruire e poi far funzionare il test". –

risposta

1

Due cose che si possono provare

  1. mettere il punto di rottura tra le seguenti due righe. E vedere quale pagina ci si trova quando la seconda linea viene colpito
  2. Introdurre un leggero ritardo tra queste due linee tramite Thread.Sleep

    Driver.FindElement (By.Id ("submenuitem4")). Fare clic su() ; var headerelement = Driver.FindElement (By.ClassName ("header"));

+0

ha provato la funzione thread.sleep dove hai suggerito. prima che lo aggiungessi, quando eseguivo i test era sempre il secondo test che non riusciva, ma con il comando sleep era sempre il secondo test che il passato e il primo fallivano? strano! –

+0

Quindi questo potrebbe significare che avete bisogno del thread.sleep al di sopra dell'elemento di ricerca dell'elemento "header", per dare tempo sufficiente al browser per caricare la pagina prima che l'unità cerchi quell'elemento. Prova lo stesso anche nel primo test. – chandmk

+0

ok ho aggiunto la funzione sleep a entrambi i test e sono passati! strano ho provato prima, ma non li ho mai aggiunti ad entrambi ... non sono sicuro perché passano ora, ma sono più basso di meno! grazie per il vostro aiuto. –

1

guardare nello TestFixtureSetup, Setup, TestFixtureTearDown e TearDown.
Questi attributi consentono di impostare il testenvironment una volta, invece di una volta per test.

+0

cosa mi consiglia di ripulire in TestFixtureTearDown? –

+0

@GraemeSecondwave Purtroppo non conosco il selenio. Tuttavia, so che quando eseguo i test insieme falliscono e quando aggiungo le istruzioni comuni al setup funziona. Ad esempio, cosa succede se si aggiunge 'NavigateTo () .LogonAsCustomerAdministrator();' a TestFixtureSetup? – Default

+0

Se la riga 'var headerelement ...' è evidenziata, probabilmente è la linea precedente a lanciare un'eccezione. Assicurati che submenuitem4 esista. Hai provato a debuggarlo? (Fare clic con il pulsante destro del mouse sul test, scegliere Test con -> Debugger) – Default

0

Sei sicuro che dopo l'esecuzione di uno dei test del metodo

NavigateTo<LogonPage>().LogonAsCustomerAdministrator(); 

sta prendendo si torna al punto in cui si dovrebbe essere? Sarebbe sembra che il fallimento è dovuto al gestore di navigazione improprio (supponendo che l'elemento di intestazione è presente e si trovano in entrambi i test).

+0

osservando attentamente il driver durante il test, carica tutte le pagine e naviga nella pagina come previsto. e il titolo della pagina in cerca di display. non gli piace l'elemento "Intestazione" come il test che passa quando viene eseguito da solo? –

2

Senza sapere come funziona il selenio, la mia scommessa è in Driver che sembra essere una classe statica in modo che i 2 test sono la condivisione dello stato. Un esempio di stato condiviso è Driver.Url. Poiché i test vengono eseguiti in parallelo, esiste una condizione di competizione per impostare lo stato di questo oggetto.

Detto questo, io non ho una soluzione per voi :)

1

Se nessuna delle risposte precedenti lavorato per voi, ho risolto questo problema aggiungendo Thread.Sleep(1) prima che l'affermazione nella prova in mancanza ...

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

+0

+1 perché mi hai fatto capire che il mio oggetto statico era il problema e la causa dei miei errori. Grazie! – workabyte

0

Penso che sia necessario assicurarsi che sia possibile accedere per il secondo test, questo potrebbe non riuscire, perché è già stato effettuato l'accesso?

-> mettendo l'accesso in un impostare il metodo o (perché sembra che si sta utilizzando lo stesso utente per entrambi i test) anche fino alla configurazione apparecchio -> la chiusura del collegamento (se necessario) potrebbe essere mettere in abbattere metodo

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

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

Se ci sono ritardi nella DOM invece di un Thread.sleep consiglio di usare webdriver.wait in combinazione con condizioni. Il sonno potrebbe funzionare nell'80% e in altri no. I sondaggi di attesa fino al raggiungimento di un timeout più affidabile e leggibile. Ecco un esempio di come io di solito avvicinarsi a questo:

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

Tale situazione si verifica normalmente quando i test di unità sono condivisi utilizzando risorse/dati in qualche modo.

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