Интеграционные тесты?
Интеграционные тесты — это то, чем вы тестируете приложение как единое целое. Они являются противоположностью юнит-тестов, которые тестируют части вашего приложения отдельно друг от друга.
Обычно интеграционные тесты предоставляют какие-либо данные вашему приложению (часто просто инструкции, например, «посетить эту страницу») и проверяют ответ приложения (например, «Я должен увидеть этот текст где-то на странице»), не заботясь о том, что и как происходит в приложении в процессе обработки данных и получения результата. Интеграционные тесты взаимодействуют с приложением, как с чёрным ящиком. Для них не важно, как и что происходит внутри, важен только результат.
Интеграционные тесты с пакетом Integrated
Jeffrey Way создал отличный пакет для написания интеграционных тестов, который сейчас является частью ядра Laravel.
Это значит, что любые тесты, которые наследуют класс TestCase
, обеспечивают простой и гибкий интерфейс для работы с приложением, имитируя веб-браузер для получения и проверки результатов обработки запросов.
Я покажу здесь несколько примеров, но для полного ознакомления лучше обратиться к документации.
Простые тесты с visit()
и see()
|
<?php class HomePageTest extends TestCase { public function test_home_page_says_wowee() { $this->visit('/')->see('Wowee'); } } |
С помощью двух строк кода мы только что протестировали корневую страницу приложения на наличие фразы «Wowee» где-то на ней. Две строки кода, Карл. Если у вас есть хоть капля воображения, то не сложно представить, как далеко мы можем зайти в тестировании функционала нашего приложения, который видит конечный пользователь, приложив минимум усилий.
Проверяем текущую страницу при помощи seePageIs()
Полезно для проверки редиректов:
|
public function test_forwarder_forwards_the_page() { $this->visit('/forwarder')->seePageIs('forwarded-to'); } |
Проверяем ссылки методом click()
|
public function test_cta_link_functions() { $this->visit('/sales-page') ->click('Try it now!') ->see('Sign up for trial') ->onPage('trial-signup'); } |
Заполняем форму при помощи type()
, select()
, check()
, attach()
иpress()
Для ознакомления со всеми методами заполнения формы обратитесь к документации.
Например, вы можете заполнить форму и отправить её:
|
public function test_it_can_subscribe_to_newsletter() { $this->visit('/newsletter') ->press('Sign Up') ->see('Thanks for signing up!') ->onPage('newsletter/thanks'); } |
Метод press()
может принимать параметром как атрибут value
кнопки, так и её имя.
Вы также можете заполнить любые другие поля:
|
public function test_signups_can_complete() { $this->visit('/signup') ->type('Matt Stauffer', 'name') ->check('overTwentyOne') ->select('Florida', 'state') ->attach('../uploads/test.jpg', 'profilePicture') ->press('Sign Up') ->seePageIs('/signup/thanks'); } |
Отправка формы сразу со всеми данными при помощиsubmitForm()
|
public function test_login_form() { $this->visit('/login') ->see('Welcome!') ->onPage('dashboard'); } |
Проверяем запись в базе данных при помощи seeInDatabase()
|
public function test_saves_newsletter_signups() { $this->visit('/newsletter-signup') ->press('Sign up') } |
Автоматическое тестирование при изменении файлов
Elixir может запускать ваши тесты каждый раз при редактировании файлов, достаточно прописать в gulpfile.js
: mix.phpUnit()
. Теперь просто запустите gulp tdd
, и тесты будут перезапускаться каждый раз при изменении файлов и отображать результат.
Заключение
Как вы видите, Integrated заложил основу для простых и мощных интеграционных тестов при наименьших усилиях со стороны разработчика. Для ясности: я писал интеграционные тесты раньше и никогда ещё они не были настолько просты для начинающих, как сейчас.
Продолжение следует…
Понравилась статья или книга? Поделись с друзями: