Статьи

BDD с Behat

Среда PHP BDD Behat позволяет вам тестировать ваши PHP-приложения, используя удобочитаемые предложения, чтобы написать функции и сценарии того, как ваши приложения должны вести себя, чтобы проверить их функциональность. Затем мы можем запустить эти тесты, чтобы увидеть, работает ли наше приложение так, как ожидается. Давайте потратим около 15 минут, быстро пройдя процесс установки Behat, и узнаем, как мы можем протестировать поведение наших PHP-приложений, используя основы.


Чтобы начать тестирование с Behat, нам просто нужно установить его на нашу локальную машину для разработки. Я буду использовать Composer, но вы можете взглянуть на документацию для дополнительных методов установки.

В вашем приложении PHP (у меня есть phpbehat созданное пустое приложение PHP с именем phpbehat ) создайте файл composer.json со следующим кодом для загрузки в Behat:

В вашем терминале мы можем установить его с помощью следующей команды:

1
composer update

Теперь мы должны запустить команду bin/behat для работы с Behat.


Мы всегда начинаем с создания новой функции . Функция — это то, что мы можем использовать для описания функции нашего приложения, а затем реализовать ее для прохождения теста.

Функция, в самом простом виде, состоит из:

  • Удобочитаемый, простой текст.
  • Использует расширение .feature .
  • Содержит преимущества, роль и саму функцию.
  • Может содержать список сценариев.

Теперь я не могу показать вам, как протестировать все возможные функции приложения, так как это займет слишком много времени. Но я могу показать вам, как написать базовую функцию, и вы можете адаптировать этот код, чтобы он работал для вашего конкретного приложения.

Чтобы не усложнять процесс обучения, давайте создадим очень простой файл Phpadder.php который содержит несколько методов, которые мы можем использовать для сложения двух чисел и отображения их суммы.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
class Phpadder {
 
    private $a;
    private $b;
    public $sum;
 
    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }
 
    public function add() {
        $this->sum = $this->a + $this->b;
    }
 
    public function display() {
        return $this->sum;
    }
}

Это создает новый класс с именем Phpadder . У нас есть несколько свойств для хранения первого ( $a ) и второго ( $b ) чисел, которые будут добавлены, а также свойство $sum для хранения суммы значений.

Далее у нас есть конструктор, который инициализирует наши свойства. Затем у нас есть метод add для сложения двух чисел и, наконец, метод display для отображения суммы двух чисел.

Давайте теперь протестируем этот класс Phpadder . Создайте новый файл .feature вместе со следующим кодом:

1
2
3
4
5
# features/phpadder.feature
Feature: adder
    In order to display the sum of two numbers
    As anybody
    I need to provide two numbers

Мы начинаем с того, что присваиваем нашей функции имя adder . Затем мы указываем в трех строках преимущества, роль и, наконец, саму функцию. Это должно быть довольно понятно.

Теперь, когда у нас есть функция, давайте начнем писать наши сценарии.


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

Давайте создадим сценарий для тестирования нашего приложения Phpadder :

1
2
3
4
Scenario: Display the sum of two provided numbers
   Given I have the number 50 and the number 25
   When I add them together
   Then I should get 75

Мы начинаем с нашего описания сценария, затем перечисляем, что мы начинаем с двух чисел 50 и 25, и когда они складываются вместе, должна отображаться сумма 75.

Вы также можете иметь несколько контекстов, событий и результатов, используя следующие ключевые слова: And и But . Вот модифицированный пример предыдущего сценария, где мы будем использовать And :

1
2
3
4
5
Scenario: Display the sum of two provided numbers
   Given I have the number 50 and the number 25
   And I have a third number of 25
   When I add them together
   Then I should get 100

Шаг — это не что иное, как функция PHP, которая состоит из ключевого слова, регулярного выражения и функции обратного вызова. Каждое утверждение в вашем сценарии будет соответствовать шагу. Эти шаги определяют, что должно произойти, если одно из ваших утверждений вызывается в сценарии. Вы сохраняете все свои шаги в файле features/bootstrap/FeatureContext.php .

В нашем файле FeatureContext.php (вам может потребоваться создать его) нам нужно написать шаг для каждого из наших операторов, используя его имя в качестве имени функции. Начнем с выражения "Given I have the number" :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
# features/bootstrap/FeaturesContext.php
 
require(«Phpadder.php»);
 
use Behat\Behat\Context\BehatContext,
    Behat\Behat\Exception\PendingException;
 
use Behat\Gherkin\Node\PyStringNode,
    Behat\Gherkin\Node\TableNode;
     
class FeatureContext extends BehatContext {
 
    private $Adder;
     
    /**
     * @Given /^I have the number (\d+) and the number (\d+)$/
     */
    public function iHaveTheNumberAndTheNumber($a, $b) {
        $this->Adder = new Phpadder($a, $b);
    }

Сначала мы создаем новый файл PHP, который требуется в нашем файле Phpadder.php (файл, который мы тестируем), а затем мы сразу используем несколько классов Behat с операторами use .

Затем мы создаем наш класс FeatureContext и расширяем BehatContext класс BehatContext .

Наш класс имеет только одно свойство, $Adder , которое будет содержать объект Phpadder .

Наконец, мы создаем метод для нашего первого шага, используя то же имя, что и оператор. Наш шаг имеет регулярное выражение, найденное в комментарии метода. Это регулярное выражение используется для сопоставления шага с оператором сценария. В этом методе мы просто назначаем новый объект Phpadder нашему свойству $this->Adder чтобы остальные наши методы имели доступ к тому же объекту Phpadder .

Теперь вы, вероятно, заметили ключевое слово @Given в комментарии вашей функции, это на самом деле аннотация, так что можно идентифицировать различные типы шагов. Вы можете использовать @Given , @When и @Then .

Теперь нам просто нужно написать последние два шага.

1
2
3
4
5
6
/**
 * @When /^I add them together$/
 */
public function iAddThemTogether() {
    $this->Adder->add();
}

Этот шаг просто использует метод add нашего объекта $this->Adder для сложения двух чисел.

1
2
3
4
5
6
7
8
9
/**
 * @Then /^I should get (\d+)$/
 */
public function iShouldGet($sum) {
    if ($this->Adder->sum != $sum) {
        throw new Exception(«Actual sum: «.$this->Adder->sum);
    }
    $this->Adder->display();
}

Этот шаг начинается с проверки того, что фактическая сумма (полученная с помощью нашего объекта $this->Adder и его свойства sum ) не равна ожидаемой сумме. Если это оценивается как истинное, это означает, что нам нужно, чтобы Behat показал ошибку. Для этого мы просто сгенерируем новое исключение, отображающее фактическую сумму, чтобы мы могли сравнить. В противном случае мы вызываем наш метод display .

Время проводить тесты.


Теперь, когда у нас есть все возможности, сценарии и шаги, давайте запустим наши тесты с помощью следующей команды:

1
bin/behat

Вы должны увидеть следующие сообщения об успехе внутри вашего терминала:

тестирование-успех

Вы можете убедиться, что ваши тесты работают правильно, просто сломав что-то в файле Phpadder.php чтобы он не работал так, как ожидает ваш тест. Например, если мы изменим метод add вместо использования вычитания, например так:

1
2
3
public function add() {
    $this->sum = $this->a — $this->b;
}

И затем мы повторно bin/behat наши тесты: bin/behat . Вы можете видеть в нашем терминале, у нас теперь есть провальный тест, потому что он больше не добавляет наши числа, а вычитает их:

Тестирование обанкротиться

В заключение вы можете выполнить небольшой четырехэтапный процесс тестирования приложений PHP с помощью Behat:

  1. Определить функцию
  2. Определить сценарий
  3. Определить определения шагов
  4. Запустите тесты, используя bin/behat

Итак, имея такой небольшой объем кода, мы теперь должны иметь общее представление о том, как работать с Behat для тестирования наших PHP-приложений. Для получения дополнительной информации о работе с Behat, пожалуйста, ознакомьтесь с их документацией .