Курс — «Программирование на PHP8 для начинающих» — #28 Отладка и тестирование кода. Написание тестов с PHPUnit
Здравствуйте, дорогие друзья.
Тестирование кода — это важный этап разработки программного обеспечения, который помогает обеспечить его корректность и надежность. PHPUnit — это популярный фреймворк для написания и выполнения автоматизированных тестов на PHP. В этом разделе мы рассмотрим, как установить и использовать PHPUnit для написания тестов.
Установка PHPUnit
PHPUnit можно установить с помощью Composer, который является менеджером пакетов для PHP.
- Установите Composer, если он еще не установлен. Следуйте инструкциям на официальном сайте Composer.
- Создайте файл
composer.json
в корне вашего проекта и добавьте зависимость PHPUnit:
1 2 3 4 5 |
{ "require-dev": { "phpunit/phpunit": "^9" } } |
Установите PHPUnit, выполнив команду:
1 |
composer install |
Создание тестов
Тесты в PHPUnit пишутся в виде классов, которые наследуются от базового класса PHPUnit\Framework\TestCase
. Каждый метод теста должен начинаться с префикса test
.
Пример простого теста
Создадим простой класс Calculator
и напишем тесты для него.
1 2 3 4 5 6 7 8 9 10 11 12 |
// src/Calculator.php namespace App; class Calculator { public function add($a, $b) { return $a + $b; } public function subtract($a, $b) { return $a - $b; } } |
Теперь создадим тестовый класс для Calculator
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// tests/CalculatorTest.php use PHPUnit\Framework\TestCase; use App\Calculator; class CalculatorTest extends TestCase { private $calculator; protected function setUp(): void { $this->calculator = new Calculator(); } public function testAdd() { $this->assertEquals(4, $this->calculator->add(2, 2)); $this->assertEquals(6, $this->calculator->add(3, 3)); } public function testSubtract() { $this->assertEquals(1, $this->calculator->subtract(3, 2)); $this->assertEquals(0, $this->calculator->subtract(2, 2)); } } |
Запуск тестов
Для запуска тестов используйте команду vendor/bin/phpunit
.
1 |
vendor/bin/phpunit --bootstrap vendor/autoload.php tests |
Использование аннотаций
PHPUnit поддерживает аннотации для настройки тестов. Например, аннотация @dataProvider
позволяет задавать наборы данных для тестов.
Пример использования @dataProvider
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 |
// tests/CalculatorTest.php use PHPUnit\Framework\TestCase; use App\Calculator; class CalculatorTest extends TestCase { private $calculator; protected function setUp(): void { $this->calculator = new Calculator(); } /** * @dataProvider additionProvider */ public function testAdd($a, $b, $expected) { $this->assertEquals($expected, $this->calculator->add($a, $b)); } public function additionProvider() { return [ [0, 0, 0], [1, 2, 3], [2, 3, 5], [-1, -1, -2] ]; } } |
Использование моков
Моки (mocks) позволяют создавать объекты-заменители для тестирования взаимодействия между объектами. PHPUnit предоставляет мощные инструменты для создания моков.
Пример использования моков
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// src/UserService.php namespace App; class UserService { private $userRepository; public function __construct($userRepository) { $this->userRepository = $userRepository; } public function getUserName($userId) { $user = $this->userRepository->find($userId); return $user ? $user->getName() : 'Guest'; } } |
Теперь создадим тест с использованием мока для UserRepository
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// tests/UserServiceTest.php use PHPUnit\Framework\TestCase; use App\UserService; class UserServiceTest extends TestCase { public function testGetUserName() { $userRepository = $this->createMock('App\UserRepository'); $userRepository->method('find') ->willReturn(new class { public function getName() { return 'John Doe'; } }); $userService = new UserService($userRepository); $this->assertEquals('John Doe', $userService->getUserName(1)); } } |
PHPUnit — это мощный инструмент для написания и выполнения автоматизированных тестов на PHP. Он поддерживает различные типы тестов, включая юнит-тесты, интеграционные тесты и функциональные тесты. Использование PHPUnit помогает обеспечить корректность и надежность кода, а также упрощает процесс отладки и тестирования. В следующих разделах мы рассмотрим другие методы тестирования кода и лучшие практики для написания тестов.

На этом все. Всем хорошего дня!
Цикл статей по курсу — «Программирование на PHP8 для начинающих».