Сегодня я хочу помочь вам лучше управлять вашими автоматизированными тестами GUI (Selenium). В прошлом я видел много разных способов, которыми люди справляются с этим. Некоторые люди просто пишут эти простые HTML TestCases с помощью Selenium-IDE, сохраняют их где-то на жестком диске и запускают вручную при необходимости. Другие даже не используют Selenium-IDE. Они пишут чистый Java для примера и автоматизируют их выполнение с помощью JUnit. Мое сегодняшнее решение лежит между ними.
непременное условие
- Я хочу простой HTML TestCases, созданный с помощью Selenium-IDE. Так что кто-то с небольшими навыками программирования может создавать их.
- Я хочу, чтобы эти тесты GUI запускались автоматически в процессе сборки, чтобы мой CI-Tool мог уведомлять меня об ошибках.
- Я также хочу, чтобы все TestCases в Versioncontrol находились в моем репозитории проектов, поскольку тесты растут вместе с источником.
- Я хочу самых маленьких усилий с самым высоким результатом. Поэтому я не хочу экспортировать тесты JUnit из моих тестовых примеров HTML, поскольку это будет своего рода дублирование — и я хочу придерживаться принципа СУХОЙ.
Решение
Прежде всего, я создаю Папку в своем Проекте для Selenium-Tests.
Структура папок
Пример TestSuite
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> < head > < meta content = "text/html; charset=UTF-8" http-equiv = "content-type" /> < title >Test Suite</ title > </ head > < body > < table id = "suiteTable" cellpadding = "1" cellspacing = "1" border = "1" class = "selenium" > < tbody > < tr > < td >< b >Test Suite</ b ></ td > </ tr > < tr > < td >< a href = "./SomeTest1.html" >SomeTest1</ a ></ td > </ tr > < tr > < td >< a href = "./SomeTest2.html" >SomeTest2</ a ></ td > </ tr > </ tbody > </ table > </ body > </ html > |
Пример теста
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" /> < link rel = "selenium.base" href = "" /> < title >SomeTest1.html</ title > </ head > < body > < table cellpadding = "1" cellspacing = "1" border = "1" > < thead > < tr > < td rowspan = "1" colspan = "3" >SomeTest1</ td > </ tr > </ thead > < tbody > < tr > < td >open</ td > < td >/</ td > < td ></ td > </ tr > < tr > < td >waitForElementPresent</ td > < td >//div[@id='someId']</ td > < td ></ td > </ tr > < tr > < td >click</ td > < td >css=button.create</ td > < td ></ td > </ tr > <!-- Some Steps --> < tr > < td >assertText</ td > < td > //div[@id='someId'] </ td > < td >${expectedText}</ td > </ tr > </ tbody > </ table > </ body > </ html > |
Настройка веб-сервера
Так что у меня есть мой TestSuite на месте. Но как мне их запустить? Самое главное, он должен работать в рамках процесса сборки Maven, поэтому он также будет работать на Jenkins-CI или чем-то еще. Поскольку мы проводим тестирование с реально работающим WebApp, это IntegrationTest для каждого определения. В Maven у нас есть возможность проводить такие тесты в рамках фазы интеграционных тестов . Если вы хотите узнать больше о жизненном цикле сборки Maven и его этапах, проверьте это . Поэтому нам нужен какой-то WebServer для запуска нашего WebApp, иначе тесты не будут работать. WebServer должен быть запущен до фазы тестирования интеграции , а затем остановлен. Мы могли бы использовать Tomcat7 или Jetty, например. В этом примере я буду использовать tomcat7-maven-plugin. Я настраиваю свой pom.xml для запуска предварительного тестирования Tomcat7.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< plugin > < groupId >org.apache.tomcat.maven</ groupId > < artifactId >tomcat7-maven-plugin</ artifactId > < version >2.0</ version > < executions > < execution > < id >tomcat-run</ id > < goals > < goal >run-war-only</ goal > </ goals > < phase >pre-integration-test</ phase > < configuration > < port >8080</ port > < fork >true</ fork > </ configuration > </ execution > < execution > < id >tomcat-shutdown</ id > < goals > < goal >shutdown</ goal > </ goals > < phase >post-integration-test</ phase > </ execution > </ executions > </ plugin > |
Если вы выполняете несколько проектов на CI-сервере, вы можете рассмотреть возможность использования разных номеров портов для каждого проекта.
Наконец: запустите тесты
И последнее, но не менее важное: нам нужно запустить тесты. К счастью, есть этот плагин Selen-Maven, который делает эту работу.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
< plugin > < groupId >org.codehaus.mojo</ groupId > < artifactId >selenium-maven-plugin</ artifactId > < version >2.3</ version > < configuration > < browser >*firefox</ browser > < suite >src/test/selenium/TestSuite.html</ suite > </ configuration > < executions > < execution > < id >run-selenium-tests</ id > < phase >integration-test</ phase > < goals > < goal >selenese</ goal > </ goals > </ execution > </ executions > </ plugin > |
Теперь, когда мы выполняем mvn clean verify или даже mvn clean install в консоли, тесты запускаются и отчеты сохраняются в целевом каталоге. Это также будет сделано вашим CI-Tool.
Вывод
У нас есть полная и чистая установка.
- У нас есть место для хранения наших тестов,
- Они находятся в пределах исходного кода и контроля версий
- Они могут запускаться автоматически CI-Tools
- Даже не разработчики могут добавлять новые тестовые случаи
Кстати: не сдавайтесь, если что-то не работает, как задумано. Селен кажется немного глючным, и иногда приходится копать немного, чтобы решить проблемы. Но это действительно работает, я понял это.