Статьи

Тестуємо web-додатки за допомогою Selenium RC

  1. Знайомимося з Selenium RC
  2. Завантажуємо і встановлюємо Selenium RC
  3. Приклад програми для тестування
  4. Лістинг 1. Сторінка index.jsp
  5. Лістинг 2. Сторінка enterInfo.jsp
  6. Малюнок 1. Натискаємо Run All
  7. Експортуємо тест в JUnit
  8. Дозволяємо помилки в Eclipse
  9. Додаємо тест JUnit
  10. Лістинг 3. JUnit-тест, заснований на коді, експортованому з Selenium IDE
  11. Переглядаємо результати тестів
  12. Запускаємо сервер з IDE
  13. копнемо глибше
  14. Лістинг 4. JUnit-тест для перевірки enterInfo.jsp
  15. автоматизуємо тести
  16. Лістинг 5. Сценарій Ant для запуску тестів Selenium
  17. Виконуємо тести в інших браузерах
  18. висновок
  19. Ресурси для скачування

Знайомимося з Selenium Remote Control

Інфраструктури модульного тестування, такі як JUnit, дозволяють тестувати код, що виконується на стороні сервера. Однак в типовому Web-додатку серверний код є лише малою частиною всього коду програми. У таких додатках може бути багато коду, який можна протестувати тільки за допомогою інструменту, що працює з браузером.

Одним з найбільш складних аспектів тестування web-додатків є тестування частини коду програми, що відноситься до призначеного для користувача інтерфейсу, яка, як правило, генерується з HTML і JavaScript-коду. Цей код виконується в браузері, а не в процесі сервера, тому його можна перевірити тільки за допомогою браузера. Прикладами такого коду є сторінки JavaServer Pages (JSP), код PHP і Ruby.

У цій статті ви познайомитеся з інструментом Selenium, за допомогою якого можна створювати і автоматизувати тести web-додатків. Ви дізнаєтеся, як швидко створювати приклади тестів, розширювати їх, і як за допомогою Selenium Remote Control запускати їх у вигляді автоматичних тестів.

Знайомимося з Selenium RC

Selenium RC є частиною набору інструментів, наявних в проекті Selenium. З його допомогою можна автоматично запускати створені тести. Selenium RC працює на багатьох операційних системах та з різними браузерами, в тому числі з Windows® Internet Explorer®, Mozilla Firefox і Opera.

Використовуючи Selenium RC, можна автоматично виконувати тести скільки завгодно раз. Крім того, цей інструмент дозволяє створювати більш складні тести, ніж ті, які можна робити в Selenium IDE. В тести можна додавати інструкції умов і повторів, які можуть вам стати в нагоді, якщо ви хочете виконати тести з певним набором даних. Також можна обробляти очікувані виключення з допомогою конструкцій, наявних в інфраструктурах модульного тестування, таких як JUnit.

Завантажуємо і встановлюємо Selenium RC

Для початку роботи з Selenium RC його потрібно завантажити і встановити. Сервер Selenium є звичайним JAR-файлом, який можна виконати в середовищі виконання (JRE або Java ™ Runtime Environment) .Загрузіть JAR-файл і інші необхідні файли можна з сайту SeleniumHQ (див. Посилання в розділі ресурси ).

Після закінчення завантаження розпакуйте архів, що містить Selenium RC, і помістіть його куди-небудь на своїй файлової системи. Тепер можна запустити сервер Selenium, виконавши наступну команду:

java -jar selenium-server.jar

Приклад програми для тестування

У цій статті використовується просте динамічне web-додаток зі сторінками JSP. На прикладі цієї програми ми продемонструємо роботу Selenium RC і покажемо, як його використовувати для автоматичного тестування. Наше web-додаток складається з двох сторінок: сторінки авторизації і сторінки, на якій можна ввести ім'я і дату народження, на підставі яких додаток обчислює вік і видає повідомлення "Hello".

На прикладі цієї програми ми покажемо, як можна виконувати тести в різних умовах. Перша сторінка показана в лістингу 1. Це проста сторінка авторизації, яка дозволяє увійти в web-додаток. Для простоти в цьому прикладі ми порівнюємо інформацію авторизації з рядками, зазначеними безпосередньо в коді.

