[Перевод] Запуск тестов Selenium в Jenkins

В наши дни понятие «DevOps» у всех на слуху. Это — организационный подход, широко используемый для ускорения разработки и развёртывания приложений. Организации внедряют у себя практики DevOps, так как они обещают дать тем, кто их использует, всё лучшее, что существует в мире разработки ПО, причём — на всех этапах работы — от планирования и тестирования, до развёртывания и мониторинга проектов. В реализации практик DevOps важную роль играют CI/CD-инструменты вроде Jenkins. А интеграция Jenkins с Selenium значительно облегчает процесс автоматизации Selenium-тестов.

qiuvtjdfvoodm5z9hdoip6vijo0.jpeg

В этом материале я расскажу о том, что такое Jenkins и Selenium, и остановлюсь на методах их интеграции. Если у вас уже есть некоторый опыт работы с этими системами, но вы интересуетесь тем, как наладить их совместную работу, вы можете сразу же перейти к соответствующему разделу.

Что такое Jenkins?


Jenkins — это опенсорсный DevOps-инструмент, который пользуется популярностью в деле организации процессов непрерывной интеграции и непрерывной доставки программного обеспечения. Это — платформонезависимое приложение, написанное на Java. Оно представляет собой систему для сборки проектов. В частности, с его помощью собирают проекты из исходного кода, запускают модульные тесты, рассылают отчёты о сборках соответствующим членам команды разработчиков.

Подробнее о Jenkins можно почитать здесь.

Что такое Selenium?


Selenium — это опенсорсный инструмент, который широко используется для автоматизации тестирования веб-приложений. Пользоваться им просто, существуют форумы по Selenium, куда может обратиться тот, кто столкнулся с какими-то проблемами. Благодаря этому Selenium обрёл определённую популярность в кругах тестировщиков ПО. В состав Selenium входят четыре основных компонента: Selenium IDE, Selenium RC, Selenium WebDriver и Selenium Grid. Они созданы в расчёте на решение различных задач. Selenium даёт тому, кто им пользуется, возможности по кросс-браузерному и параллельному тестированию веб-приложений. Это позволяет тестировщикам выполнять испытания приложений в разных операционных системах и браузерах, что, в частности, даёт им возможность проверить совместимость веб-проекта с различными браузерами.

Если вас интересуют подробности о Selenium — посмотрите этот материал.

Теперь, после того, как я в двух словах рассказала о Jenkins и Selenium, пришло время серьёзно заняться вопросами интеграции этих инструментов. Но, прежде чем об этом говорить, надо задаться вопросом о том, установлены ли они в системе. Поэтому давайте сначала обсудим их установку и настройку.

Установка, настройка и запуск Jenkins


Шаг 1 — Для того чтобы загрузить Jenkins — можно воспользоваться соответствующей ссылкой на официальном сайте проекта. Нас, в частности, интересует .war-файл Jenkins.

Шаг 2 — Загрузим файл jenkins.war и сохраним его в выбранную директорию.

Шаг 3 — Откроем окно командной строки и перейдём в папку, в которой хранится загруженный .war-файл.

Шаг 4 — Выполним команду java -jar Jenkins.war. Будет запущен сервер Jenkins.

Шаг 5 — Обычно Jenkins по умолчанию запускается на порте 8080. Если этим портом уже пользуется какой-то другой сервис, можно указать при запуске Jenkins другой порт, воспользовавшись командой такого вида:

java -jar jenkins.war --httpPort=8081

В подобной команде можно указать любой свободный порт, а не только 8081. Этот порт и будет использоваться сервером Jenkins.
85ae12c0cefd28484cd62723bbbd81a2.png
Настройка порта для Jenkins

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

k8qlqhf9_k0rgnivdtjjnehhqla.png
Пароль

 В консоли, после успешного завершения установки, можно будет увидеть сообщение Jenkins is fully up and running.

