PHP Profi

PHPUnit для начинающих. Часть 2: Data Provider. Перевод Серия 

php unit test PHPUnit

Это вторая часть серии "PHPUnit для начинающих". В этом руководстве мы объясним когда и как использовать data provider-ов в наших тестах.

 

Когда нужно использовать data provider

Когда мы пишем какую-то функцию, мы хотим быть уверенными, что она правильно отрабатывает на наборе крайних случаев. То же самое относится и к тестам. Это означает, что нам нужно написать множество разных тестов для одной и той же функции, используя разные наборы входных данных. Представим, что мы хотим протестировать класс Calculator с различными данными. Без data provider-а мы должны были бы описать несколько тестов примерно вот так:

require 'Calculator.php';

class CalculatorTests extends PHPUnit_Framework_TestCase
{
        private $calculator;

        protected function setUp()
        {
            $this->calculator = new Calculator();
        }

        protected function tearDown()
        {
            $this->calculator = NULL;
        }

        public function testAdd()
        {
            $result = $this->calculator->add(1, 2);
            $this->assertEquals(3, $result);
        }

        public function testAddWithZero()
        {
            $result = $this->calculator->add(0, 0);
            $this->assertEquals(0, $result);
        }

        public function testAddWithNegative()
        {
            $result = $this->calculator->add(-1, -1);
            $this->assertEquals(-2, $result);
        }
 }

В таких случаях вместо нескольких однотипных тестов, мы можем использовать функционал data provider-а из PHPUnit, чтобы избежать дублирования.

Как использовать data provider

Метод, являющийся data provider-ом, должен возвращать массив массивов или объект, реализующий интерфейс Iterator. Метод, являющийся тестом, будет вызван несколько раз - с каждым массивом и в качестве аргументов будет передано содержимое массива.

Некоторые ключевые моменты при использовании data provider-а:

  • Метод data provider-а должен быть публичным (public).
  • Метод data provider-а должен возвращать массив собранных данных.
  • Метод теста должен использовать аннотацию @dataProvider чтобы указать какой метод использовать в качестве data provider-а.

Теперь, когда мы знаем ключевые моменты, использовать data provider становится довольно просто. Для начала мы создадим новый публичный метод, который будет возвращать массив, содержащий массивы с аргументами для метода теста. Далее, мы добавим аннотацию к методу теста, чтобы сообщить PHPUnit-у, какой метод будет предоставлять аргументы.

Добавим data provider в наш unit-тест

Давайте изменим наши тесты, написанные выше, чтобы они использовали data provider:

require 'Calculator.php';

class CalculatorTests extends PHPUnit_Framework_TestCase
{
    private $calculator;

    protected function setUp()
    {
        $this->calculator = new Calculator();
    }

    protected function tearDown()
    {
        $this->calculator = NULL;
    }

    public function addDataProvider() {
        return array(
            array(1,2,3),
            array(0,0,0),
            array(-1,-1,-2),
        );
    }

    /**
     * @dataProvider addDataProvider
     */
    public function testAdd($a, $b, $expected)
    {
        $result = $this->calculator->add($a, $b);
        $this->assertEquals($expected, $result);
    }
}

Итак:

  • Line 18: добавляем метод data provider-а. Учтите, что этот метод должен быть объявлен как публичный (public).
  • Line 27: используем аннотацию @dataProvider, чтобы указать, что в качестве data provider-а нужно вызвать метод addDataProvider.

Теперь запустим наши тесты ещё раз. И они все должны пройти. Как вы видите, мы воспользовались data provider-ом, чтобы избежать дублирования кода. Вместо того чтобы писать три разных метода, в сущности являющихся одним и тем же, теперь мы имеем только один метод теста.

Заключение

Мы завершили вторую часть руководство из серии "PHPUnit для начинающих".

В следующей статье мы расскажем как использовать "двойников" в наших тестах.

И надеемся, это небольшое руководство поможет вам в вашей разработке.

Если вам нравится эта серия и вы не хотите пропустить следующие статьи, подписывайтесь на наши группы в Twitter, Facebook, ВКонтакте, Google+.

2015-10-12 alek13 оригинал
General Food

Комментарии

авторизуйтесь, чтобы оставить комментарий