← Заметки и статьи о Laravel PHP

19 июня 2015 перевод

Интеграционное тестирование в Laravel 5.1: Мощные интеграционные тесты в несколько строк

Интеграционные тесты — это то, чем вы тестируете приложение как единое целое. Они являются противоположностью юнит-тестов, которые тестируют части вашего приложения отдельно друг от друга.

Обычно интеграционные тесты предоставляют какие-либо данные вашему приложению (часто просто инструкции, например, «посетить эту страницу») и проверяют ответ приложения (например, «Я должен увидеть этот текст где-то на странице»), не заботясь о том, что и как происходит в приложении в процессе обработки данных и получения результата. Интеграционные тесты взаимодействуют с приложением, как с чёрным ящиком. Для них не важно, как и что происходит внутри, важен только результат.

Интеграционные тесты с пакетом 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('me@me.com', '#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' => 'me@me.com', 'password' => 'secret'])
            ->see('Welcome!')
            ->onPage('dashboard');
}

Проверяем запись в базе данных при помощи seeInDatabase()

public function test_saves_newsletter_signups()
{
    $this->visit('/newsletter-signup')
            ->type('me@me.com')
            ->press('Sign up')
            ->seeInDatabase('signups', ['email' => 'me@me.com']);
}

Автоматическое тестирование при изменении файлов

Elixir может запускать ваши тесты каждый раз при редактировании файлов, достаточно прописать в gulpfile.js: mix.phpUnit(). Теперь просто запустите gulp tdd, и тесты будут перезапускаться каждый раз при изменении файлов и отображать результат.

Заключение

Как вы видите, Integrated заложил основу для простых и мощных интеграционных тестов при наименьших усилиях со стороны разработчика. Для ясности: я писал интеграционные тесты раньше и никогда ещё они не были настолько просты для начинающих, как сейчас.

Продолжение следует...

Источник: https://mattstauffer.co/blog/better-integration-testing-in-laravel-5.1-powerful-integration-tests-in-a-few-lines

Плюсануть
Поделиться
Отправить