Подтвердить что ты не робот

Как я могу сделать тесты на селен менее хрупкими?

Мы используем Selenium для тестирования слоя пользовательского интерфейса нашего приложения ASP.NET. Многие из тестовых примеров тестируют более длинные потоки, которые охватывают несколько страниц.

Я обнаружил, что тесты очень хрупкие, нарушаются не только изменениями кода, которые фактически меняют страницы, но и безобидными рефакторингами, такими как переименование элемента управления (поскольку мне нужно передать контрольный идентификатор клиента методу Selenium Click и т.д. ) или замену сетки репитером. В результате я обнаружил, что "теряю" время, обновляя строковые значения в своих тестовых случаях, чтобы исправить неработающие тесты.

Есть ли способ написать более ремонтные тесты на селен? Или лучший инструмент тестирования веб-интерфейса?

Отредактировано для добавления: Как правило, первый черновик создается путем записи теста в среде IDE. (Этот первый шаг может выполняться персоналом ОК). Затем я реорганизую сгенерированный код С# (константы извлечения, методы извлечения для повторного кода, возможно, повторить тестовый пример с разными данными и т.д.). Но общий поток кода для каждого тестового примера остается достаточно близким к первоначально сгенерированному коду.

4b9b3361

Ответ 1

Я нашел шаблон PageObject очень полезным.

http://code.google.com/p/webdriver/wiki/PageObjects

Дополнительная информация: - Что такое точка селена? - Критика селена

Возможно, хороший способ начать - поэтапно реорганизовать ваши тестовые примеры.

Я использую тот же сценарий, что у вас есть selenium + С#

Вот как выглядит мой код:

Метод проверки будет выглядеть как-то вроде

    [TestMethod]
    public void RegisterSpecialist(UserInfo usrInfo, CompanyInfo companyInfo)
    {
        var RegistrationPage = new PublicRegistrationPage(selenium)
              .FillUserInfo(usrInfo)
              .ContinueSecondStep();
        RegistrationPage.FillCompanyInfo(companyInfo).ContinueLastStep();
        RegistrationPage.FillSecurityInformation(usrInfo).ContinueFinishLastStep();
        Assert.IsTrue(RegistrationPage.VerifySpecialistRegistrationMessagePayPal());
        selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
        paypal.LoginSandboxPage(usrInfo.sandboxaccount, usrInfo.sandboxpwd);
        Assert.IsTrue(paypal.VerifyAmount(usrInfo));
        paypal.SubmitPayment();
        RegistrationPage.GetSpecialistInformation(usrInfo);
        var bphome = new BPHomePage(selenium, string.Format(Resources.GlobalResources.LoginBPHomePage, usrInfo.AccountName, usrInfo.Password));
        Assert.IsTrue(bphome.VerifyPageWasLoaded(usrInfo));
        Assert.IsTrue(bphome.VerifySpecialistProfile());
        bphome.Logout();
    }

Объект страницы будет выглядеть примерно так:

public class PublicRegistrationPage
{
    public ISelenium selenium { get; set; }

    #region Constructors
    public PublicRegistrationPage(ISelenium sel)
    {
        selenium = sel;
        selenium.Open(Resources.GlobalResources.PublicRegisterURL);
    }
    #endregion
    #region Methods

    public PublicRegistrationPage FillUserInfo(UserInfo usr)
    {
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserFirstName", usr.FirstName);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserLastName", usr.LastName);
        selenium.Select("ctl00_cphComponent_ctlContent_wizRegister_ddlUserCountry", string.Format("label={0}",usr.Country ));
        selenium.WaitForPageToLoad(Resources.GlobalResources.TimeOut);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserEmail", usr.Email );
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserDirectTel", usr.DirectTel);
        selenium.Type("ctl00_cphComponent_ctlContent_wizRegister_tUserMobile", usr.Mobile);
        return this;
    }

}

Надеюсь, что это поможет.

Ответ 2

Как вы создаете тесты Selenium, записывая их и воспроизводя их? То, что мы сделали, - создать объектную модель вокруг страниц, чтобы вы вызывали метод типа "clickSubmit()" вместо того, чтобы нажимать на идентификатор (с соглашением об именах для этих идентификаторов), что позволяет проводить тесты селена для многих изменений.

Ответ 3

Нет никаких безобидных изменений, когда дело доходит до автоматизации тестирования;)

Мы используем SAFS framework с Rational Robot (RRAFS), чтобы минимизировать влияние на наши сценарии автоматизации. Там все еще работает, чтобы поддерживать карту приложения, но сценарии по-прежнему остаются стабильными. Структура SAFS очень похожа на метод cynicalman, но уже упаковывает общие методы, которые вы использовали бы в своих сценариях.

Сайт SAFS говорит о частичной поддержке Selenium, поэтому это может сработать для вас.

Ответ 4

Я обнаружил, что использование выражений XPath в Selenuium-RC добавляет много к надежности теста.

Я пишу свои тесты аналогичным образом. Первый проход часто записывается через IDE/Record, чтобы получить большую часть моих операций с потоком и кликами. Как только у меня это получилось, я начинаю проходить тест через Selenium-RC, добавляя утверждения и изменяя абсолютные локаторы виджетов в более читаемые и дружественные выражения Xpath. (а также документирование теста!:))

Одна вещь, о которой нужно знать. Если ваши тесты имеют xpath-heavy, они могут немного замедляться в IE6 из-за его плохих возможностей выполнения javascript. (У меня есть несколько тестовых наборов, которые занимают почти час дольше для выполнения в IE, чем под FF. Это управляемо, но просто нужно иметь в виду, когда вы пишете тесты.)

Ответ 5

Вы можете или не сможете писать тесты, которые являются устойчивыми для рефакторинга. Здесь, как сделать рефакторинг менее болезненным: необходима непрерывная интеграция.

Запускать их каждый день или каждую сборку. Чем скорее это будет исправлено, тем легче.

Убедитесь, что разработчики могут сами запускать тесты. Опять же, чем быстрее он будет замечен, тем легче.

Проведите тесты на селен. Они должны сосредоточиться на критических сценариях сценариев path/pri 1. Глубокое тестирование должно проводиться на уровне unit test (или jsunit). Интеграционные тесты всегда дорогие и менее ценные.

Ответ 6

Селен в теории имеет абстракцию, называемую элементом пользовательского интерфейса (документация здесь).

Функции будут

  • абстрактные локаторы, независимые в самой реализации html; это хорошо отразится на концепции компонента или виджета веб-фреймворка,

  • правила сворачивания, позволяющие объединить несколько команд в одну более абстрактную команду.

Я боролся пару дней, чтобы использовать эту функцию, но в конце концов решил отказаться от нее по следующим причинам:

  • некоторые понятия, например, локаторы смещения (считающие их частями компонента) не полностью или с пользой разработаны;
  • функция не полностью поддерживается в formatters, а более поздняя форматера - тем меньше функция поддерживается, намекая, что основная эволюция Selenium оставляет эту функцию позади;
  • он не полностью интегрирован в Selenium 2.0 (WebDriver).

Ответ 7

Я думаю, что Xpath - лучший способ обеспечить надежные тесты селена. В настоящее время я работаю над библиотекой, чтобы упростить запись выражений xpath.

Если вы заинтересованы, вы можете проверить это здесь: http://www.unit-testing.net/CurrentArticle/How-To-Write-XPath-for-Selenium-Tests.html