c# - orden - ¿Por qué mis pruebas fallan cuando se ejecutan juntas, pero pasan individualmente?
c# summary tags (7)
¿Estás seguro de que después de ejecutar una de las pruebas el método?
NavigateTo<LogonPage>().LogonAsCustomerAdministrator();
¿Te está llevando de regreso a donde deberías 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).
Cuando escribo una prueba en Visual Studio, verifico que funcione guardando, compilando y ejecutando la prueba en Nunit (haga clic con el botón derecho en la prueba y luego ejecute).
La prueba funciona yay ... entonces sigo ...
Ahora he escrito otra prueba y funciona como la he guardado y probado como arriba. Pero, no funcionan cuando se ejecutan juntos.
Aquí están mis dos pruebas que funcionan cuando se ejecutan como individuos pero fallan cuando se ejecutan juntas:
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 falla la segunda prueba porque se han ejecutado juntos
Nunit presenta esto:
Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesViaMenu: OpenQA.Selenium.NoSuchElementException: The element no se pudo encontrar.
Y esta línea está resaltada:
var headerelement = Driver.FindElement(By.ClassName("header"));
¿Alguien sabe por qué mi código falla cuando se ejecutan juntos, pero pasa cuando se ejecuta solo?
Cualquier respuesta sería muy apreciada!
Creo que debe asegurarse de que puede iniciar sesión para la segunda prueba, esto podría fallar, porque ya ha iniciado sesión?
-> poner el inicio de sesión en un método de configuración o (porque parece que está usando el mismo usuario para ambas pruebas) incluso hasta la configuración del aparato -> el cierre de sesión (si es necesario) podría ponerse 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 las condiciones. El sueño podría funcionar en un 80% y en otros no. Las encuestas de espera hasta que se alcanza un tiempo de espera que es más confiable y también legible. Aquí un ejemplo de cómo generalmente me acerco a esto:
var webDriverWait = new WebDriverWait(webDriver, ..);
webDriverWait.Until(d => d.FindElement(By.CssSelector(".."))
.Displayed))
Dos cosas que puedes probar
- Ponga el punto de ruptura entre las siguientes dos líneas. Y mira en qué página estás cuando se toca la segunda línea.
Introduzca 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"));
Esta situación ocurre normalmente cuando las pruebas unitarias están utilizando los recursos / datos compartidos de alguna manera.
- También puede suceder si su sistema bajo prueba tiene campos / propiedades estáticas que se están aprovechando para calcular la salida en la que está afirmando.
- Puede suceder si el sistema bajo prueba se comparte las dependencias (estáticas).
Si ninguna de las respuestas anteriores funcionó para usted, resolví este problema agregando Thread.Sleep(1)
antes de la afirmación en la prueba que falla ...
Parece que la sincronización de las pruebas se pierde en algún lugar ... Tenga en cuenta que mis pruebas no dependían de la orden, que no tengo ningún miembro estático ni dependencia externa.
Sin saber cómo funciona Selenium, mi apuesta es en Driver
que parece ser una clase estática, por lo que las 2 pruebas están compartiendo el estado. Un ejemplo de estado compartido es Driver.Url
. Debido a que las pruebas se ejecutan en paralelo, hay una condición de carrera para establecer el estado de este objeto.
Dicho esto, no tengo una solución para ti :)
busque en TestFixtureSetup , Setup , TestFixtureTearDown y TearDown .
Estos atributos le permiten configurar el entorno de prueba una vez, en lugar de una vez por prueba.