Для того чтобы проводить модульное тестирование в 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). Это отличный способ подумать перед написанием кода и обеспечить качество вашего кода.
Пара утверждений, которые я люблю использовать, следующие:
- $this->assertEquals($expected, $actual);
- $this->assertTrue($argument);
- $this->assertInstanceOf(Object::class, $object);
- $this->assertSame($expected, $actual);
- $this->assertFalse($argument);
Надеюсь, это поможет!