В ожидании чудес
Рождество — время чудес. В канун нового года мы все строим планы на следующий. И мы надеемся, что все проблемы уйдут в конце года, и в будущем году произойдет чудо.
Каждый Java-разработчик мечтает о чуде, которое позволит ему стать самым эффективным Java-разработчиком в мире.
Я хочу показать вам такое чудо.
Это называется автоматизированные тесты !
Тьфу, тесты?
Да. Вы не станете настоящим мастером благодаря услугам micro / pico / nano. Вы станете настоящим мастером благодаря дисциплине. Дисциплина утверждает, что разработчик только тогда сообщает о выполненных работах, когда код и тесты написаны и выполнены.
Но разве тестирование не скучно?
О нет, поверь мне! Написание быстрых и стабильных автоматических тестов — сложная задача для самых умных руководителей. И это может быть очень весело и интересно. Вам нужно только использовать правильные инструменты.
Правильный инструмент для написания тестов пользовательского интерфейса:
селенида
Selenide — это библиотека с открытым исходным кодом для написания кратких и стабильных тестов пользовательского интерфейса.
Selenide — идеальный выбор для разработчиков программного обеспечения, потому что у него очень низкая кривая обучения. Таким образом, вам не нужно беспокоиться о деталях браузера, обо всех этих типичных проблемах Ajax и времени, которые поглощают большую часть времени инженеров QA.
Давайте посмотрим на простейший тест Selenide:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
public class GoogleTest { @Test public void user_can_search_everything_in_google() { $(By.name("q")).val("selenide").pressEnter(); $$("#ires .g").shouldHave(size(10)); $("#ires .g").shouldBe(visible).shouldHave( text("Selenide: concise UI tests in Java"), text("selenide.org")); }} |
Давайте посмотрим ближе, что здесь происходит.
- Вы открываете браузер одной командой
open(url) - Вы находите элемент на странице с помощью команды
$.
Вы можете найти элемент по имени, идентификатору, селектору CSS, атрибутам, xpath и даже по тексту. - Вы манипулируете элементом : вводите текст с помощью
val()и нажимаете ввод с (сюрприз-сюрприз!) - Вы проверяете результаты : найдите все найденные результаты с помощью
$$(он возвращает коллекцию всех соответствующих элементов). Вы проверяете размер и содержание коллекции.
Разве этот тест не легко читать? Не легко ли написать этот тест?
Я верю, что это так.
Глубже в деталях
Ajax / проблемы со временем
В настоящее время веб-приложения являются динамическими. Каждая отдельная часть приложения может быть визуализирована / изменена динамически в любой момент. Это создает много проблем для автоматизированных тестов. Зеленый тест сегодня может внезапно стать красным в любой момент, просто потому что браузер выполнил некоторый JavaScript немного дольше, чем обычно.
Это настоящая боль в Ajjaxx .
Совершенно невероятно, но Selenide решает большинство из этих проблем очень простым способом.
Проще говоря, каждый метод Selenide ждет немного, если это необходимо . Люди называют это «умным ожиданием».
Когда вы пишете:
|
1
|
$("#menu").shouldHave(text("Hello")); |
Selenide проверяет, существует ли элемент и содержит ли текст «Hello».
Если нет, то Selenide предполагает, что, вероятно, элемент будет динамически обновляться в ближайшее время, и немного подождет, пока это произойдет. Время ожидания по умолчанию составляет 4 секунды, что обычно достаточно для большинства веб-приложений. И конечно, это настраивается.
Богатый набор спичек
Вы можете проверить почти все с Selenide. Использование механизма «умного ожидания», упомянутого выше.
Например, вы можете проверить, существует ли элемент. Если нет, Selenide будет ждать до 4 секунд.
|
1
|
$(".loading_progress").shouldBe(visible); |
Вы даже можете проверить, что элемент не существует. Если он все еще существует, Selenide будет ждать до 4 секунд, пока не исчезнет.
|
1
|
$(By.name("gender")).should(disappear); |
И вы можете использовать свободные API и цепочечные методы, чтобы сделать ваши тесты действительно краткими:
|
1
2
3
|
$("#menu") .shouldHave(text("Hello"), text("John!")) .shouldBe(enabled, selected); |
Коллекции
Selenide позволяет работать с коллекциями, таким образом проверяя множество элементов в одной строке кода.
Например, вы можете проверить, что на странице ровно N элементов:
|
1
|
$$(".error").shouldHave(size(3)); |
Вы можете найти подмножество коллекций:
|
1
2
3
|
$$("#employees tbody tr") .filter(visible) .shouldHave(size(4)); |
Вы можете проверить тексты элементов. В большинстве случаев достаточно проверить всю таблицу или строку таблицы:
|
1
2
3
4
5
6
7
|
$$("#employees tbody tr").shouldHave( texts( "John Belushi", "Bruce Willis", "John Malkovich" )); |
Загрузить / скачать файлы
Загрузить файл с помощью Selenide довольно просто:
|
1
|
$("#cv").uploadFile(new File("cv.doc")); |
Вы даже можете загрузить несколько файлов одновременно:
|
1
2
3
4
5
|
$("#cv").uploadFile( new File("cv1.doc"), new File("cv2.doc"), new File("cv3.doc")); |
И это невероятно просто скачать файл:
|
1
|
File pdf = $(".btn#cv").download(); |
Тестирование «высокодинамичных» веб-приложений
Некоторые веб-фреймворки (например, GWT) генерируют HTML, который абсолютно нечитаем. Элементы не имеют постоянных идентификаторов или имен.
Это настоящая боль в xpathh .
Selenide предлагает решить эту проблему путем поиска элементов по тексту.
|
1
2
3
4
5
6
7
|
import static com.codeborne.selenide.Selectors.*;$(byText("Hello, Devoxx!")) // find by the whole text .shouldBe(visible);$(withText("oxx")) // find by substring .shouldHave(text("Hello, Devoxx!")); |
Поиск по тексту совсем не плохая идея. На самом деле, мне это нравится, потому что оно имитирует поведение реального пользователя. Реальный пользователь не находит кнопки по ID или XPATH — он находит по тексту (или, ну, по цвету).
Еще один полезный набор методов Selenide позволяет вам перемещаться между родителями и детьми.
|
1
2
3
4
|
$("td").parent()$("td").closest("tr")$(".btn").closest(".modal")$("div").find(By.name("q")) |
Например, вы можете найти ячейку таблицы по тексту, затем по ближайшему ее потомку tr и найти кнопку «Сохранить» внутри этой строки таблицы:
|
1
2
3
4
5
|
$("table#employees") .find(byText("Joshua")) .closest("tr.employee") .find(byValue("Save")) .click(); |
… И много других функций
Selenide имеет много других функций, таких как:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$("div").scrollTo();$("div").innerText();$("div").innerHtml();$("div").exists();$("select").isImage();$("select").getSelectedText();$("select").getSelectedValue();$("div").doubleClick();$("div").contextClick();$("div").hover();$("div").dragAndDrop()zoom(2.5);... |
но хорошая новость в том, что вам не нужно запоминать все эти вещи. Просто вставьте $, поставьте точку и выберите один из доступных вариантов, предложенных вашей IDE.
Используйте силу IDE! Сконцентрируйтесь на бизнес-логике.
Сделай мир лучше
Я верю, что мир станет лучше, когда все разработчики начнут писать автоматизированные тесты для своего кода. Когда разработчики встают в 17:00 и уходят к своим детям, не опасаясь, что они что-то сломали с последними изменениями.
Давайте сделаем мир лучше, написав автоматизированные тесты!
Поставьте работающее программное обеспечение.
| Ссылка: | Эффективные тесты пользовательского интерфейса с Selenide от нашего партнера JCG Андрея Солнцева в блоге Java Advent Calendar . |
