Вместе с внедрением тестирования, пытаюсь при необходимости покрывать тестами более старые участки кода. В качестве framework был выбран PHPUnit за интеграцию с Zend Studio + некоторые приятные вещи.
В процессе написания тестов возникла необходимость в инструменте для работы с fixtures + тестирования изменений в базе данных, DBUnit как extension к PHPUnit подошел замечательно.
Далее грустная история о нескольких часах дебага. И об ошибке "Class PHPUnit_Extensions_Database_TestCase could not be found"
1. Изначально был тест XXX_Test
require_once 'PHPUnit/Framework/TestCase.php';
class XXX_Test extends PHPUnit_Framework_TestCase
{
public function testSmth()
{
$this->assertTrue(true);
}
}
Файл назван xxxTest.php
За некоторое время работы с phpunit я отвык пользоваться формой запуска
$phpunit TestClassName path/to/test/file.php
И пишу просто
$phpunit path/xxxTest.php
PHPUnit 3.3.10 by Sebastian Bergmann.
..
Time: 0 seconds
OK (1 test, 1 assertion)
Т.е. все хорошо, мой класс несколько шире, и мне хочется тестировать его на основе PHPUnit_Extensions_Database_TestCase, для чего пользуюсь туториалом отсюда
В итоге класс становится таким.
require_once 'PHPUnit/Extensions/Database/TestCase.php';
class XXX_Test extends PHPUnit_Extensions_Database_TestCase
{
protected function getConnection()
{
return null;// $this->createDefaultDBConnection($this->_dbObject,'sqlite');
}
protected function getDataSet()
{
return '';//$this->createFlatXMLDataSet('path/to/fixtures/dummy.xml');
}
public function testSmth()
{
$this->assertTrue(true);
}
}
Функции коннекта и загрузки данных, преднамеренно реализованы криво.
Запускаем.
$phpunit path/xxxTest.php
О***ваем
PHPUnit 3.3.10 by Sebastian Bergmann.
Class PHPUnit_Extensions_Database_TestCase could not be found in /var/www/toox.com.lottery/core/classes/db/query/Rapid_Db_Query_IteratorTest.php
Я повяз в дебаге на пару часов, т.к. это был мой первый опыт работы с DBUnit + также приведенный пример сильно упрощен по сравнению с тем файлом, с которым я работал.
В итоге оказалось, что при работе с DBUnit обязательно использовать полную форму запуска phpunit
Т.е. при запуске нужно было указать имя тестируемого класса.
$phpunit XXX_Test path/xxxTest.php
PHPUnit 3.3.10 by Sebastian Bergmann.
E
Time: 0 seconds
There was 1 error:
1) testSmth(XXX_Test)
Argument 1 passed to PHPUnit_Extensions_Database_DefaultTester::__construct() must implement interface PHPUnit_Extensions_Database_DB_IDatabaseConnection, null given, called in /usr/share/php/PHPUnit/Extensions/Database/TestCase.php on line 146 and defined
Т.е. теперь уже посыпались человеческие ошибки, которые говорят что я не реализовал необходимый для работы интерфейс. Ну оно и понятно...
3 comments:
За ссылку на туториал спасибо. Очень ценен был бы пост с более развёрнутым опытом тестирования БД.
Как раз сейчас озадачился тестированием с использованием баз данных. Нет ли ещё статей на эту тему?
P.S. Привет, Денис :)
Пишу обычно о проблемах и решениях, а не статьи. Поэтому нет. Да и вообще после перехода на yii проблем с организацией тестов не возникает :) Родные fixtures и тестовое окружение хороши.
Если есть проблемы, вопросы можно попытаться решить вместе. Можно даже какую нибудь статью придумать, главное знать что требуется.
Post a Comment