Тесты

Из всех доступных видов тестов, данные лучшие практики фокусируются исключительно на модульных и функциональных тестах. Модульное тестирование позволяет вам тестировать ввод и вывод конкретных функций. Функциональное тестирование позволяет вам командовать "браузеру", где вы загружаете страницы на вашем сайте, переходите по ссылкам, заполняете формы и убеждаетесь, что вы видите на странице определённые вещи.

Модульные тесты

Модульные тесты используются для тестирования вашей "бизнес-логики", которая должна жить в классах, независимых от Symfony. По этой причине, Symfony на самом деле не имеет мнения о том, какие инструменты использовать для модульного тестирования. Однако, наиболее популярными являются PHPUnit и PHPSpec.

Функциональные тесты

Создание очень хороших функциональных тестов может быть сложным, поэтому некоторые разработчики полностью их пропускают. Не пропускайте функциональные тесты! Определив некоторые простые функциональные тесты, вы можете быстро найти любые большие ошибки перед их развёртыванием:

Best Practice

Определите функциональный тест, который хотя бы проверяет, успешно ли загружаются страницы вашего приложения.

Функциональный тест может быть настолько простым:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// tests/ApplicationAvailabilityFunctionalTest.php
namespace App\Tests;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ApplicationAvailabilityFunctionalTest extends WebTestCase
{
    /**
     * @dataProvider urlProvider
     */
    public function testPageIsSuccessful($url)
    {
        $client = self::createClient();
        $client->request('GET', $url);

        $this->assertTrue($client->getResponse()->isSuccessful());
    }

    public function urlProvider()
    {
        yield ['/'];
        yield ['/posts'];
        yield ['/post/fixture-post-1'];
        yield ['/blog/category/fixture-category'];
        yield ['/archives'];
        // ...
    }
}

Этот код проверяет, чтобы все заданные URL загружались успешно, что означает, что статус-код их HTTP-ответа будет между 200 и 299. Это может выглядеть не очень полезным, но учитывая, как мало усилий это потребовало, его стоит иметь в вашем приложении.

В компьютерном ПО такой вид теста называется дымовым тестированием и состоит из "предварительного тестирования для обнаружения простых ошибок, достаточно тяжелых для того, чтобы отказаться от релиза ПО".

Жёстко закодированные URL в функциональном тесте

Некоторые из вас могут задаваться вопросом, почему предыдущий функциональный тест не использвует сервис генерирования URL:

Best Practice

Жёстко кодируйте URL, используемые в функциональных тестах вместо использовани URL-генератора.

Рассмотрите следующий функциональный тест, который использует сервис router, чтобы сгенерировать URL тестируемой страницы:

1
2
3
4
5
6
7
8
public function testBlogArchives()
{
    $client = self::createClient();
    $url = $client->getContainer()->get('router')->generate('blog_archives');
    $client->request('GET', $url);

    // ...
}

Это будет работать, но имеет один огромный недостаток. Если разработчик случайно изменить путь маршрута blog_archives, тест всё равно будет пройден, но оригинальный (старый) URL не будет работать! Это означает, что все закладки для этого URL будут поломаны и вы потеряете рейтинг страницы в поисковой системе.

Тестирование функциональности JavaScript

Встроенный клиент функционального тестирования прекрасен, но он не может быть использован для тестирования JavaScript поведения на ваших страницах. Если вам нужно протестировать это, рассмотрите использование библиотеки Mink изнутри PHPUnit.

Конечно, если у вас тяжелый JavaScript фронт-энд, то вам стоит подумать об использовании чистых инструментов тестирования, основанных на JavaScript.

Узнайте больше о функциональных тестах

Рассмотрите использование HautelookAliceBundle для генерирования реально выглядящих данных для ваших фиксаторов теста, используя Faker и Alice.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.