С недавних пор решил встать на путь истинный и пока я еще совсем новичок в юнит-тестировании. Сегодня споткнулся на некоторых очень неприятных вещах. Использовал 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. Ушел продолжать учить матчасть.