Предыстория: одна из критических частей кода проекта покрыта юнит тестами основаными на фреймворке SimpleTest. В связи с переходом на PHPUnit необходимо было адаптировать существующие тесты под новый тестовый фреймворк.
Причем необходимо было оставить работающими тесты как в режиме SimpleTest, ну и заставить их работать в PHPUnit. Код самих тестов, естественно, один и тотже.
Было выделено три ключевых момента где есть различия между SimpleTest и PHPUnit:
Какой фреймворк должен работать определяется очень просто, если константа PHPUNITRUN == true, значит работает PHPUnit, иначе SimpleTest
Учитываем различия при помощи if и помещаем результаты в $reporter:
Каждый фреймворк требует чтобы тест-кейсы были пронаследованы от спицифических базовых классов.
Это различие решается следующим образом, заодно учитываются различия между названием проверочных методов. Например в PHPUnit метод assertIsA($actual, $expected, $message = '') звучит как assertType($expected, $actual, $message):
Все тест-кейсы проекта наследуются от класса Overload_TestCase. Тем самым каждый тест-кейс наследуется от нужного для конкретного фреймворка базового класса.
3. Обработка результатов тестирования
Результаты тестирования хранятся в объекте $reporter.
Для последующей обработки результатов (сохранение в базу, посылки писем, если выявлены проблемы и тп), стандартный HtmlReporter из SimpleTest приводится к интерфейсу PHPUnit_Framework_TestResult из PHPUnit.
Теперь тесты можно запускать и обрабатывать как в режиме SimpleTest, так и в режиме PHPUnit.
Причем необходимо было оставить работающими тесты как в режиме SimpleTest, ну и заставить их работать в PHPUnit. Код самих тестов, естественно, один и тотже.
Было выделено три ключевых момента где есть различия между SimpleTest и PHPUnit:
- 1. Запуск тестов
- 2. Используемые методы проверки и наследование
- 3. Обработка результатов тестирования
Какой фреймворк должен работать определяется очень просто, если константа PHPUNITRUN == true, значит работает PHPUnit, иначе SimpleTest
1. Запуск тестов
Учитываем различия при помощи if и помещаем результаты в $reporter:
if (PHPUNITRUN) { // PHPUnit run
$testSuite = new PHPUnit_Framework_TestSuite( $testCase );
$testSuite->addTestSuite( $testCase );
$reporter = PHPUnit_TextUI_TestRunner::run( $testSuite );
}
else { // SimpleTest run
$testSuite = new TestSuite();
$testSuite->addTestClass( $testCase );
$testSuite->run( $reporter );
}
2. Используемые методы проверки и наследование
Каждый фреймворк требует чтобы тест-кейсы были пронаследованы от спицифических базовых классов.
Это различие решается следующим образом, заодно учитываются различия между названием проверочных методов. Например в PHPUnit метод assertIsA($actual, $expected, $message = '') звучит как assertType($expected, $actual, $message):
if ( PHPUNITRUN ) {
class Overload_TestCase extends PHPUnit_Framework_TestCase {
protected $backupGlobals = false;
public static function assertIsA($actual, $expected, $message = '')
{
self::assertType($expected, $actual, $message);
}
public static function assertNotA($actual, $expected, $message = '')
{
self::assertNotType($expected, $actual, $message);
}
public static function assertTrue($condition, $message = '')
{
parent::assertTrue((bool)$condition, $message);
}
public static function assertFalse($condition, $message = '')
{
parent::assertFalse((bool)$condition, $message);
}
public static function assertEqual($expected, $actual, $message = '')
{
self::assertEquals($expected, $actual, $message);
}
}
}
else {
class Overload_TestCase extends UnitTestCase {
}
}
Все тест-кейсы проекта наследуются от класса Overload_TestCase. Тем самым каждый тест-кейс наследуется от нужного для конкретного фреймворка базового класса.
3. Обработка результатов тестирования
Результаты тестирования хранятся в объекте $reporter.
Для последующей обработки результатов (сохранение в базу, посылки писем, если выявлены проблемы и тп), стандартный HtmlReporter из SimpleTest приводится к интерфейсу PHPUnit_Framework_TestResult из PHPUnit.
class NewHtmlReporter extends HtmlReporter
{
/**
* Gets the number of detected errors.
*
* @return integer
*/
public function errorCount()
{
return $this->_exceptions;
}
/**
* Gets the number of detected failures.
*
* @return integer
*/
public function failureCount()
{
return $this->_fails;
}
/**
* Gets the number of run tests.
*
* @return integer
*/
public function count()
{
return $this->_passes;
}
};
Теперь тесты можно запускать и обрабатывать как в режиме SimpleTest, так и в режиме PHPUnit.