Шаг 6 — Запустим браузер и перейдём к localhost. Как уже говорилось, по умолчанию Jenkins запускается на порте 8080. В моём случае порт был изменён на 8081, именно к этому порту localhost мне и нужно подключиться.

После этого откроется страница настроек Jenkins. Она используется для создания административной учётной записи.

Шаг 7 — Введём в соответствующее поле пароль, который ранее был показан в консоли, и нажмём на кнопку Continue для продолжения настройки системы.

31756b5f77f8f1b4eb947669b1f84f25.png
Окно ввода пароля

Шаг 8 — После ввода пароля система предложит нам установить плагины.

67ae493440c0dcf41502c19f7f902ddb.png
Предложение об установке плагинов

Если вы не знаете точно о том, какие именно плагины вам понадобятся — можете выбрать вариант Install suggested plugins. Это приведёт к установке набора наиболее часто используемых плагинов. Но если вы знаете о том, что именно вам нужно, основываясь, например, на требованиях к проекту, вы можете выбрать вариант Select plugins to install и самостоятельно выбрать плагины для установки.

После этого плагины будут загружены и установлены.

Шаг 9 — После успешной установки плагинов система предложит создать учётную запись администратора, для чего нужно будет ввести имя пользователя, пароль и адрес электронной почты. После того, как эта учётная запись создана, нас перенаправят в панель управления Jenkins.

dc8b45c5e75a866aeb2e5ef1c1220de1.png
Создание учётной записи администратора

Существует множество способов интеграции Jenkins с Selenium WebDriver. Некоторые из них мы рассмотрим ниже. Разные способы интеграции этих систем применимы в различных условиях.

Первый метод интеграции Jenkins с Selenium


Шаг 1 — В панели управления Jenkins щёлкнем по значку New Item для создания нового проекта. Укажем имя проекта и выберем вариант Freestyle Project. После этого нажмём OK.
f67163882436902716a808966263775d.png
Начало создания нового проекта
5f8a836d4c551c4ee1226c621291c632.png
Настройка свойств проекта

Шаг 2 — На вкладке свойств проекта General введём, в поле Description, описание проекта.

ce14f84e6fbdcc9f45b2c02f73a59a7b.png
Ввод описания проекта

Шаг 3 — На вкладке Source Code Management выберем None в группе параметров Source Code Management.

78fa73416df79ac9f73d4dd5c4050ba9.png
Выбор системы управления исходным кодом

Шаг 4 — Jenkins позволяет планировать задания по сборке проектов. Время запуска заданий указывают в таком формате:

MINUTE HOUR DOM MONTH DOW

Смысл этих сокращений раскрыт в следующей таблице
Шаг 5 — Создадим проект, который будем применять для запуска тестов с использованием Selenium WebDriver и TestNG.

Вот код на Java:

package Pages;
import static org.testng.Assert.assertEquals;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class LoginPage {

  WebDriver driver;

  @BeforeTest
  public void setUp() {
    System.setProperty("webdriver.chrome.driver", "C:\\Users\\Shalini\\Downloads\\chrom86_driver\\chromedriver.exe");
    driver = new ChromeDriver();
  }

  public void login() {
    String login_url = "https://opensource-demo.orangehrmlive.com/";
    driver.get(login_url);

    driver.manage().window().maximize();
    driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
    driver.findElement(By.id("txtUsername")).sendKeys("Admin");
    driver.findElement(By.id("txtPassword")).sendKeys("admin123");
    System.out.println(driver.getTitle());
  }

  @Test
  public void dashboard() {

    driver.findElement(By.id("menu_dashboard_index")).click();
    String textPresent = driver.findElement(By.xpath("//*[@id=\"content\"]/div/div[1]/h1")).getText();

    String textToBePresent = "DashBoard";
    assertEquals(textPresent, textToBePresent);
  }

  @AfterTest
  public void tearDown() {
    driver.quit();
  }
}

Шаг 6 — Создадим файл TestNG.xml:





      
        
      
    







