кодесурса
«PHPUnit

Написание тестов для PHPUnit (провайдеры данных)

script1adsense2code
script1adsense3code

Вступление

В тестах PHPUnit методы могут принимать один или несколько произвольных аргументов. Эти аргументы

может быть предоставлен одним или несколькими методами, известными как методы поставщика данных. Используемый метод поставщика данных указывается с помощью аннотации @dataProvider .

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

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

В приведенном ниже примере показано, как метод поставщика данных возвращает массив массивов.

<?php
use PHPUnit\Framework\TestCase;
class DataTest extends TestCase
{
    /**
     * @dataProvider additionProvider
     */
    public function testAdd($a, $b, $expected)
    {
        $this->assertSame($expected, $a + $b);
    }
    public function additionProvider()
    {
        return [
            [0, 0, 0],
            [0, 1, 1],
            [1, 0, 1],
            [1, 1, 3]
        ];
    }
}
?>

Когда вышеупомянутый тест выполняется, результат, показанный ниже, произведен

$ phpunit DataTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 (1, 1, 3)
Failed asserting that 2 is identical to 3.
/home/sb/DataTest.php:9
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

Полученные результаты подтверждают, что три из четырех протестированных массивов не дали данных тестов.

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

В приведенном ниже примере показан поставщик данных с именованными наборами данных.

<?php
use PHPUnit\Framework\TestCase;
class DataTest extends TestCase
{
    /**
     * @dataProvider additionProvider
     */
    public function testAdd($a, $b, $expected)
    {
        $this->assertSame($expected, $a + $b);
    }
    public function additionProvider()
    {
        return [
            'adding zeros'  => [0, 0, 0],
            'zero plus one' => [0, 1, 1],
            'one plus zero' => [1, 0, 1],
            'one plus one'  => [1, 1, 3]
        ];
    }
}
?>

Приведенный выше тест PHPUnit, иллюстрирующий именованные наборы данных, дает следующие результаты при выполнении.

$ phpunit DataTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set "one plus one" (1, 1, 3)
Failed asserting that 2 is identical to 3.
/home/sb/DataTest.php:9
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

Исходя из вышеприведенного вывода, к неудачному набору данных прилагается имя, облегчающее программе идентификацию и исправление ошибки.

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

<?php
use PHPUnit\Framework\TestCase;
require 'CsvFileIterator.php';
class DataTest extends TestCase
{
    /**
     * @dataProvider additionProvider
     */
    public function testAdd($a, $b, $expected)
    {
        $this->assertSame($expected, $a + $b);
    }
    public function additionProvider()
    {
        return new CsvFileIterator.php('data.csv');
    }
}
   ?>

Приведенный выше поставщик даты, возвращающий объект итератора, выдает следующие результаты при тестировании.

$ phpunit DataTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 ('1', '1', '3')
Failed asserting that 2 is identical to 3.
/home/sb/DataTest.php:11
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

CsvFileIterator, который был необходим и протестирован выше, определен ниже:

<?php
use PHPUnit\Framework\TestCase;
class CsvFileIterator implements Iterator
{
    protected $file;
    protected $key = 0;
    protected $current;
    public function __construct($file)
    {
        $this->file = fopen($file, 'r');
    }
    public function __destruct()
    {
        fclose($this->file);
    }
    public function rewind()
    {
        rewind($this->file);
        $this->current = fgetcsv($this->file);
        $this->key = 0;
    }
    public function valid()
    {
        return !feof($this->file);
    }
    public function key()
    {
        return $this->key;
    }
    public function current()
    {
        return $this->current;
    }
    public function next()
    {
        $this->current = fgetcsv($this->file);
        $this->key++;
    }
}
?>

Всякий раз, когда тест принимает аргумент как из метода @dataProvider, так и из одного или нескольких тестов, от которых он @ зависит, аргументы от поставщиков данных будут предшествовать аргументам из зависимых тестов.

Аргументы из зависимых тестов также будут одинаковыми для каждого набора данных. Пример ниже иллюстрирует тест с @dataProvider и @depends.

<?php
use PHPUnit\Framework\TestCase;
class DependencyAndDataProviderComboTest extends TestCase
{
    public function provider()
    {
        return [['provider1'], ['provider2']];
    }
    public function testProducerFirst()
    {
        $this->assertTrue(true);
        return 'first';
    }
    public function testProducerSecond()
    {
        $this->assertTrue(true);
        return 'second';
    }
    /**
     * @depends testProducerFirst
     * @depends testProducerSecond
     * @dataProvider provider
     */
    public function testConsumer()
    {
        $this->assertSame(
            ['provider1', 'first', 'second'],
            func_get_args()
        );
    }
}
?>

Когда вышеупомянутый тест выполнен, результаты ниже получены.

$ phpunit --verbose DependencyAndDataProviderComboTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
...F
Time: 0 seconds, Memory: 3.50Mb
There was 1 failure:
1) DependencyAndDataProviderComboTest::testConsumer with data set #1 ('provider2')
Failed asserting that two arrays are identical.
--- Expected
+++ Actual
@@ @@
Array &0 (
-    0 => 'provider1'
+    0 => 'provider2'
     1 => 'first'
     2 => 'second'
)
/home/sb/DependencyAndDataProviderComboTest.php:32
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

Несколько поставщиков данных также могут использоваться в одном тесте, пример ниже иллюстрирует использование нескольких поставщиков данных в одном тесте.

<?php
use PHPUnit\Framework\TestCase;
class DataTest extends TestCase
{
    /**
     * @dataProvider additionWithNonNegativeNumbersProvider
     * @dataProvider additionWithNegativeNumbersProvider
     */
    public function testAdd($a, $b, $expected)
    {
        $this->assertSame($expected, $a + $b);
    }
    public function additionWithNonNegativeNumbersProvider()
    {
        return [
            [0, 1, 1],
            [1, 0, 1],
            [1, 1, 3]
        ];
    }
    public function additionWithNegativeNumbersProvider()
    {
        return [
            [-1, 1, 0],
            [-1, -1, -2],
            [1, -1, 0]
        ];
    }
 }
?>

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

$ phpunit DataTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
..F...                                          6 / 6 (100%)
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 (1, 1, 3)
Failed asserting that 2 is identical to 3.
/home/sb/DataTest.php:12
FAILURES!
Tests: 6, Assertions: 6, Failures: 1.

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

Стоит также отметить, что при выполнении все поставщики данных выполнялись до вызова статического метода setUpBeforeClass () и первого вызова метода setUp (). Из-за этого доступ к переменным, созданным в поставщике данных, невозможен. Это так, потому что это необходимо для того, чтобы PHPunit вычислял общее количество тестов.

Предыдущая: Установка модуля php
Далее: Написание тестов для phpunit (выходы)

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code