Начнем с термина «модульное тестирование».
Что такое модульное тестирование?
Википедия говорит:
В компьютерном программировании модульное тестирование - это метод тестирования программного обеспечения, с помощью которого тестируются отдельные единицы исходного кода, наборы из одного или нескольких компьютерных программных модулей вместе со связанными контрольными данными, процедурами использования и рабочими процедурами, чтобы определить, подходят ли они для использования. .
Это может показаться немного запутанным. Проще говоря, модульное тестирование - это процесс написания тестов для отдельных частей программы. Таким образом, модульные тесты - это тесты, написанные разработчиками программного обеспечения, чтобы убедиться, что определенные разделы программы (известные как «модуль») работают так, как задумано.
Слово «единица» может иметь разные значения в разных типах программирования:
- В процедурном программировании единицей часто является отдельная функция или процедура.
- В объектно-ориентированном программировании единицей может быть класс, а некоторые рассматривают ее как метод.
Прежде чем писать какой-либо тест для своего приложения, вы можете спросить: «Помогает ли написание модульного теста моему приложению?», И я должен ответить ДА, это так выгодно.
Преимущества
- Проблемы могут быть обнаружены на ранних этапах цикла разработки
- Можно выявить такие проблемы, как ошибки, недостатки или недостающие части устройства.
- Написание теста заставляет разработчика думать о входах, выходах и условиях ошибки, и поэтому он / она может написать лучший код.
- Выявление ошибок до или во время разработки приложения намного меньше, чем ошибок, обнаруженных после выпуска.
- Плохо написанные модули сделают процесс модульного тестирования сложным, если не невозможным, поэтому написание модульных тестов заставит разработчиков лучше структурировать свой код.
- После изменения частей нашего кода в большом проекте модульное тестирование позволяет легко отследить точное местоположение ошибок или сбоев.
Недостатки
- Эти модульные тесты не обнаруживают каждую ошибку или ошибку в программе, потому что модульное тестирование проверяет только функциональность отдельной части программы («модуль»).
- Написание тестов занимает много времени
- Некоторые проблемы невозможно протестировать
Как мы можем писать модульные тесты на PHP?
Есть несколько способов написания модульных тестов, но чаще всего используется PHPUnit.
Что такое PHPUnit?
В общем, PHPUnit - это среда модульного тестирования для языка PHP. Основная идея этого фреймворка заключается в том, что каждый разработчик должен уметь находить ошибки, не позволяющие ему становиться все больше и больше.
Как мы можем использовать PHPUnit?
1. Установка PHPUnit с Composer
Мы можем легко добавить PHPUnit в наш проект с помощью Composer:
composer require --dev phpunit/phpunit ^8
Чтобы убедиться, что в нашем проекте есть PHPUnit, мы можем использовать эту команду (Вы должны запустить эту команду в корневом каталоге вашего проекта):
./vendor/bin/phpunit --version
2. Добавление файла конфигурации XML.
Существует множество параметров командной строки для выполнения теста с настраиваемыми функциями, но если вы хотите настроить множество вариантов поведения по умолчанию, может оказаться полезным добавление файла конфигурации XML.
Для этого добавьте XML-файл с именем phpunit.xml в корневой каталог проекта. Затем мы должны добавить соответствующие теги XML для настройки тестов.
Это простой файл конфигурации phpunit.xml, указывающий на то, что:
colors=“true”
PHPUnit будет распечатывать выходные данные разными цветами, например красным при ошибках, зеленым при успехе и т. Д.stopOnFailure=“false”
Это не остановится, если возникнет ошибка или ошибка. (Это означает, что каждый тест будет выполняться независимо от их результата)bootstrap=”vendor/autoload.php”
Это гарантирует, что исходный код и пакеты, которые были установлены с помощью Composer, будут загружены автоматически перед выполнением любого теста.name=”Calculator”
Это дает нашим тестам имя<directory>tests</directory>
Он указывает расположение тестовых файлов (в нашем случае это папка tests).
3. Использование PSR-4 для автозагрузки
- Откройте файл Composer.json и добавьте часть автозагрузки следующим образом:
APP\\
означает, что пространство имен, которое мы будем использовать, будет App
, а app
будет использовать app
directory для автозагрузки файлов.
2. Далее вы должны запустить эту команду:
composer update
С помощью этой команды будет реализована конфигурация вашего файла composer.json.
4. Начните писать свой первый тест.
Во-первых, необходимо соблюдать некоторые правила:
- Тестовый класс должен называться, например,
<prefix>Test
, напримерMyFirstTest
. - Имя файла тестового класса должно совпадать с именем класса
- Каждый класс должен происходить от класса
\PHPUnit\Framework\TestCase
- В тестовом классе должен быть хотя бы один метод (утверждение).
- Название метода тестирования должно начинаться со слова
test
like‘testMyFunction’
.
- Создайте две папки и назовите их
app
и некоторые правила musttests
Теперь ваш корневой каталог должен быть таким, как на картинке выше.
2. Теперь запустите эту команду в командной строке: ./vendor/bin/phpunit
Таким образом, вы должны получить сообщение: «Тесты не выполняются!»
3. Перейдите в папку tests
и создайте файл с именем CalculatorTest.php
некоторые правила должны быть (как вы видите, имя файла заканчивается на «Test») и снова запустите PHPUnit: ./vendor/bin/phpunit
Как видите, у нас есть предупреждение, потому что у нас нет метода в классе CalculatorTest
class.
Мы собираемся написать тест перед написанием его фактического метода, который может быть хорошей практикой, известной как TDD (разработка через тестирование).
Как правило, в этой методологии (TDD) разработчики пишут тесты перед написанием кода, что улучшает качество кода.
4. Мы собираемся написать метод, который получает массив чисел, суммирует их все вместе и возвращает окончательное значение. Итак, приступим к написанию его теста.
Откройте файл CalculatorTest.php
и добавьте в него этот фрагмент кода:
<?php class CalculatorTest extends \PHPUnit\Framework\TestCase { public function testAdd() { $calculator = new App\Calculator; $calculator->setOperands([5,20]); $this->assertEquals(25, $calculator->add()); } }
Прежде всего, мы создаем общедоступный метод с именем testAdd
, после этого мы создадим экземпляр класса App\Calculator
(который еще не существует). Затем мы вызываем setOperands()
method из calculator
object и передаем массив чисел.
В последней строке нашего кода мы вызвали метод assertEquals
, который является одним из встроенных методов PHPUnit. Он принимает два аргумента и проверяет, равны ли они.
Наконец, мы запускаем PHPUnit, чтобы проверить, работает ли он: ./vendor/bin/phpunit
Ой! У нас ошибка:
Error: Class 'App\Calculator' not found
Что ж, это правильно, потому что мы еще не создали класс Calculator! 😉
5. Перейдите в папку app
и создайте файл Calculator.php
.
6. Откройте Calculator.php
и добавьте в него этот фрагмент кода:
<?php namespace App; class Calculator { private $operands; public function setOperands(array $operands) { $this->operands = $operands; } public function add() { return array_sum($this->operands); } }
В приведенном выше коде у нас есть два метода:
setOperands
Этот метод получает массив чисел и добавляет их к operands
property в классе
add
Этот метод используется для получения свойства операндов и суммирования чисел в нем, и, наконец, он возвращает значение.
В конце концов, мы запускаем PHPUnit, чтобы проверить, работает ли он: ./vendor/bin/phpunit
Да-да! Это сработало.
Вы можете спросить себя: «Что было $this->assertEquals()
?». Как мы упоминали ранее, это встроенный метод фреймворка PHPUnit. Но я здесь, чтобы сказать, что это не единственная встроенная функция этого фреймворка. Вот некоторые из них:
assertEqual() assertNull() assertTrue() assertNan() assertLessThanOrEqual() assertClassHasAttribute() assertContains() assertIsWritable()
Каждый метод assert принимает необязательный аргумент, который позволяет передать настраиваемое сообщение об ошибке:
$this->assertTrue(false, “My custom failure message”);
Рефакторинг файла CalculatorTest.php
- Откройте файл
CalculatorTest.php
и отредактируйте предыдущую версию:
Мы изменили несколько элементов в нашем коде:
- Мы импортировали
App\Calculator
При этом нам не нужно будет писать new App\Calculator
, вместо этого мы будем писать new Calculator
- У нас есть частная собственность в нашем классе под названием
$calculator
. - Мы создали метод под названием
setUp
Этот метод выполняется перед каждым методом тестирования.
Спасибо, что прочитали эту статью. Надеюсь, это поможет вам разобраться в модульном тестировании в PHP.