Начнем с термина «модульное тестирование».

Что такое модульное тестирование?

Википедия говорит:

В компьютерном программировании модульное тестирование - это метод тестирования программного обеспечения, с помощью которого тестируются отдельные единицы исходного кода, наборы из одного или нескольких компьютерных программных модулей вместе со связанными контрольными данными, процедурами использования и рабочими процедурами, чтобы определить, подходят ли они для использования. .

Это может показаться немного запутанным. Проще говоря, модульное тестирование - это процесс написания тестов для отдельных частей программы. Таким образом, модульные тесты - это тесты, написанные разработчиками программного обеспечения, чтобы убедиться, что определенные разделы программы (известные как «модуль») работают так, как задумано.

Слово «единица» может иметь разные значения в разных типах программирования:

  1. В процедурном программировании единицей часто является отдельная функция или процедура.
  2. В объектно-ориентированном программировании единицей может быть класс, а некоторые рассматривают ее как метод.

Прежде чем писать какой-либо тест для своего приложения, вы можете спросить: «Помогает ли написание модульного теста моему приложению?», И я должен ответить ДА, это так выгодно.

Преимущества

  • Проблемы могут быть обнаружены на ранних этапах цикла разработки
  • Можно выявить такие проблемы, как ошибки, недостатки или недостающие части устройства.
  • Написание теста заставляет разработчика думать о входах, выходах и условиях ошибки, и поэтому он / она может написать лучший код.
  • Выявление ошибок до или во время разработки приложения намного меньше, чем ошибок, обнаруженных после выпуска.
  • Плохо написанные модули сделают процесс модульного тестирования сложным, если не невозможным, поэтому написание модульных тестов заставит разработчиков лучше структурировать свой код.
  • После изменения частей нашего кода в большом проекте модульное тестирование позволяет легко отследить точное местоположение ошибок или сбоев.

Недостатки

  • Эти модульные тесты не обнаруживают каждую ошибку или ошибку в программе, потому что модульное тестирование проверяет только функциональность отдельной части программы («модуль»).
  • Написание тестов занимает много времени
  • Некоторые проблемы невозможно протестировать

Как мы можем писать модульные тесты на 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 для автозагрузки

  1. Откройте файл Composer.json и добавьте часть автозагрузки следующим образом:

APP\\ означает, что пространство имен, которое мы будем использовать, будет App, а app будет использовать appdirectory для автозагрузки файлов.

2. Далее вы должны запустить эту команду:

composer update

С помощью этой команды будет реализована конфигурация вашего файла composer.json.

4. Начните писать свой первый тест.

Во-первых, необходимо соблюдать некоторые правила:

  • Тестовый класс должен называться, например, <prefix>Test, например MyFirstTest.
  • Имя файла тестового класса должно совпадать с именем класса
  • Каждый класс должен происходить от класса \PHPUnit\Framework\TestCase
  • В тестовом классе должен быть хотя бы один метод (утверждение).
  • Название метода тестирования должно начинаться со слова testlike ‘testMyFunction’.
  1. Создайте две папки и назовите их app и некоторые правила musttests

Теперь ваш корневой каталог должен быть таким, как на картинке выше.

2. Теперь запустите эту команду в командной строке: ./vendor/bin/phpunit

Таким образом, вы должны получить сообщение: «Тесты не выполняются!»

3. Перейдите в папку tests и создайте файл с именем CalculatorTest.php некоторые правила должны быть (как вы видите, имя файла заканчивается на «Test») и снова запустите PHPUnit: ./vendor/bin/phpunit

Как видите, у нас есть предупреждение, потому что у нас нет метода в классе CalculatorTestclass.

Мы собираемся написать тест перед написанием его фактического метода, который может быть хорошей практикой, известной как 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 из calculatorobject и передаем массив чисел.

В последней строке нашего кода мы вызвали метод 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

Этот метод получает массив чисел и добавляет их к operandsproperty в классе

  • 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

  1. Откройте файл CalculatorTest.php и отредактируйте предыдущую версию:

Мы изменили несколько элементов в нашем коде:

  • Мы импортировали App\Calculator

При этом нам не нужно будет писать new App\Calculator, вместо этого мы будем писать new Calculator

  • У нас есть частная собственность в нашем классе под названием $calculator.
  • Мы создали метод под названием setUp

Этот метод выполняется перед каждым методом тестирования.

Спасибо, что прочитали эту статью. Надеюсь, это поможет вам разобраться в модульном тестировании в PHP.