Лістинг 1. Сторінка index.jsp
<% @ Page language = "java" contentType = "text / html; charset = UTF-8" pageEncoding = "UTF-8"%> <% if ( "process" .equals (request.getParameter ( "action")) ) {if ( "user" .equals (request.getParameter ( "username")) && "secret" .equals (request.getParameter ( "password"))) {response.sendRedirect ( "enterInfo.jsp"); return; }}%> <! DOCTYPE html PUBLIC "- // W3C // DTD HTML 4.01 Transitional // EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv = "Content-Type" content = "text / html; charset = UTF-8"> <title> Test Login Page </ title> </ head> <body> <form action = "<% = request.getRequestURI ()%> "method =" POST "> <input type =" hidden "value =" process "name =" action "/> <label for =" username "> Username: <br /> <input type = "text" id = "username" name = "username" /> </ label> <br /> <label for = "password"> Password: <br /> <input type = "password" id = "password" name = "password" /> </ label> <br /> <input type = "submit" value = "Login" /> </ form> </ body> </ html>

Друга сторінка показана в лістингу 2. При введенні імені і дати народження сторінка просто виводить повідомлення "Hello" і повідомляє вік користувача на сьогоднішній день. Це трохи надуманий приклад, так як в більшості web-додатків подібна інформація вимагала б авторизації і зберігалася б до наступного входу в додаток.

