Есть задача: запускать тесты, написанные на #selenium #webdriver ( #java + #testng ) после чего сделать сборку на #maven и все это исполнять автоматически в Continious Integration System #jenkins . При этом все делать максимально просто c помощью визуальных средств.
Я буду описывать тезисно предпринятые шаги, сложности с которыми столкнулся и пути их решения, надеюсь на вашу помощь и советы. Тестировал почту ukr.net, я только начинающий в этих технологиях, поэтому не судите строго, все что здесь написано это мои пробы, ошибки и выводы… часто тоже ошибочные
Цель: самообучение и помощь тем, кто захочет освоить те же инструменты.
Необходимые знания: #webdriver и уметь писать на нем тесты, понимание test suite, #testng - буквально самые базовые аннотации, #eclipse .
Вдохновил меня вебинар А. Дзыни - Строим Web Testing #framework за 20 минут где он быстро пробежался по фреймворку #page-object + #page-factory и закинул это все в Jenkins, сборка через #maven. Я решил сделать нечто подобное, но у меня пока есть сложности с этим…
Что уже проделано:
I. #eclipse, #testng, #webdriver
1. Создаем проект на #eclipse.
Особенности:
- структура проекта (как расположены, папки, а в нем пекеджи (что является тоже папками)) важна для сборки в #maven::tag:
папки:
- src/main/java - внутри пекедж net.ukr.pages - находятся классы страниц ( шаблон #page-object)
- src/main/resources - на всякий случай для разных ресурсов, файлов, проперти и т.д.
- src/test/java - здесь пекедж net.ukr.tests - в нем находятся классы тестов
- не забываем добавить в build path библиотеки selenium и #testng
2. Пишем код теста на #java используя команды #selenium #webdriver и аннотации #testng
Я использовал Паттерн #page-object без Page Factory т.к. есть ряд неудобств связанных с инициализацией сразу всех элементов на странице если она динамическая, более подробно если интересно на блоге автора Testing your patience ...., Closing the (Page)Factory но это не так важно для нас.
Про паттерн #page-object написано много, здесь я описывать его не буду, отличное видео вот: http://youtu.be/RlppaRSqvhs и http://youtu.be/MwVSvUIqOE0.
3. Запуск тестов +создание TestNG.xml
Для #eclipse есть специальный плагин #testng с ним проще запускать тесты, установить его можно прямо с #eclipse. Запускаем, смотрим чтобы все работало. (Run as…)
Когда все работает нам нужно создать файл в формате xml который будет нести информацию как именно запускать тесты (какие включать, какие - нет, группы, пекеджи, классы и т.д.).
Почитать как настраивать такой файл можно в этом оф. туториале TestNG
Вот мой простенький код, он говорит что нужно запускать только мой один пекедж где мои классы тестов и лежат.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="net.ukr.TestNG by packages">
<test verbose="2" name="net.ukr.tests">
<packages>
<package name="net.ukr.tests"/>
</packages>
</test>
</suite>
Сохранить этот код нужно в корне папки проекта назвав его testng.xml
.
Обновляем проект чтобы файл появился в дереве Package Explorer (правой кнопкой на проекте - Refresh)
Теперь нужно запустить тесты через этот testng.xml чтобы проверить правильно ли мы его создали. Для этого надо зайти в Run Configurations там создать новый запуск #testng, выбрать нужный проект и поле Run… выбрать Suite - выбираем наш testng.xml.
Запускаем, если все работает через этот файл мы можем переходить к созданию билда в #maven.
II. #maven
1. Подготовление к запуску #maven
Мавен делает сборки проектов. Делается это через командную строку. Чтобы мавен знал что и как собрать, а так же что туда добавить (например зависимости - dependencies) мы все это описываем в файле pom.xml который лежит в корне проекта.
Для облегчения процесса сборки и создания pom.xml
файла для эклипса был создан плагин m2eclipse. Установить m2eclipse можно прямо с эклипса в окне Install New Software (Help).
Будем работать через этот плагин, он фактически является графическим интерпретатором кода который заносится в pom.xml.
Итак, установили m2e плагин, теперь делаем из проекта - мавен проект - правой кнопкой на проект Configure - Convert to #maven project.
Заполняем форму и получаем pom.xml файл в корне папки проекта.
//если выскочит еррор “Build path specifies execution environment J2SE-1.5. There are no JREs installed in the workspace that are strictly compatible with this environment.” - заходим в Build Path проекта и там JRE System Library [JavaSE-1.Х] - жмет Edit… и выбираем нужную версию, ошибка должна пройти
Dependency
Так как в нашем проекте есть как минимум две зависимости (dependency) это testng-6.7.jar
и selenium-server-standalone-2.21.0.jar
необходимо их внести в пом файл.
Для этого заходим в него (двойной клик) и выбираем вкладку Dependencies - Add...
и там начинаем вводить в третей строчке для поиска - “testng”, находим нужный нам (org.testng
) и добавляем. Так же находим и селениум написав “selenium java” и выбрали последний билд.
И org.apache.maven.plugins - maven-surefire-plugi
n -после его добавления внимательно проверить чтобы этот плагин в пом файле разместился внутри тега <plugins><plugin></plugins></plugin>
, а не в депенденси тегах.
Подключение testng.xml
Обновляем пом файл чтобы оно видело testng.xml который покажет какие методы запускать.
вставить нужно такой код:
<plugins>
[...]
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.2</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
[...]
</plugins>
Готовый pom.xml файл
Итак у нас есть готовый пом файл, проверим на всякий случай его исходник чтобы быть увереными что все в нем есть:
нам для запуска необходимо иметь минимум два плагина maven-compiler-plugin и maven-surefire-plugin (в тегах которого мы прописали наш testng.xml), а так же для нашего проекта подключенные две зависимости тестэнджи и селениум, +testng.xml
.
Получился такой код pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.ukr</groupId>
<artifactId>net.ukr</artifactId>
<version>1.0-SNAPSHOT</version>
<name>UkrNet_MavenName</name>
<description>UkrNet_MavenDescription</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12</version>
<inherited>true</inherited>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.24.1</version>
</dependency>
</dependencies>
</project>
2. Запуск #maven
Запускаем: Run As… #maven Test
// если видим такой еррор:
[ERROR] Unable to locate the Javac Compiler in:
[ERROR] C:\Program Files\Java\jre7..\lib\tools.jar
[ERROR] Please ensure you are using JDK 1.4 or above and
[ERROR] not a JRE (the com.sun.tools.javac.Main class is required).
[ERROR] In most cases you can change the location of your Java
[ERROR] installation by setting the JAVA_HOME environment variable.
Решение: в свойствах проекта если зайти в Java Build Path видно что проект запускается через JRE. Необходимо изменить на jdk (если его нет - скачать). Edit… - и выбрать jdk запускальщик.
В итоге мейвен создает сборку, запускает тест, унас открывается браузер и проходит тестирование как обычно. Теперь переходим к передачи запуска в Jenkins.
III Jenkins
1. Установка и подготовка к работе
http://jenkins-ci.org/ - оф. страница, справа сразу можно скачать под нужную ОС сам Jenkins.
Устанавливаем, заходим в браузере localhost:8080 и попадаем в ИнфоПанель.
Настроики: Скорее всего это не все, потому что на данный момент у меня не запускается правильно мой тест съют, но в любом случае вот вкладки которые я настраивал
заходим в Настроить #jenkins - Конфигурирование системы :
JDK:
JDK имя: jdk1.7.3
JAVA_HOME: C:\Program Files\Java\jdk1.7.0_03
Maven
Maven имя: MAVEN
MAVEN_HOME: C:\My Files\Distrib\apache-maven-3.0.4-bin\apache-maven-3.0.4 (скачать можно здесь Apache Download Mirrors )
больше ничего не менял.
2. Запуск
Необходимо создать новый job (Переходим в меню в “Новая задача”). Выбираем “Создать проект maven2/3”, пишем имя для нашей Новой Задачи например MyTEST1.
Дальше появляется окно настроек нового джоба. Я изменил только поля раздела Сборка
Корневой POM: C:\Users\HP\workspace\net.ukr - полный путь к папке проекта где лежит пом файл. net.ukr - у меня так проект называется.
Goals and options: clean test
Жмем Сохранить и получаем новую задачу. Запускаем ее - кликнув по “Запустить сейчас”.
Слева появится полоска прогресса процесса сборки. Кликнув на нее перейдем на конкретную сборку. В ней можно посмотреть текущее положение дел нажав “Вывод консоли”.
Как результат вывод консоли у меня следующий:
Started by user anonymous
Building in workspace C:\Program Files (x86)\Jenkins\workspace\UkrNetMavenJenkinsTest
Parsing POMs
[net.ukr] $ "C:\Program Files\Java\jdk1.7.0_03/bin/java" -cp "C:\Program Files (x86)\Jenkins\plugins\maven-plugin\WEB-INF\lib\maven3-agent-1.2.jar;C:\Program Files (x86)\Jenkins\tools\Maven\MAVEN\boot\plexus-classworlds-2.4.jar" org.jvnet.hudson.maven3.agent.Maven3Main "C:\Program Files (x86)\Jenkins\tools\Maven\MAVEN" "C:\Program Files (x86)\Jenkins\war\WEB-INF\lib\remoting-2.16.jar" "C:\Program Files (x86)\Jenkins\plugins\maven-plugin\WEB-INF\lib\maven3-interceptor-1.2.jar" 56253
<===[JENKINS REMOTING CAPACITY]===>channel started
log4j:WARN No appenders could be found for logger (org.apache.commons.beanutils.converters.BooleanConverter).
log4j:WARN Please initialize the log4j system properly.
Executing Maven: -B -f C:\Users\HP\workspace\net.ukr\pom.xml clean test
[INFO] Scanning for projects...
Projects to build: [MavenProject: net.ukr:net.ukr:1.0-SNAPSHOT @ C:\Users\HP\workspace\net.ukr\pom.xml]
projectStarted net.ukr:net.ukr:1.0-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building UkrNet_MavenName 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
mojoStarted org.apache.maven.plugins:maven-clean-plugin:2.4.1(default-clean)
[INFO]
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ net.ukr ---
[INFO] Deleting C:\Users\HP\workspace\net.ukr\target
mojoSucceeded org.apache.maven.plugins:maven-clean-plugin:2.4.1(default-clean)
mojoStarted org.apache.maven.plugins:maven-resources-plugin:2.5(default-resources)
[INFO]
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ net.ukr ---
[debug] execute contextualize
[WARNING] Using platform encoding (Cp1251 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
mojoSucceeded org.apache.maven.plugins:maven-resources-plugin:2.5(default-resources)
mojoStarted org.apache.maven.plugins:maven-compiler-plugin:2.3.2(default-compile)
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ net.ukr ---
[WARNING] File encoding has not been set, using platform encoding Cp1251, i.e. build is platform dependent!
[INFO] Compiling 7 source files to C:\Users\HP\workspace\net.ukr\target\classes
mojoSucceeded org.apache.maven.plugins:maven-compiler-plugin:2.3.2(default-compile)
mojoStarted org.apache.maven.plugins:maven-resources-plugin:2.5(default-testResources)
[INFO]
[INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ net.ukr ---
[debug] execute contextualize
[WARNING] Using platform encoding (Cp1251 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\HP\workspace\net.ukr\src\test\resources
mojoSucceeded org.apache.maven.plugins:maven-resources-plugin:2.5(default-testResources)
mojoStarted org.apache.maven.plugins:maven-compiler-plugin:2.3.2(default-testCompile)
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ net.ukr ---
[WARNING] File encoding has not been set, using platform encoding Cp1251, i.e. build is platform dependent!
[INFO] Compiling 3 source files to C:\Users\HP\workspace\net.ukr\target\test-classes
mojoSucceeded org.apache.maven.plugins:maven-compiler-plugin:2.3.2(default-testCompile)
mojoStarted org.apache.maven.plugins:maven-surefire-plugin:2.12(default-test)
[INFO]
[INFO] --- maven-surefire-plugin:2.12:test (default-test) @ net.ukr ---
[INFO] Surefire report directory: C:\Users\HP\workspace\net.ukr\target\surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
Attempt of waitingForIsdisplayed with Locator - By.xpath: .//*[@id='msglist_rows'] is: 1
Comparing .getText (Операция выполнена) from element (locator: By.xpath: .//*[@id='info-block']) with CharSequence [Операция выполнена] - PASSED. Return true.
Letter sent. Confirmation is displayed. Assert - pass
sentLetterCountOld 3
Tests run: 3, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 2,230.54 sec <<< FAILURE!
Results :
Failed tests: testSendMail(net.ukr.tests.MainFunctions): Element not found in the cache - perhaps the page has changed since it was looked up(..)
Tests run: 3, Failures: 1, Errors: 0, Skipped: 0
mojoSucceeded org.apache.maven.plugins:maven-surefire-plugin:2.12(default-test)
[ERROR] There are test failures.
Please refer to C:\Users\HP\workspace\net.ukr\target\surefire-reports for the individual test results.
[JENKINS] Recording test results
projectSucceeded net.ukr:net.ukr:1.0-SNAPSHOT
sessionEnded
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 37:20.883s
[INFO] Finished at: Mon Aug 20 20:32:12 EEST 2012
[INFO] Final Memory: 21M/178M
[INFO] ------------------------------------------------------------------------
Projects to build: [MavenProject: net.ukr:net.ukr:1.0-SNAPSHOT @ C:\Users\HP\workspace\net.ukr\pom.xml]
[JENKINS] Archiving C:\Users\HP\workspace\net.ukr\pom.xml to C:\Program Files (x86)\Jenkins\jobs\UkrNetMavenJenkinsTest\modules\net.ukr$net.ukr\builds\2012-08-20_19-54-48\archive\net.ukr\net.ukr\1.0-SNAPSHOT\net.ukr-1.0-SNAPSHOT.pom
Ожидаю пока #jenkins закончит сбор данных
ERROR: Illegal address
channel stopped
ERROR: Illegal address
javax.mail.internet.AddressException: Illegal address in string ``''
at javax.mail.internet.InternetAddress.<init>(InternetAddress.java:114)
at hudson.tasks.Mailer.StringToAddress(Mailer.java:152)
at hudson.tasks.MailSender.createEmptyMail(MailSender.java:317)
at hudson.tasks.MailSender.createUnstableMail(MailSender.java:187)
at hudson.tasks.MailSender.getMail(MailSender.java:158)
at hudson.tasks.MailSender.execute(MailSender.java:99)
at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.cleanUp(MavenModuleSetBuild.java:1012)
at hudson.model.Run.execute(Run.java:1546)
at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:477)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:236)
Finished: SUCCESS
Важно: Если у вас тест запускается но очень долго, то возможно это проблемы сервера сайта который вы тестируете!
[...]
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
и значек загрузки… и так пол часа…
В моем примере один простенький тест на поиск слова в поиске главной страницы проходил больше 3 минут в Дженкинсе, когда напрямую в Эклипсе он занимал не больше нескольких секунд. Тест из трех тест кейсов которые тестировали отправку писем, удаление и сохранение в черновик тестировалось 37 (!) минут в Дженкинсе, что заставило искать ошибку у себя. Только потом проверив на простеньких тестах понял что это не моя ошибка.
UPD: Проблема была у самого #jenkins версии 1.477 в совместимости с #maven при работе с некоторыми серверами.
Итак тест исполнился, задача выполнена. Всем спасибо)
Так же для полной картины необходимо использовать CVS (Concurrent Versions System, «Система Одновременных Версий»)
Если что-то непонятно или не получается, а также по вопросам поддержки или личных консультаций пишите сюда