2012-01-24 25 views
15

Pregunta rápida para usted ... Cuando escribo una prueba en Visual Studio, compruebo que funciona guardando, construyendo y luego ejecutando la prueba en Nunit (haga clic derecho en la prueba se ejecuta).Mi prueba falla cuando se ejecutan juntas, pero pase individualmente

La prueba funciona yay ... por lo que seguir adelante ...

Ahora he escrito otra prueba y funciona como he salvado y lo ha probado como la de arriba. Pero, no funcionan cuando se ejecutan juntos.

Aquí están mis dos pruebas que funcionan cuando se ejecuta como individuos pero fallan cuando se ejecuta en conjunto:

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

Cuando la segunda prueba falla debido a que se han integrado en

Nunit presenta la siguiente:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesV iaMenu: OpenQA.Selenium.NoSuchElementException: El elemento no se pudo encontrar

Y se pone de relieve esta línea:

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

¿alguien sabe por qué mi código falla cuando se ejecuta en conjunto, sino que pasa cuando correr solo?

¡Cualquier respuesta sería muy apreciada!

+4

¿Estás seguro de que las pruebas no comparten estado? ¿El navegador se cierra y se vuelve a abrir entre las pruebas? ¿Qué prueba falla cuando se ejecutan juntas? ¿Ambos fallan, o uno pasa, y uno falla? –

+0

El navegador se cierra y también lo hace la ventana de comandos ... vuelven a abrir para procesar la siguiente prueba ... Es la primera prueba en la que pasan todas las pruebas siguientes y generalmente fallan por la misma razón expuesta anteriormente. –

+0

No ayuda a su pregunta específica, pero consulte http://www.ncrunch.net/, ejecuta sus pruebas en segundo plano. Deshágase de toda la molestia de "guardar, construir y luego ejecutar la prueba". –

Respuesta

1

dos cosas que usted puede intentar

  1. poner el punto de equilibrio entre las dos líneas siguientes. Y ver qué página que se encuentra cuando la segunda línea es golpeado
  2. introducir un ligero retraso entre estas dos líneas a través de Thread.Sleep

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

+0

probé la función thread.sleep donde sugirió. antes de agregarlo, cuando ejecuto las pruebas, siempre fue la segunda prueba la que falló, pero con el comando sleep siempre fue la segunda prueba pasada y la primera fallida. ¡extraño! –

+0

Esto podría significar que necesita el hilo. Duerma encima del buscador de elementos "encabezado", para dar tiempo suficiente para que el navegador cargue la página antes de que su unidad busque ese elemento. Pruebe lo mismo en la primera prueba también. – chandmk

+0

ok ¡agregué la función dormir a ambas pruebas y ya pasaron! extraño, lo probé antes, pero nunca los agregué a ambos ... no estoy seguro de por qué pasan ahora, pero estoy feliz, ¡menos! gracias por su ayuda. –

1

mira en el TestFixtureSetup, Setup, TestFixtureTearDown y TearDown.
Estos atributos le permiten configurar el entorno de prueba una vez, en lugar de una vez por prueba.

+0

¿qué recomiendas puedo limpiar en el TestFixtureTearDown? –

+0

@GraemeSecondwave Lamentablemente no sé Selenio. Sin embargo, sé que cuando realizo pruebas juntas, fallan y cuando agrego las instrucciones comunes a la configuración, funciona. Por ejemplo, ¿qué ocurre si agrega 'NavigateTo () .LogonAsCustomerAdministrator();' a una TestFixtureSetup? – Default

+0

Si la línea 'var headerelement ...' está resaltada, es probable que la línea anterior arroje una excepción. Asegúrese de que exista submenuitem4. ¿Has probado a depurarlo? (Haga clic con el botón derecho en su prueba, elija Probar con -> Depurador) – Default

0

¿Estas seguro que después de ejecutar una de las pruebas del método

NavigateTo<LogonPage>().LogonAsCustomerAdministrator(); 

que se está llevando de nuevo a donde debe estar? Parece que la falla se debe a un controlador de navegación incorrecto (suponiendo que el elemento del encabezado esté presente y se encuentre en ambas pruebas).

+0

y observe cómo el controlador navega a través de mi prueba carga todas las páginas y navega hacia la página según lo previsto. y el título de la página estoy buscando pantallas. no le gusta el 'elemento de encabezado' como la prueba, ya que pasa cuando se ejecuta por sí mismo? –

2

Sin saber cómo funciona selenio, mi apuesta es en Driver que parece ser una clase estática para las 2 pruebas están compartiendo estado. Un ejemplo de estado compartido es Driver.Url. Debido a que las pruebas se ejecutan en paralelo, existe una condición de carrera para establecer el estado de este objeto.

Dicho esto, no tengo una solución para usted :)

1

Si ninguna de las respuestas anteriores trabajado para ti, i resolvió este problema agregando Thread.Sleep(1) antes de la afirmación en la prueba de no haber ...

Parece que la sincronización de las pruebas se ha perdido en algún lugar ... Tenga en cuenta que mis pruebas no dependen de los pedidos, que no tengo ningún miembro estático ni dependencia externa.

+0

+1 porque me hizo darme cuenta de que mi objeto estático era el problema y la causa de mis errores. ¡Gracias! – workabyte

0

Creo que debe asegurarse de que puede iniciar sesión para la segunda prueba, esto podría fallar, ¿ya inició sesión?

-> poner el inicio de sesión en un configurar método o (porque parece que está utilizando el mismo usuario para ambas pruebas) incluso hasta la configuración accesorio -> el cierre de sesión (si es necesario) podría ser poner en el método de desmontaje

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

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

Si hay retrasos en el DOM en lugar de un Thread.Sleep recomiendo usar webdriver.wait en combinación con condiciones. El sueño podría funcionar en un 80% y en otros no. Las sondas de espera hasta que se alcanza un tiempo de espera que es más confiable y legible. Aquí un ejemplo de cómo abordar este por lo general:

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

Tal situación se produce normalmente cuando las pruebas unitarias están utilizando los recursos compartidos/datos de alguna manera.

  1. También puede suceder si su sistema bajo prueba tiene campos/propiedades estáticas que se aprovechan para calcular la salida que está afirmando.
  2. Puede suceder si el sistema bajo prueba es dependencias compartidas (estáticas).
Cuestiones relacionadas