Квест → Как хакнуть форму
Прошли: 77
Это вторая часть серии "PHPUnit для начинающих". В этом руководстве мы объясним когда и как использовать 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-ом, должен возвращать массив массивов или объект, реализующий интерфейс Iterator. Метод, являющийся тестом, будет вызван несколько раз - с каждым массивом и в качестве аргументов будет передано содержимое массива.
Некоторые ключевые моменты при использовании data provider-а:
public).@dataProvider чтобы указать какой метод использовать в качестве data provider-а.Теперь, когда мы знаем ключевые моменты, использовать data provider становится довольно просто. Для начала мы создадим новый публичный метод, который будет возвращать массив, содержащий массивы с аргументами для метода теста. Далее, мы добавим аннотацию к методу теста, чтобы сообщить PHPUnit-у, какой метод будет предоставлять аргументы.
Давайте изменим наши тесты, написанные выше, чтобы они использовали 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);
}
}
Итак:
@dataProvider, чтобы указать, что в качестве data provider-а нужно вызвать метод addDataProvider.Теперь запустим наши тесты ещё раз. И они все должны пройти. Как вы видите, мы воспользовались data provider-ом, чтобы избежать дублирования кода. Вместо того чтобы писать три разных метода, в сущности являющихся одним и тем же, теперь мы имеем только один метод теста.
Мы завершили вторую часть руководство из серии "PHPUnit для начинающих".
В следующей статье мы расскажем как использовать "двойников" в наших тестах.
И надеемся, это небольшое руководство поможет вам в вашей разработке.
Если вам нравится эта серия и вы не хотите пропустить следующие статьи, подписывайтесь на наши группы в Twitter, Facebook, ВКонтакте, Google+.