Шаг 7 — В папке проекта добавим зависимости. Создадим .bat-файл со следующим содержимым:
ava –cp bin;lib/* org.testng.TestNG TestNG.xml

Тут надо указать точное имя файла TestNG.xml, созданного ранее.

Шаг 8 — Выберем в панели управления Jenkins проект, который мы создали в самом начале работы. Щёлкнем по Configure. На вкладке General щёлкнем по Advanced и установим флажок Use custom workplace. Введём в поле Directory путь к папке проекта.

75ce756a6f9f77573187c54fd6628b71.png
Ввод пути к папке проекта

Шаг 9 — На вкладке Build откроем выпадающий список Add Build Step и выберем Execute Windows batch Command. Введём в него имя .bat-файла, созданного на шаге №7.

3cbae244532d0008ba3c3a2c6129f3d8.png
Ввод сведений о .bat-файле

Шаг 10 — Щёлкнем по кнопке Apply, потом — по кнопке Save для того чтобы сохранить изменения, внесённые в настройки Jenkins-проекта. Теперь щёлкнем по кнопке Build Now, после чего можно будет понаблюдать за процессом выполнения тестов.

9d4b654cdd786653c424a48c6df507a8.png
Запуск сборки проекта

Второй метод интеграции Jenkins с Selenium


Второй подход к автоматизации Selenium-тестов в Jenkins предусматривает использование Maven. Но прежде чем мы это обсудим, предлагаю немного поговорить о Maven, и о том, почему этот фреймворк пользуется популярностью при автоматизации тестов в Jenkins.

Что такое Maven?


Maven — это инструмент для автоматизации сборки проектов, который позволяет организовать добавление в проект зависимостей и управление ими с использованием файла pom.xml. Это позволяет многократно использовать одни и те же зависимости во множестве проектов. При добавлении зависимости в файл pom.xml эта зависимость автоматически загружается и добавляется в проект, что избавляет разработчика от необходимости вручную добавлять в проекты зависимости в виде JAR-файлов.

Совместное использование Maven, Jenkins и Selenium WebDriver даёт возможность построения DevOps-модели, реализующей механизм непрерывной интеграции программных проектов.

Установка Maven


Шаг 1 — Загрузим дистрибутив Maven с официального сайта проекта.

Шаг 2 — Добавим в состав системных переменных MAVEN_HOME — переменную, в которой содержится путь к домашней директории Maven.

8acfd257efe3cf43464d064209979b78.png
Системная переменная MAVEN_HOME

Шаг 3 — Внесём в переменную Path путь к директории bin, содержащейся в домашней директории Maven.

1ab28d9bde07333f07a5ce5a245b3d7b.png

Настройка переменной Path

Шаг 4 — Для того чтобы проверить правильность установки Maven — откроем окно командной строки и попробуем выполнить команду mvn –version.

6272eb456088113ac67be7fd178e20bd.png
Проверка правильности установки Maven

Шаг 5 — Создадим Maven-проект и добавим в файл pom.xml соответствующие зависимости:


   4.0.0
   demoProject
   demoProject
   0.0.1-SNAPSHOT
   
      src
      
         
            maven-compiler-plugin
            3.8.0
            
               1.8
               1.8
            
         
      
   
   
      
         org.seleniumhq.selenium
         selenium-java
         3.141.59
      
      
         org.testng
         testng
         7.3.0
         test
      
   


Вот Java-код:
package WebDriverProject;
import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class LoginClass {

  WebDriver driver;

  @BeforeTest
  public void setup() {
    System.setProperty("WebDriver.gecko.driver", "C:\\Users\\shalini\\Downloads\\geckodriver-v0.26.0-win64\\geckodriver.exe");

    driver = new FirefoxDriver(); //Инициализация WebDriver
  }
  @Test
  public void loginTest() {
    driver.get("https://opensource-demo.orangehrmlive.com/"); //Определение URL
    String pageTitle = driver.getTitle(); //get the title of the webpage
    System.out.println("The title of this page is ===> " + pageTitle);
    Assert.assertEquals("OrangeHRM", pageTitle); //Проверка заголовка страницы

    driver.findElement(By.id("txtUsername")).clear(); //Очистить поле перед вводом значений
    driver.findElement(By.id("txtUsername")).sendKeys("Admin"); //Ввести имя пользователя
    driver.findElement(By.id("txtPassword")).clear();
    driver.findElement(By.id("txtPassword")).sendKeys("admin123"); //Ввести пароль
    driver.findElement(By.id("btnLogin")).click(); //Щёлкнуть по кнопке Login
    System.out.println("Successfully logged in ”);
  }
  @AfterTest
  public void teardown() {
    driver.quit();
  }

}

Вот XML-файл с настройками тестов:





      
        
      
    







Интеграция Selenium и Jenkins с помощью Maven


Только что мы говорили об интеграции Jenkins с Selenium WebDriver. То, что получилось, лучше всего использовать для автоматизации Selenium-тестов. Интеграция Jenkins с Selenium WebDriver даёт разработчику надёжную систему кросс-браузерного тестирования проектов. Здесь мы поговорим об интеграции Jenkins и Selenium с помощью Maven.

Шаг 1 — Запустим сервер Jenkins.

Шаг 2 — Откроем браузер и перейдём на localhost, использовав порт, на котором работает Jenkins.

d802433487b564474e9294067dd030e9.png
Открытие панели управления Jenkins в браузере

Шаг 3 — Щёлкнем по кнопке New Item в панели управления

a89eb9309764490719513de3a6bf080d.png
Кнопка New Item

Шаг 4 — Введём имя проекта и, в качестве типа проекта, выберем Maven project.

03189dd5088d98dd2ca1438dbce5fb75.png
Ввод имени проекта и выбор его типа

Шаг 5 — Нажмём на кнопку OK. После этого можно будет увидеть, как в панели инструментов появилось новое задание.

3083b3c1225626932a226220c7bb36f0.png
Новый проект в панели управления

Шаг 6 — Выберем проект и нажмём на кнопку Configure.

59c03355b19b46de7de6c18d4f275d2c.png
Переход к настройке проекта

Шаг 7 — На вкладке Build, в поле Root POM, введём полный путь к файлу pom.xml. В поле Goals and options введём clean test.

0870b735d041fc79a586c8fa6045f71d.png
Настройка параметров сборки проекта

Шаг 8 — Щёлкнем Apply, а затем — Save.

Шаг 9 — Нажмём на кнопку Build Now.

7d0909f694358cedb0679bb4d6db3448.png
Запуск сборки проекта

Шаг 10 — Будет начата сборка проекта, а после её завершения появится соответствующее сообщение. Для того чтобы посмотреть полный журнал — нужно щёлкнуть по кнопке Console Output.

16c0e7072bf6c39ef7229247f2c91268.png
Просмотр журнала сборки

Итоги


Мы поговорили о том, почему проект Jenkins пользуется серьёзной популярностью, и о том, как интегрировать его с Selenium WebDriver ради эффективного выполнения тестов и достижения целей непрерывной интеграции программных проектов. Использование Jenkins для автоматизации запуска тестов позволяет разработчикам экономить время, а результаты выполнения тестов можно проанализировать, просмотрев соответствующие лог-файлы. Такой подход позволяет организовать полный цикл разработки ПО — разработку, развёртывание, тестирование, мониторинг, выпуск в продакшн. Jenkins поддерживает множество различных плагинов, предназначенных для решения самых разных задач, встающих перед разработчиками. Система, кроме того, умеет сообщать заинтересованным лицам о том, успешно ли прошла сборка проекта.

Надеюсь, теперь вы без труда сможете интегрировать Jenkins с Selenium WebDriver.

Пользуетесь ли вы Jenkins и Selenium WebDriver?

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru