Pull to refresh

Переезд с SimpleTest на PHPUnit

Reading time3 min
Views1.5K
Предыстория: одна из критических частей кода проекта покрыта юнит тестами основаными на фреймворке 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.
Tags:
Hubs:
Total votes 14: ↑9 and ↓5+4
Comments6

Articles