2 подводных камня и PHPUnit
С недавних пор решил встать на путь истинный и пока я еще совсем новичок в юнит-тестировании. Сегодня споткнулся на некоторых очень неприятных вещах. Использовал PHP 5.3.2 + PHPUnit 3.4.14 + Zend Framework 1.10.5
- Оказалось, что нельзя в классе, унаследованном от
PHPUnit_Framework_TestCase
, то есть в тест кейсе использовать свойства класса. Я пытался делать так: в одном методе-тесте в свойство записываю, в другом методе-тесте считываю. Это не работает. Свойство во втором тесте было пустым. - Этот подводный камень очень близок к первому. Аннотация
@dataProvider provider
является поставщиком данных для тестового метода, но эти данные генерируются в момент создания объекта классаPHPUnit_Framework_TestCase
, а не непосредственно перед запуском теста. То есть, опять же, если вы в провайдере используете свойства класса, которые заполняются во время прохождения тестов, то provider вернет пустое значение. Если быть точнее, он вернет значение таким, какое оно было на начало создания объекта класса. - И еще один камень. Zend Studio генерирует тест кейсы и тесты, основываясь на существующих методах классов, что несомненно удобно. Но есть одна проблема: она также генерирует пустой конструктор, который является виной бага [#ZF-4496]. Суть бага в следующем. Если вы используете аннотацию
@dataProvider
в классе с конструктором, вы будете получать сообщение об ошибке тестов примерно следующего содержанияMissing argument 1 for FooTest::testProvider()
. Эта ошибка проявляется, если у класса, унаследованного отPHPUnit_Framework_TestCase
существует конструктор. Конечно же от нее можно спастись, удалив ненужный конструктор.
Из первых двух “находок” можно сделать вывод: data provider методы могут быть спокойно описаны как static
.
P.S. Ушел продолжать учить матчасть.