Квест → Как хакнуть форму
Прошли: 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+.