В этой статье я приведу пример настройки проекта Thucydides в Jenkins. Jenkins — это сервер непрерывной интеграции с открытым исходным кодом, который на сегодняшний день является несомненным лидером среди подобных программных продуктов. Про установку и настройку сервера можно почитать по этой ссылке.
Помимо возможностей, которые предоставляют сервера непрерывной интеграции, почему еще использование Jenkins может быть незаменимо для Thucydides или Selenium проектов? Ответ на это достаточно прост и заключается он в удобстве, удобстве запуска тестов и удобстве их разработки.
Подавляющее большинство автоматизаторов запускают тесты на той же самой машине, на которой работают. Мало того, что окна браузера постоянно открываются поверх Ваших рабочих окон и мешают работать, тесты в этом случае чаще всего завершаются неудачей. Это происходит потому, что Вы не вовремя нажали SHIFT или CTRL, или Ваш случайный клик закрыл ожидаемый браузером алерт, либо просто окно браузера не было в фокусе во время выполнения тестов. Безусловно, лучшее решение — это выделение отдельной машины для работы драйвера или аренда кластера в облаках, но такое решение не всегда приемлемо по ряду финансовых причин. Альтернативным решением может быть использование невидимого HtmlUnit драйвера, но это лишь частичное решение, потому что некоторые тесты просто невозможно выполнить с его помощью.
Запуск тестов в Jenkins позволит осуществлять тестирование на Вашей же машине, но в своей среде: тесты выполняются, но Вы не мешаете драйверу, а он Вам. Это пожалуй, одно из первых преимуществ использования Jenkins, но не далеко не самое важное по сравнению с возможностью сохранения историй выполнения сборок и запуском тестов по расписанию.
Пошаговый пример создания проекта:
1. Создаем новую задачу «Создать проект maven2/3».
2. Настраиваем проект. В этом примере я использую репозиторий Mercurial для загрузки проекта в Jenkins. Все необходимые плагины (например, Jenkins Mercurial plugin) нужно установить заранее.
Если Вы работаете на одной машине, то можете и вовсе не использовать svn, а просто копировать Ваш проект с диска в Jenkins (разрабатывать проект непосредственно в workspace Jenkins не рекомендуется, чтобы избежать непредвиденной потери данных):
3. Настройка сборки. Здесь мы вызываем запуск проекта точно также, как и из командной строки.
mvn clean integration-test thucydides:aggregate
Только опускаем вызов «mvn», Jenkins сделает это за нас. Именно в этой строке выполняются все основные настройки запуска, передаются все параметры, касающиеся Thucydides и Maven.
4. Для того, чтобы облегчить настройку запуска и не править каждый раз команды в строке (особенно, если тесты запускаете не только Вы), можно сделать сборку параметризированной. Тогда каждый раз при сборке проекта Jenkins будет запрашивать значения этих параметров. Установите флажок «Это параметризованная сборка» и добавьте необходимые параметры, которые после будут использоваться в строке maven:
Добавляем созданные параметры в строку запуска:
Применяем конфигурацию и запускаем сборку проекта:
Следующим окном Jenkins будет запрашивать ввод параметров, после чего начнется сборка и выполнение тестов:
В Post Steps можно настроить копирование папки с отчетом Thucydides в какой-нибудь архив, потому что при каждом последующем запуске, в отличии от логов консоли, которые хранятся в Jenkins, отчет Thucydides будет очищаться и перезаписываться.
Настройте также запуск сборки по расписанию, оповещение по email о результатах и наслаждайтесь автоматизацией автоматизированного тестирования 🙂
P.S. Для того, чтобы получить возможность запускать тесты выборочно и использовать параметр testname, приведенный выше, нужно подкорректировать pom файл проекта следующим образом. Добавить свойство testname в проект:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <thucydides.version>0.9.77</thucydides.version> <webdriver.driver>firefox</webdriver.driver> <testname>**/*Test.java</testname> </properties>
Настройка плагина для запуска тестов в стандартном варианте выглядит следующим образом:
<plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>2.12</version> <configuration> <includes> <include>**/*Test.java</include> <include>**/Test*.java</include> <include>**/When*.java</include> </includes> <argLine>-Xmx512m</argLine> <parallel>classes</parallel> <systemPropertyVariables> <webdriver.driver>${webdriver.driver}</webdriver.driver> </systemPropertyVariables> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin>
Используем наше свойство testname для конфигурации плагина:
<configuration> <includes> <include>${testname}</include> </includes> <argLine>-Xmx512m</argLine> <parallel>classes</parallel> <systemPropertyVariables> <webdriver.driver>${webdriver.driver}</webdriver.driver> </systemPropertyVariables> </configuration>
Спасибо!
Из интересного, еще можно рассказать благодарным читателям о том, как распараллелить запуск тестов.
а можно пример pom файла? для данной сборки.
Pom файл создан из архетипа net.thucydides:thucydides-simple-archetype с некоторыми изменениями запуска:
Здравствуйте, я добавила третий пареметр к сборке, который устанавливает в каком браузере запускать тесты. При запуске в firefox все работает, а в других браузерах нет, например в chrome выдается ошибка:
3240 [main] ERROR net.thucydides.core.webdriver.WebDriverFacade — FAILED TO CREATE NEW DRIVER INSTANCE class org.openqa.selenium.chrome.ChromeDriver: Could not instantiate class org.openqa.selenium.chrome.ChromeDriver
net.thucydides.core.webdriver.UnsupportedDriverException: Could not instantiate class org.openqa.selenium.chrome.ChromeDriver
Здравствуйте, в версиях 77 и 90 все работает нормально.
Запускается ли хром из командной строки? из IDE?
В cmd и IDE выдает такую же ошибку. Какие измения нужно в pom файле сделать, для запуска в разных браузерах?
Все зависит от причины. Скиньте, пожалуйста, полный текст ошибки.
Какая у Вас версия Thucydides?
Если верить ошибке, а именно вызывающей функции
chromeDriverFrom()
, то где-то 0.9.20. Если так, то стоит обновиться до одной из стабильных версий, например, 77.Если это не так, то значит, что у Вас мусор в проекте, в частности в pom-файле. От этого все и проблемы
Обновила версию, но ошибка осталась.
Возможно нужно прописать path?
Если ошибка в точности такая же, как и была, то нужно искать где у вас к проекту подключена старая библиотека
Посмотрите, пожалуйста, pom файл. По-моему все библиотеки подключены верно. Тем не менее в chrome все также ошибка.
Thucydides уже содержит все необходимые ему библиотеки Selenium, именно тех версий, с которыми он может работать. Подключать Selenium отдельно не стоит, это может приводить к ошибкам именно из-за конфликтов версий. В частности, Thucydides версии 0.9.92 включает в себя библиотеки Selenium версии 2.27. Попробуйте удалить верхние три зависимости: selenium-java, selenium-chrome-driver и selenium-server, и запуститься. Хотя Ваш pom файл у меня работает благополучно, значит в этом случае проблема не в нем
Я их только к последней сборке добавила, без них тоже не работает.
Вот если в свойствах прописать путь к драйверу: webdriver.chrome.driver C:\Program Files\Google\Chrome\Application\chromedriver.exe /webdriver.chrome.driver), то тесты запускаются, но все failure(такого не должно быть)
Failure из-за чего? какая ошибка?
[GET, HEAD, DELETE]
Command duration or timeout: 1 milliseconds
Build info: version: '2.27.0', revision: '18259', time: '2012-12-05 11:30:53'
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_09'
Session ID: 31ebb2edc55bb547f9f99ba785554dae
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=XP, chrome.chromedriverVersion=26.0.1383.0, acceptSslCerts=false, javascriptEnabled=true, browserName=chrome, rotatable=false, locationContextEnabled=false, version=24.0.1312.52, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, webStorageEnabled=true, nativeEvents=true, applicationCacheEnabled=false, takesScreenshot=true}]
27983 [main] INFO net.thucydides.core.Thucydides —
К сожалению, не все тесты могут быть благополучно выполнены во всех браузерах — это уже отдельная тема. Здесь ошибка самого Selenium-а, а не Thucydides. Есть до сих пор открытые таски Selenium по хрому и ие, которые находятся в состоянии доработки.
Во-первых, убедитесь, что у Вас последняя версия chromedriver. Если это не помогло, то с помощью отладчика найдите на каком именно действии падает драйвер и попробуйте его перепроектировать с использованием других методов.
Спроектировать тесты для запуска во всех браузерах — не минутная задача.
Особенно сложно будет сделать это под IE.
Спасибо, буду разбираться. А Вы не знаете, есть ли возможность запускать группы тестов (например по 10 из 100)? Параметризованная сборка описанная в блоге не очень подходит. Я видела решения только на основе Jenkins+Maven+TestNG
Если Вы имеете ввиду TestNG Groups, то их аналогом для JUnit будет использование Categories
А использование junit позволяет выводить дополнительную информацию в отчет для story или писать требования к тестам, как при использовании jbehave?
нет, для junit такой возможности нет
Жалко, я хотела вывести URL тестируемой страницы.
Татьяна, здравствуйте!
Не могли бы вы подсказать. У меня сервер на ubuntu. Настроил там Jenkins через Git. Сборка делается, но тесты не запускаются, выдаётся ошибка о том, что Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: LINUX. Вы писали об этом в одной из статей для Windows http://internetka.in.ua/selenium_driver_error/. Не подскажете ли, куда установить Firefox на сервере и как сказать тестам, чтобы они искали Firefox именно там?
Заранее огромное спасибо!
Не важно куда будет установлен Firefox на сервере. Полный путь к нему можно получить командой:
which firefox
Полученный путь можно передать в тесты параметром:
-Dwebdriver.firefox.bin=/usr/bin/firefox
или сделать так, внести путь к firefox в переменную PATH системы:
export PATH=$PATH:/usr/bin/firefox
Тогда, теоретически, Selenium найдет его сам.
Надеюсь, что поможет, потому что с линуксом дружу плохо 🙂