Unit-тесты
Написание unit-тестов в PHP обычно выполняется с использованием фреймворка PHPUnit. PHPUnit — это популярный инструмент для тестирования PHP-кода, который позволяет писать и запускать unit-тесты для проверки корректности работы отдельных компонентов (юнитов) вашего кода.
Установка PHPUnit
Для начала установите PHPUnit с помощью Composer:
composer require --dev phpunit/phpunit
После установки PHPUnit будет доступен в директории vendor/bin/phpunit
.
Создание тестового класса
Предположим, у вас есть класс Calculator
, который вы хотите протестировать:
// src/Calculator.php
class Calculator
{
public function add($a, $b)
{
return $a + $b;
}
public function subtract($a, $b)
{
return $a - $b;
}
}
Теперь создадим тестовый класс для этого класса:
// tests/CalculatorTest.php
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
public function testAdd()
{
$calculator = new Calculator();
$result = $calculator->add(2, 3);
$this->assertEquals(5, $result);
}
public function testSubtract()
{
$calculator = new Calculator();
$result = $calculator->subtract(5, 3);
$this->assertEquals(2, $result);
}
}
Запуск тестов
Чтобы запустить тесты, выполните следующую команду в терминале:
vendor/bin/phpunit tests/CalculatorTest.php
Основные методы PHPUnit
assertEquals($expected, $actual)
— проверяет, что два значения равны.assertTrue($condition)
— проверяет, что условие истинно.assertFalse($condition)
— проверяет, что условие ложно.assertNull($value)
— проверяет, что значение равноnull
.assertNotNull($value)
— проверяет, что значение не равноnull
.assertSame($expected, $actual)
— проверяет, что два значения идентичны (включая тип).assertNotSame($expected, $actual)
— проверяет, что два значения не идентичны.assertCount($expectedCount, $array)
— проверяет, что массив содержит определенное количество элементов.assertContains($needle, $haystack)
— проверяет, что значение содержится в массиве.assertInstanceOf($expected, $actual)
— проверяет, что объект является экземпляром определенного класса.
Пример с использованием моков
Иногда вам нужно протестировать код, который зависит от других классов или сервисов. В этом случае можно использовать моки (mock-объекты):
use PHPUnit\Framework\TestCase;
class UserServiceTest extends TestCase
{
public function testGetUser()
{
// Создаем мок-объект для класса UserRepository
$userRepository = $this->createMock(UserRepository::class);
// Настраиваем мок-объект
$userRepository->method('find')->willReturn(new User(1, 'John Doe'));
// Создаем экземпляр UserService, передавая мок-объект
$userService = new UserService($userRepository);
// Выполняем тестируемый метод
$user = $userService->getUser(1);
// Проверяем результат
$this->assertEquals('John Doe', $user->getName());
}
}
Группировка тестов
Вы можете группировать тесты с помощью аннотаций:
/**
* @group database
*/
class DatabaseTest extends TestCase
{
public function testConnection()
{
// Тест для проверки подключения к базе данных
}
}
Затем можно запускать только тесты из определенной группы:
vendor/bin/phpunit --group database
Заключение
Unit-тесты — это важная часть разработки, которая помогает убедиться, что ваш код работает корректно и продолжает работать после внесения изменений. PHPUnit предоставляет мощные инструменты для написания и запуска тестов, а также для создания мок-объектов и группировки тестов.