Почему мои тесты не проходят, когда они выполняются вместе, но проходят индивидуально? - PullRequest
18 голосов
/ 24 января 2012

Когда я пишу тест в Visual Studio, я проверяю его работоспособность, сохраняя, собирая и запуская тест в Nunit (щелкните правой кнопкой мыши на тесте, затем запустите).

Тест работает ууу ... так что я двигаюсь дальше ...

Теперь я написал другой тест, и он работает так же, как я сохранил и проверил его, как описано выше. Но они не работают, когда работают вместе.

Вот два моих теста, которые работают, когда запускаются как отдельные пользователи, но не работают, когда запускаются вместе:

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

Когда второй тест не пройден, потому что они были выполнены вместе

Nunit представляет это:

Sse.Bec.Web.Tests.Fixtures.ManageSitesAndUsers.ChangeOfPremises.AdminNavigateToChangeOfPremises.AdminNavigateToPageChangeOfPremisesViaMenu: OpenQA.Selenium.NoSuchElementException: элемент не найден

И эта строка выделена:

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

Кто-нибудь знает, почему мой код дает сбой при запуске вместе, но проходит при запуске в одиночку?

Любой ответ будет принята с благодарностью!

Ответы [ 7 ]

3 голосов
/ 26 мая 2017

Такая ситуация обычно возникает, когда модульные тесты каким-либо образом используют общие ресурсы / данные.

  1. Это также может произойти, если ваша тестируемая система имеет статические поля / свойства, которые используются для вычисления вывода, на котором вы утверждаете.
  2. Это может произойти, если тестируемая система имеет общие (статические) зависимости.
2 голосов
/ 03 июня 2013

Не зная, как работает Selenium, моя ставка сделана на Driver, который кажется статическим классом, поэтому 2 теста находятся в состоянии совместного использования.Одним из примеров общего состояния является Driver.Url.Поскольку тесты выполняются параллельно, существует условие гонки для установки состояния этого объекта.

Тем не менее, у меня нет решения для вас:)

2 голосов
/ 24 января 2012

посмотрите на TestFixtureSetup , Setup , TestFixtureTearDown и TearDown .
Эти атрибуты позволяют настраивать среду тестирования один раз, а не один раз за тест.

1 голос
/ 09 апреля 2014

Если ни один из приведенных выше ответов не помог вам, я решил эту проблему, добавив Thread.Sleep(1) перед утверждением в неудачном тесте ...

Похоже, что где-то пропущена синхронизация тестов ... Обратите внимание, что мои тесты не зависели от порядка, что у меня нет ни статического члена, ни внешней зависимости.

1 голос
/ 24 января 2012

Две вещи, которые вы можете попробовать

  1. поставить точку останова между следующими двумя строками.И посмотрите, на какой странице вы находитесь, когда нажмете вторую строку
  2. Введите небольшую задержку между этими двумя строками через Thread.Sleep

    Driver.FindElement (By.Id ("submenuitem4. «)) Нажмите ();var headerelement = Driver.FindElement (By.ClassName ("header"));

0 голосов
/ 03 февраля 2016

Я думаю, вам нужно убедиться, что вы можете войти во второй тест, это может не получиться, потому что вы уже вошли в систему?

-> установка входа в метод установки или (поскольку кажется, что вы используете одного и того же пользователя для обоих тестов) даже до настройки прибора -> выход из системы (при необходимости) может быть введен в метод демонтажа

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

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

Если есть задержки в DOM вместо thread.sleep, я рекомендую использовать webdriver.wait в сочетании с условиями.Сон может работать в 80%, а в других нет.Ожидание опрашивается до истечения времени ожидания, которое является более надежным и также читаемым.Вот пример того, как я обычно подхожу к этому:

    var webDriverWait = new WebDriverWait(webDriver, ..);
    webDriverWait.Until(d => d.FindElement(By.CssSelector(".."))
        .Displayed))
0 голосов
/ 24 января 2012

Вы уверены, что после выполнения одного из тестов метод

NavigateTo<LogonPage>().LogonAsCustomerAdministrator();

возвращает вас туда, где вы должны быть?Казалось бы, ошибка вызвана неправильным обработчиком навигации (предположим, что элемент заголовка присутствует и обнаружен в обоих тестах).

...