Разработка на основе поведения — отличный способ спроектировать и создать веб-слои вашего приложения. В этой статье я расскажу, как использовать JWebUnit, быструю и легкую среду веб-тестирования, с Easyb, мощной средой BDD на основе Groovy.
JWebUnit — это инфраструктура веб-тестирования, построенная на HTMLUnit. Это работает в памяти, так что это быстро. Тем не менее, он также имеет интуитивно понятный высокоуровневый API, облегчающий использование, даже если у вас есть только приблизительное представление о точных деталях HTML экранов вашего приложения. Простой тестовый пример JWebUnit показан здесь:
import net.sourceforge.jwebunit.junit.WebTestCase; import net.sourceforge.jwebunit.junit.WebTester; public class TestJWebUnitDepositStoryUI extends WebTestCase { public void setUp() { setBaseUrl("http://localhost:9090/ebank-web"); } public void testDepositingCashShouldAddToBalance() { beginAt("/"); assertTextPresent("Current Balance: $0"); setTextField("depositAmount","100"); clickButtonWithText("deposit"); assertTextPresent("Current Balance: $100"); } }
JWebUnit отлично работает, но мы можем добиться большего, добавив немного BDD-ароматизатора в смесь. Как оказалось, разработка на основе поведения (или «дизайн на основе поведения») является отличным способом моделирования взаимодействия пользователя с вашим приложением. В BDD вы структурируете свои требования в «заданном [некотором условии или состоянии], когда [какое-то событие происходит], тогда [мы ожидаем, что что-то еще случится]». Например, в интернет — банковского приложения, одно такое требование может быть « Учитывая , что я зашел на веб — сайте банка и мой баланс счета в банке составляет $ 0, когда я депозит $ 100, то новый баланс должен быть $ 100.»
Easyb — это среда разработки на основе поведения (BDD) для приложений Java и Groovy. Он основан на Groovy, но использует специальный DSL для выражения требований и тестов в стиле BDD. Как и во многих средах BDD, easyb позволяет вам выразить ваши требования (точнее, поведение вашего пользователя) практически на простом английском языке, прежде чем заполнять детали тестовым кодом. Например, вот рабочий сценарий теста Easyb, описывающий, как мы можем взаимодействовать с нашим банковским приложением:
scenario "Deposit cash via the web interface", {
given "the application home page is displayed"
and "the current balance is 0"
when "I type \$100 in the 'deposit cash' field"
and "I click on the 'deposit' button"
then "the new balance should be \$100"
}
Что касается Easyb, то это исполняемый тестовый код — однако он не будет делать очень много. Когда вы запускаете Easyb для такого сценария, он будет помечен как «ожидающий выполнения». Итак, теперь давайте посмотрим, как мы можем реализовать этот тест, используя JWebUnit.
Тестовые случаи JWebUnit должны расширять базовый класс WebTestCase. Это затрудняет интеграцию платформы с JUnit 4 или с чисто основанными на Java средами BDD, такими как JBehave. Тем не менее, Easyb построен на Groovy. С помощью небольшого волшебства Groovy мы можем встроить клиент JWebUnit в наши тестовые сценарии Easyb. Единственная хитрость в том, что нам все еще нужен класс, расширяющий WebTestCase, так как это абстрактный класс. Нам также нужно инициализировать внутреннюю переменную-член ‘tester’ экземпляром класса WebTester. Простой класс Groovy, как это, сделает свое дело.
class DepositCashWebClient extends WebTestCase { public DepositCashWebClient() { tester = new WebTester(); } }
Нам также нужно создать новый экземпляр этого класса для каждого теста. Мы можем сделать это, используя ключевое слово Easyb «before_each», как показано здесь:
before_each "initialize a web client", {
given "web client is up and running", {
webClient = new DepositCashWebClient()
webClient.setBaseUrl("http://localhost:9090/ebank")
}
}
Наша полная история испытаний Easyb выглядит следующим образом:
import net.sourceforge.jwebunit.junit.WebTestCase; import net.sourceforge.jwebunit.junit.WebTester; class DepositCashWebClient extends WebTestCase { public DepositCashWebClient() { tester = new WebTester(); } }; before_each "initialize a web client", { given "web client is up and running", { webClient = new DepositCashWebClient() webClient.setBaseUrl("http://localhost:9090/ebank") } } scenario "Deposit cash via the web interface", { given "the application home page is displayed", { webClient.beginAt("/") } and "the current balance is 0", { webClient.assertTextPresent("Current Balance: \$0") } when "I type \$100 in the 'deposit cash' field", { webClient.setTextField("depositAmount","100") } and "I click on the 'deposit' button", { webClient.clickButtonWithText("deposit") } then "the balance should be \$100", { webClient.assertTextPresent("Current Balance: \$100") } }
И при запуске этих простых сценариев вы получите отчет, который выглядит следующим образом:
Хотя эта версия кажется длиннее, чем версия Java, она, возможно, более читабельна и отражает намерения кода более точно, чем эквивалент Java. Отчет об испытаниях также ясно показывает, какие требования тестируются, в очень удобочитаемом виде. Написание тестов с использованием подхода BDD также помогает вам понять, насколько точно ваше приложение действительно выполняет то, о чем просили ваши пользователи. Отчеты, подобные приведенному выше, могут также дать пользователям и тестировщикам лучшее понимание того, что кодируется.
Я буду говорить о EasyB и BDD вместе с Лассе Коскела на Agile 2009 на следующей неделе в Чикаго в лекции под названием Исполняемые требования: BDD с easyb и JDave . Так что, если вам интересно узнать больше о BDD, приходите!