Интеграционные тесты?
Интеграционные тесты — это то, чем вы тестируете приложение как единое целое. Они являются противоположностью юнит-тестов, которые тестируют части вашего приложения отдельно друг от друга.
Обычно интеграционные тесты предоставляют какие-либо данные вашему приложению (часто просто инструкции, например, «посетить эту страницу») и проверяют ответ приложения (например, «Я должен увидеть этот текст где-то на странице»), не заботясь о том, что и как происходит в приложении в процессе обработки данных и получения результата. Интеграционные тесты взаимодействуют с приложением, как с чёрным ящиком. Для них не важно, как и что происходит внутри, важен только результат.
Интеграционные тесты с пакетом 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')
->type('[email protected]', '#newsletter-email')
->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')
->submitForm('Log In', ['email' => '[email protected]', 'password' => 'secret'])
->see('Welcome!')
->onPage('dashboard');
}
Проверяем запись в базе данных при помощи seeInDatabase()
public function test_saves_newsletter_signups()
{
$this->visit('/newsletter-signup')
->type('[email protected]')
->press('Sign up')
->seeInDatabase('signups', ['email' => '[email protected]']);
}
Автоматическое тестирование при изменении файлов
Elixir может запускать ваши тесты каждый раз при редактировании файлов, достаточно прописать в gulpfile.js
: mix.phpUnit()
. Теперь просто запустите gulp tdd
, и тесты будут перезапускаться каждый раз при изменении файлов и отображать результат.
Заключение
Как вы видите, Integrated заложил основу для простых и мощных интеграционных тестов при наименьших усилиях со стороны разработчика. Для ясности: я писал интеграционные тесты раньше и никогда ещё они не были настолько просты для начинающих, как сейчас.
Продолжение следует…