Юнит-тестирование в Symfony

Для того чтобы проводить модульное тестирование в Symfony, нам необходимо сначала установить тест-пак symfony:

$ composer require --dev symfony/test-pack
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Проверьте успешность установки, запустив PHPUnit:

$ php bin/phpunit
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы запускаете свой проект в контейнере docker, убедитесь, что вы запустили эту команду в контейнере.

$ docker exec -it [enter_container_name] php bin/phpunit
Войти в полноэкранный режим Выйти из полноэкранного режима

Если все прошло хорошо, вы должны получить сообщение «No tests executed!».

Напишите свой первый тест

Создайте свой первый тест «FirstTest.php» и поместите его в каталог «tests» в корне вашего проекта:

<?php

namespace ApiTests;

use PHPUnitFrameworkTestCase;

class FirstTest extends TestCase
{
    public function testEquals() {
        $actual = 1;
        $expected = 1;

        $this->assertEquals($expected, $actual);
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Как вы можете видеть, этот класс расширяется от TestCase, который необходим для инициирования теста PHPUnit. В этом тесте мы проверяем, равны ли $actual и $expected.

Теперь попробуйте запустить этот тест и посмотреть, что произойдет:

$ php bin/phpunit
Войти в полноэкранный режим Выйти из полноэкранного режима

В результате должно получиться что-то вроде «OK (1 тест, 1 утверждение)».

Поздравляем! Вы только что написали свой самый первый тест PHPUnit.

Что тестировать?

Это здорово, но как я могу применить это в своем коде? Отличный вопрос, давайте проверим это.

Во-первых, мы создадим контроллер, чтобы мы могли протестировать результат работы нашего метода:

<?php

namespace ApiController;

class Calculator
{
    public function add ($a, $b) {
        return $a + $b;
    }
}
Войти в полноэкранный режим Выход из полноэкранного режима

В CamelCase для теста существует соглашение об именовании «контроллер + тест». Поэтому наш тест будет CalculatorTest. Сам метод существует в виде «тест + метод». Например:

<?php

namespace ApiTests;

use ApiControllerCalculator;
use PHPUnitFrameworkTestCase;

class CalculatorTest extends TestCase
{
    public function testAdd() {
        $calculator = new Calculator();
        $actual = $calculator->add(1,2);

        $expected = 3;

        $this->assertEquals($expected, $actual);
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Как вы можете видеть, мы инициировали объект Calculator и добавили числа 1 и 2 в качестве $фактического результата. Ожидаемый результат — 3. Если мы запустим этот тест $ php bin/phpunit, то увидим, что наш тест прошел успешно «OK (1 тест, 1 утверждение)».

Зачем тестировать

Допустим, через пару месяцев ваш коллега по какой-то причине решил изменить ваш метод. Он или она изменили его так, чтобы он всегда добавлял +10:

<?php

namespace ApiController;

class Calculator
{
    public function add ($a) {
        return $a + 10;
    }
}
Войти в полноэкранный режим Выход из полноэкранного режима

Если теперь мы снова запустим наш тест $ php bin/phpunit, мы получим именно то, что хотим. Ошибка:

«FAILURES! Тесты: 1, Assertions: 1, Failures: 1.».

Таким образом, наш коллега знает, что он изменил что-то, что не следовало изменять, или ему нужно рефакторить наш тест и, возможно, больше кода в другом месте.

Бонус

Если вы пишете тесты до написания самого кода, это будет отличной практикой Test Driven Development (TDD). Это отличный способ подумать перед написанием кода и обеспечить качество вашего кода.

Пара утверждений, которые я люблю использовать, следующие:

  1. $this->assertEquals($expected, $actual);
  2. $this->assertTrue($argument);
  3. $this->assertInstanceOf(Object::class, $object);
  4. $this->assertSame($expected, $actual);
  5. $this->assertFalse($argument);

Надеюсь, это поможет!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *