Поставщик данных (Data Provider) в PHPUnit

Часто нужно выполнять один и тот же тест, но с разными данными. Для этих целей используется поставщик данных, задаваемый аннотацией @dataProvider. Её значение должно быть название публичного метода, возвращающего массив вариантов.

Приведём пример.
Код класса Calculator:

<?php
// src/ExampleProject/Calculator.php
namespace ExampleProject;

class Calculator
{
    /**
     * @param mixed $a
     * @param mixed $b
     * @return mixed
     */
    public function add($a, $b)
    {
        return $a + $b;
    }
}
            

 

Код теста:

<?php
// tests/ExampleProject/CalculatorTest.php
namespace Tests\ExampleProject;

use PHPUnit\Framework\TestCase;
use ExampleProject\Calculator;

class CalculatorTest extends TestCase
{
    /**
     * @param int $x
     * @param int $y
     * @param int $sum
     * @dataProvider addProvider
     */
    public function testAdd($x, $y, $sum)
    {
        $calculator = new Calculator();
        $this->assertEquals($sum, $calculator->add($x, $y));
    }

    /**
     * @return array
     */
    public function addProvider()
    {
        return [
            [-1, 1, 0],
            [0, 0, 0],
            [0, 1, 1],
            [2, 2, 4],
            [0, 1, 1],
            [-2, 3, 1],
            [-1, -1, -2],
        ];
    }
}
            

 

Запуск теста:

./vendor/phpunit/phpunit/phpunit tests/ExampleProject/CalculatorTest.php

 

Результат выполнения:

PHPUnit 6.5.7 by Sebastian Bergmann and contributors.

.......                                                             7 / 7 (100%)

Time: 1.85 seconds, Memory: 4.00MB

OK (7 tests, 7 assertions)
            

 

Метод addProvider возвращает массив вариантов. Каждый вариант - это массив аргументов, которые передаются в тестовые методы.

Все поставщики данных (dataProvider) выполняются перед вызовом статического метода setUpBeforeClass и первым вызовом метода setUp. Поэтому из поставщика данных вы не можете получить доступ к любым переменным, которые вы создаете в этих методах. Это необходимо для того, чтобы PHPUnit мог вычислить общее количество тестов.