Как я могу добавить повторное использование кода в мои тесты Selenium? - PullRequest
3 голосов
/ 09 февраля 2011

Вот ситуация, с которой я работаю:

  • Сборка тестов в Selenium
  • Получить все тесты, работающие правильно (в Firefox)
  • Экспорт всех тестов в MSTest (чтобы каждый тест можно было запустить в IE, Chrome и FF)
  • Если какой-либо тест необходимо изменить, выполните это редактирование в Selenium IDE

Так что это очень односторонний рабочий процесс. Тем не менее, теперь я хотел бы сделать немного больше автоматизации. Например, я бы хотел, чтобы каждый тест выполнялся под каждой из двух учетных записей. Я вхожу в проблему обслуживания. Если у меня есть 6 тестов, которые я хочу запустить под двумя учетными записями, вдруг мне потребуется 12 тестов в тестах Selenium IDE. Это слишком много редактирования. Но тонна этого кода точно такая же.

Как я могу разделить тесты Selenium между тестами? Должен ли я использовать Selenium IDE для разработки теста в первый раз, и никогда больше его не использовать (только после этого вносить изменения в VS)?

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

Код Selenium очень линейный после его экспорта из IDE.

Например (игнорировать синтаксис):

  someTestMethod() {
     selenium.open("http://someLoginPage.com");
     selenium.type("usernameField", "foo");
     selenium.type("passwordField", "bar");
     selenium.click("loginButton");
     selenium.waitForPageToLoad("30000");
     assertTrue(selenium.isTextPresent("Welcome * foo"));
  }

Это страница входа. Каждый из ваших тестов должен будет использовать его. Вы должны преобразовать это в метод.

  someTestMethod(){
     selenium.open("http://someLoginPage.com");
     String username = "foo";
     String password = "bar";
     performLogin(username, password);
  }

  performLogin(String username, String password){
      selenium.type("usernameField", username);
      selenium.type("passwordField", password);
      selenium.click("loginButton");
      selenium.waitForPageToLoad("30000");
      assertTrue(selenium.isTextPresent("Welcome * foo"));
  }

Метод performLogin() не обязательно должен быть в том же файле, что и сам ваш тестовый код. Вы можете создать для него отдельный класс с вашими методами и поделиться им между вашими тестами.

У нас есть классы, которые соответствуют определенным функциям нашего пользовательского интерфейса. Например, у нас есть много способов поиска в нашем приложении. Все методы, которые помогут вам с поиском, будут в классе SearchUtil .

Аналогично структурирование ваших тестов даст вам следующие преимущества:

  • Если пользовательский интерфейс изменится (идентификатор поля), вы перейдете к своему единственному методу, обновите идентификатор, и все будет готово
  • Если поток логики изменится , у вас также есть только одно место для обновления
  • Чтобы проверить , сработали ли ваши изменения , вам нужно выполнить только один из тестов для проверки. Все остальные тесты используют тот же код, поэтому он должен работать.
  • Намного больше выразительных , когда вы смотрите на код. С хорошо названными методами вы создаете более высокий уровень абстракции, который легче читать и понимать.
  • Гибко и расширяемо! Возможности безграничны. На этом этапе вы можете использовать условия, циклы, исключения, вы можете создавать собственные отчеты и т. Д. *

Этот сайт является отличным ресурсом о том, что вы пытаетесь достичь.

Удачи!

2 голосов
/ 10 февраля 2011

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

  1. Устранение дублирования кода в вашей собственной базе кода - c_maker коснулся этого.
  2. Устранение дублирования кода из кода, сгенерированного Selenium IDE .

Я должен отметить, что мои комментарии сильно зависят от одностороннего рабочего процесса, который вы используете, jcollum, но даже более того: я использую IDE для генерации кода только один раз для данного тестового примера. Я никогда не возвращаюсь в IDE, чтобы изменить контрольный пример и повторно экспортировать его. (Я сохраняю контрольный пример IDE в качестве диагностического инструмента, когда хочу поэкспериментировать с вещами, пока я настраиваю и настраиваю свой контрольный пример в коде (в моем случае C #).

Причины, по которым я предпочитаю использовать тесты IDE только в качестве отправной точки:

  • В тестах IDE всегда будет много дублирования кода от одного теста к другому; иногда даже в течение одного теста. Это просто природа зверя.
  • В коде я могу сделать тестовый пример более «удобным», т. Е. Я могу инкапсулировать тайные локаторы в свойство или метод с осмысленным именем, чтобы было намного понятнее, что делает тестовый пример.
  • Работа в коде, а не в IDE, обеспечивает гораздо большую гибкость.

Итак, вернемся к IDE-сгенерированному коду: он всегда имеет огромное количество дубликатов. Пример:

verifyText "//form[@id='aspnetForm']/div[2]/div/div[2]/div[1]/span" Home

генерирует этот блок кода:

try
{
  Assert.AreEqual("Home",
    selenium.GetText("//form[@id='aspnetForm']/div[2]/div/div[2]/div[1]/span"));
}
catch (AssertionException e)
{
  verificationErrors.Append(e.Message);
}

Каждая последующая команда verifyText генерирует идентичный блок кода, отличающийся только двумя параметрами.

Мое решение этого резкого запаха кода заключалось в разработке Selenium Sushi , шаблона проекта Visual Studio C # и библиотеки, которая позволяет устранить большинство, если не все, это дублирование. С помощью библиотеки я могу просто написать эту одну строку кода, чтобы она соответствовала исходной строке кода из тестового примера IDE:

Verify.AreEqual("Home",
  selenium.GetText("//form[@id='aspnetForm']/div[2]/div/div[2]/div[1]/span"));

У меня есть обширная статья на эту тему ( Веб-тестирование с Selenium Sushi: практическое руководство и набор инструментов ), которая была только что опубликована на Simple-Talk.com в феврале 2011 года.

0 голосов
/ 12 февраля 2011

Вы также можете поместить некоторые фрагменты или однострочники, например,

note( "now on page: " .  $sel->get_location() . ", " . $sel->get_title() ; 

в коллекцию "фрагментов кода" вашей IDE (я использую Eclipse).

Это не правда, повторное использование, но эй, это работает для меня для одноразовых тестовых скриптов или быстрых улучшений существующих тестовых скриптов.

...