Лістинг 2. Сторінка enterInfo.jsp
<% @ Page language = "java" contentType = "text / html; charset = UTF-8" pageEncoding = "UTF-8"%> <! DOCTYPE html PUBLIC "- // W3C // DTD HTML 4.01 Transitional // EN "" http://www.w3.org/TR/html4/loose.dtd "> <% @ page import =" java.util.Date "%> <% @ page import =" java.text.SimpleDateFormat "% > <% @ page import = "java.text.ParseException"%> <%! private Date parseDate (String dateValue) {Date returnDate = null; try {// це не найефективніший метод, в ідеалі інструкції try ... catch // не рекомендується використовувати для обробки виняткових ситуацій // бізнес-логіки ... SimpleDateFormat dateFormat = new SimpleDateFormat ( "MM / dd / yyyy"); returnDate = dateFormat.parse (dateValue); } Catch (ParseException pe) {// нічого не робимо ...} return returnDate; }%> <Html> <head> <meta http-equiv = "Content-Type" content = "text / html; charset = UTF-8"> <title> Insert title here </ title> </ head> <body > <form action = "<% = request.getRequestURI ()%>" method = "POST"> <input type = "hidden" value = "process" name = "action" /> <label for = "name"> Your name: <br /> <input type = "text" id = "name" name = "name" /> </ label> <br /> <label for = "birthdate"> Your birth date (in MM / DD / YYYY format): <br /> <input type = "text" id = "birthdate" name = "birthdate" /> </ label> <br /> <% if ( "process" .equals (request.getParameter ( "action"))) {// перевіряємо дату Date birthDate = parseDate (request.getParameter ( "birthdate")); if (birthDate == null) {// виводимо повідомлення про помилку ... out.write ( "<p class = \" error \ "> Please enter a valid date. </ p>"); } Else {// виводимо повідомлення ...}}%> <input type = "submit" value = "Submit" /> </ form> </ body> </ html>

Пишемо перший тест

Для швидкого написання початкових тестів, які потім будуть використовуватися в якості основи для створення автоматичних тестів, можна скористатися середовищем Selenium IDE. Середа Selenium IDE являє собою модуль розширення Firefox, який дозволяє записувати тести. Після запису тести можна експортувати, щоб в них можна було додати умови, повтори і т.д.

Для початку роботи з Selenium IDE завантажте її за посиланням в розділі ресурси . Натисніть на посилання і встановіть Selenium IDE як модуль розширення Firefox. Firefox запропонує вам встановити модуль розширення, після чого потрібно буде перезапустити браузер, щоб зміни вступили в силу.

Встановивши модуль розширення, запустіть сервер, після чого можна приступати до роботи з web-додатком. Щоб відкрити Selenium IDE, натисніть в Firefox Tools> Selenium IDE. Коли Selenium IDE відкриється, натисніть Record. Selenium IDE почне запис: вона буде запам'ятовувати всі дії, які ви виконуєте в браузері. Щоб увійти в тестове додаток, виконайте наступні кроки:

  1. Увімкніть запис в Selenium IDE і перейдіть на сторінку index.jsp.
  2. Введіть ім'я користувача.
  3. Введіть правильний пароль в поле Password.
  4. Натисніть Login.

Після успішного входу в web-додатку повинна відкритися сторінка enterInfo.jsp. На даний момент в тесті вже є кроки, проте ще немає ніяких перевірок того, що вони виконані успішно. Середа Selenium повинна знати, на що їй треба подивитися, щоб зрозуміти, відобразилася чи сторінка enterInfo.jsp так, як очікувалося.

Можна додати перевірочні дії, щоб переконатися, що додаток відображає правильне вміст. Не вимикаючи запис в Selenium, виконайте наступні кроки:

  1. Натисніть правою кнопкою миші на будь-якому HTML-елементі, наприклад написи Your name і натисніть verifyTextPresent Your name:.
  2. Повторіть крок 1 для напису Your birth date.
  3. Натисніть Record, щоб зупинити запис.

Якщо ви хочете побачити свій тест в дії, натисніть Run All (див. Малюнок 1). Тест почне виконуватися і завершиться успішно.

Малюнок 1. Натискаємо Run All

Щоб переконатися, що Selenium IDE насправді тестує наш додаток, відкрийте свою IDE і поміняйте в коді значення імені користувача. Перезапустіть програму і знову натисніть Run All. На цей раз тест не пройде, тому що web-програма не відобразить сторінку enterInfo.jsp з правильними написами.

Експортуємо тест в JUnit

Ми записали свій перший тест і тепер можемо експортувати його для використання в JUnit. Виберіть в Selenium IDE свій тест, натисніть File> Export Test Case As> Java (JUnit) - Selenium RC. Введіть назву тесту (наприклад, IndexTests.java), і збережіть його, щоб потім імпортувати в Eclipse.

Виконайте наступні кроки:

  1. Створіть новий Java-проект, що включає в себе модульні тести Java, створені за допомогою JUnit.
  2. Завантажте виконувані файли Selenium RC (див. Посилання в розділі ресурси ). Збережіть файл архіву куди-небудь, звідки його вміст можна буде імпортувати в ваш новий Java-проект в Eclipse.
  3. Створіть у своєму Java-проект нову папку з ім'ям lib.
  4. Натисніть File> Import, а потім виберіть у списку File System. Натисніть Next.
  5. Перейдіть в директорію, в яку ви витягли файли Selenium RC, і виберіть директорію selenium-java-client-driver-1.0.1.
  6. Виберіть в списку selenium-java-client-driver.jar і натисніть OK, щоб імпортувати JAR-файл з клієнтським драйвером Selenium для Java в директорію lib свого проекту.
  7. Імпорт Java-файл тесту, який ви експортували з Selenium IDE, в директорію src свого нового Java-проекту.

Перше, що ви після цього побачите - це безліч помилок компіляції. По-перше, ваш новий Java-файл, можливо, не знаходиться в правильному пакеті, так як зараз він розташований безпосередньо в директорії src. По-друге, неможливо знайти класи JUnit або Selenium. На щастя, ці помилки можна легко вирішити за допомогою Eclipse.

Дозволяємо помилки в Eclipse

Для виправлення помилки з пакетом, виберіть помилку і натисніть Ctrl-1, щоб відкрити підказки. Виберіть Move MyTest.java to package 'com.example.mywebapp.tests'. Eclipse створить за вас пакет і помістить в нього файл.

Додаємо тест JUnit

Тепер додамо тести Selenium і JUnit. Для цього виберіть в Package Explorer наш Java-проект і натисніть Build Path> Configure Build Path. На вкладці Libraries натисніть Add JARs і виберіть файл selenium-java-client-driver.jar. Натисніть OK.

Коли вихідні Java-файли скомпілюйте, тест повинен виглядати так, як показано в лістингу 3.

Лістинг 3. JUnit-тест, заснований на коді, експортованому з Selenium IDE
package com.example.mywebapp.tests; import org.junit.Before; import org.junit.Test; import com.thoughtworks.selenium.SeleneseTestCase; public class EnterInfoTests extends SeleneseTestCase {@Before public void setUp () throws Exception {setUp ( "http: // localhost: 8080 / tested-webapp / index.jsp", "* firefox"); } @Test public void testBadDate () {doLogin (); selenium.type ( "name", "User"); selenium.type ( "birthdate", "@ # $ # @"); selenium.click ( "// input [@ value = 'Submit']"); selenium.waitForPageToLoad ( "30000"); verifyTrue (selenium.isTextPresent ( "Please enter a valid date")); } @Test public void testValidDate () {doLogin (); selenium.type ( "birthdate", "12/2/1999"); selenium.click ( "// input [@ value = 'Submit']"); selenium.waitForPageToLoad ( "30000"); verifyFalse (selenium.isTextPresent ( "Please enter a valid date")); } Private void doLogin () {selenium.open ( "/ tested-webapp / index.jsp"); selenium.type ( "username", "user"); selenium.type ( "password", "secret"); selenium.click ( "// input [@ value = 'Login']"); selenium.waitForPageToLoad ( "30000"); }}

Якщо ви не можете завантажити і встановити Selenium IDE через будь-яких обмежень, які не дозволяють вам використовувати Firefox, ви все одно можете писати тести, які можна буде запускати за допомогою Selenium RC. Просто використовуйте в якості відправної точки показані тут приклади, а також звертайтеся до документації Selenium, зазначеної в розділі ресурси .

Переглядаємо результати тестів

Ми вже написали перший приклад тесту, тепер давайте подивимося на нього в дії. Запустимо сервер Selenium і виконаємо тест як стандартний модульний тест JUnit. Запустіть сервер Selenium, виконавши наступну команду:

java -jar selenium-server.jar
Запускаємо сервер з IDE

Для найбільш повної інтеграції можна конфігурувати запуск сервера Selenium безпосередньо з Eclipse. Натисніть Run> External Tools> External Tool Configurations і введіть в налаштуваннях зовнішнього інструменту команду для запуску сервера.

Після запуску сервера Selenium можна виконати модульний тест, натиснувши правою кнопкою миші на файл IndexTest.java і вибравши Run As> JUnit Test. Для того щоб сервер Selenium запустив екземпляр вашого браузера і виконав тести, може знадобитися деякий час. Після закінчення тесту ви побачите в Eclipse той же висновок, що і для звичайних модульних тестів.

копнемо глибше

Ми зробили за допомогою Selenium IDE простий тест і експортували його в Java-файл, а тепер давайте створимо складніший тест, який перевіряє функції сторінки enterInfo.jsp. Приклад такого тесту показаний в лістингу 4.

Лістинг 4. JUnit-тест для перевірки enterInfo.jsp
package com.example.mywebapp.tests; import org.junit.Before; import org.junit.Test; import com.thoughtworks.selenium.SeleneseTestCase; public class EnterInfoTests extends SeleneseTestCase {@Before public void setUp () throws Exception {setUp ( "http: // localhost: 8080 / tested-webapp / index.jsp", "* firefox"); } @Test public void testBadDate () {doLogin (); selenium.type ( "name", "User"); selenium.type ( "birthdate", "@ # $ # @"); selenium.click ( "// input [@ value = 'Submit']"); selenium.waitForPageToLoad ( "30000"); verifyTrue (selenium.isTextPresent ( "Please enter a valid date")); } @Test public void testValidDate () {doLogin (); selenium.type ( "birthdate", "12/2/1999"); selenium.click ( "// input [@ value = 'Submit']"); selenium.waitForPageToLoad ( "30000"); verifyFalse (selenium.isTextPresent ( "Please enter a valid date")); } Private void doLogin () {selenium.open ( "/ tested-webapp / index.jsp"); selenium.type ( "username", "user"); selenium.type ( "password", "secret"); selenium.click ( "// input [@ value = 'Login']"); selenium.waitForPageToLoad ( "30000"); }}

У цьому тесті в якості основи використаний клас LoginTest, показаний в лістингу 3 . Функція doLogin () виконує авторизацію в додатку, вона використовується на початку тестів.

Метод testBadDate () використовується для введення некоректних значень в поле birthdate і відправки форми. У ньому перевіряється, що при введенні некоректної дати з'являється відповідне повідомлення про помилку. Метод testValidDate () перевіряє, що при введенні коректної дати з'являється повідомлення з правильним віком користувача.

Використовуючи можливості Java, доступні в інфраструктурі JUnit, можна виконувати тести в циклі, додавати в тести умови і перевіряти винятку. Дізнатися більше про JUnit і модульному тестуванні можна по посиланнях в розділі ресурси .

автоматизуємо тести

Тепер, коли ми вміємо запускати тести з Eclipse, давайте повністю автоматизуємо виконання тестів за допомогою сценарію Apache Ant з кількома цілями. Маючи сценарій Ant, можна за допомогою таких інструментів, як Hudson або CruiseControl (див. ресурси ), Реалізувати постійне виконання цих тестів.

Для автоматизації виконання тестів можна використовувати сценарій Ant, в якому будуть застосовуватися мети JUnit для виконання тестів Selenium RC. Сценарій показаний в лістингу 5.

Лістинг 5. Сценарій Ant для запуску тестів Selenium
<Project name = "tested-webapp-tests" default = "run-tests" basedir = "."> <Property name = "selenium.server.jar" value = "/ path / to / selenium-server.jar" / > <property name = "src" value = "$ {basedir} / src" /> <property name = "build" value = "$ {basedir} / bin" /> <property name = "lib" value = "$ {basedir} / lib "/> <! - Could be defined in Ant runtime classpath, but here is better -> <property name =" hamcrest.home "value =" / path / to / eclipse / plugins "/> <property name = "junit4.home" value = "/ path / to / junit4 /" /> <path id = "classpath"> <fileset dir = "$ {lib}" includes = "** / *. jar" /> <fileset dir = "$ {hamcrest.home}" includes = "org.hamcrest.core * .jar" /> <fileset dir = "$ {junit4.home}" includes = "junit.jar" /> < / path> <target name = "start-selenium-server"> <java jar = "$ {selenium.server.jar}" fork = "true" spawn = "true"> <arg line = "- timeout 30" / > </ java> </ target> <target name = "compile-tests"> <javac srcdir = "$ {src}" destdir = "$ {build}" /> </ target> <target name = "run- tests "depends =" compile-tests "> <junit printsummary =" false "showoutput = "True" outputtoformatters = "true"> <formatter type = "brief" usefile = "false" /> <classpath> <path refid = "classpath" /> <pathelement path = "$ {build}" /> </ classpath > <batchtest fork = "yes"> <fileset dir = "$ {src}"> <include name = "** / * Tests.java" /> </ fileset> </ batchtest> </ junit> <echo message = "Finished running tests.&quot; /> </ Target> <target name = "stop-selenium-server"> <get taskname = "selenium-shutdown" src = "// localhost: 4444 / selenium-server / driver /? Cmd = shutDownSeleniumServer" dest = " result.txt "ignoreerrors =" true "/> </ target> <target name =" run-all "> <parallel> <antcall target =" start-selenium-server "> </ antcall> <sequential> <echo taskname = "waitfor" message = "Wait for proxy server launch" /> <waitfor maxwait = "1" maxwaitunit = "minute" checkevery = "100"> <http url = "http: // localhost: 4444 / selenium-server / driver /? cmd = testComplete "/> </ waitfor> <antcall target =" run-tests "> </ antcall> <antcall target =" stop-selenium-server "> </ antcall> </ sequential> </ parallel > </ target> </ project>

У цьому сценарії Ant є три мети. У першій цілі start-selenium-server, запускається у фоновому режимі сервер Selenium. Мета run-tests безпосередньо виконує Junit-тести, а мета stop-selenium-server зупиняє сервер, посилаючи сервера команду зупинки за допомогою запиту за певним URL-адресою.

За допомогою подібного сценарію Ant можна автоматично виконувати тести Selenium або за розкладом, або використовуючи сценарій в інструменті постійної інтеграції. Додаткову інформацію про системах постійної інтеграції можна отримати за посиланнями в розділі ресурси .

Виконуємо тести в інших браузерах

Поки в нашому прикладі тести виконувалися в браузері Firefox. Однак іноді буває потрібно протестувати web-додаток в інших браузерах, щоб переконатися, що воно працює правильно в різних браузерах.

Можливо, ви помітили, що при налаштуванні тестів в метод setUp () тесту JUnit батьківського методу setUp () передається другий параметр * firefox Цей параметр запускає екземпляр браузера Firefox.

Щоб виконати тест в іншому браузері, просто передайте в другому аргументі назву браузера. Наприклад, для запуску браузера Internet Explorer використовується значення * iexplore. Для браузерів Opera і Apple Safari використовуються значення * opera і * safari відповідно.

Зауважте, що обраний вами браузер має підтримувати операційна система, на якій ви запускаєте тести. Якщо ви спробуєте виконати тести в браузері, якого немає в операційній системі, наприклад в * safari або * iexplore на системі Linux® буде видано виняток, і тести не пройдуть.

висновок

У цій статті ми познайомилися з інструментом Selenium і двома його компонентами: Selenium IDE і Selenium RC. Selenium IDE надає простий спосіб запису тестів для web-додатків. За допомогою компонента Selenium RC можна автоматизувати тести і додавати в них нові можливості.

Автоматичне тестування web-додатки за допомогою браузера може стати відмінним доповненням до існуючих модульним тестів, які покривають їхню інші частини вашого застосування. Автоматичні тести прискорюють регресійне тестування і дозволяють розробникам швидше дізнаватися про проблеми.

Ресурси для скачування

Схожі теми

Підпишіть мене на повідомлення до коментарів

Quot; /> </ Target> <target name = "stop-selenium-server"> <get taskname = "selenium-shutdown" src = "// localhost: 4444 / selenium-server / driver /?

Новости