Можно ли настроить структуру PHP SimpleTest так, чтобы она быстро терпела неудачу?

Я новичок в PHP SimpleTest и был удивлен, увидев, что ошибочное утверждение не останавливает тест. метод. Другими словами, это вызывает два сообщения об ошибке в отчете о тестировании:

function testFoo() {
    $this->assertTrue(true, 'first: %s');
    $this->assertTrue(false, 'second: %s');
    $this->assertTrue(false, 'third: %s');
}

Большая часть моего опыта модульного тестирования связана с JUnit и NUnit, и оба они останавливают тестовый метод, как только первое утверждение терпит неудачу. Может быть, я просто привык к этому, но кажется, что дополнительные сообщения об ошибках будут просто шумом. Это напоминает мне старые компиляторы C, которые выдавали 50 ошибок из-за отсутствия точки с запятой.

Могу ли я настроить SimpleTest так, чтобы он быстро терпел неудачу, или мне просто нужно жить с другим стилем?


person Don Kirkby    schedule 29.01.2010    source источник


Ответы (4)


Вы можете расширить/изменить класс Reporter, чтобы он выполнял функцию exit() после paintFail().
(модификация юнит-тестов не требуется)

Or

Функции assert* возвращают логическое значение, например:

 $this->assertTrue(false, 'second: %s') or return;

завершит текущую тестовую функцию.

PS:
Если вы используете класс PHPUnit_TestCase вместо UnitTestCase, функции assert* не будут возвращать логическое значение.

person Bob Fanger    schedule 30.01.2010

На самом деле это не ответ на ваш вопрос, но, как бы там ни было, PHPUnit всегда быстро дает сбой.

http://www.phpunit.de/manual/current/en/goals.html говорит:

... в первый раз, когда тест терпит неудачу, выполнение теста останавливается, и PHPUnit сообщает об ошибке.

person Community    schedule 30.01.2010
comment
На самом деле я не выбирал SimpleTest, он просто интегрирован с CakePHP. Пока это не настолько раздражает, чтобы заставить меня проверить PHPUnit. - person Don Kirkby; 30.01.2010

Методы assert возвращают логическое значение для прохождения или сбоя, поэтому вы можете проверить это и остановить тест, когда что-то не удается.

Я не думаю, что это масштабируется для каждого теста в проекте, но некоторые особенно шумные тесты могут быть полезны.

Вот простой пример:

function testBar() {
    $pass = $this->assertTrue(true, 'first: %s');
    $pass = $pass && $this->assertTrue(false, 'second: %s');
    $pass = $pass && $this->assertTrue(false, 'third: %s');
}

Вы можете использовать операторы if для переноса больших фрагментов кода.

person Don Kirkby    schedule 29.01.2010

Мне это нужно, потому что все мои тесты зависят от работоспособности базы данных. ЕСЛИ база данных не работает, меня не волнует экран с 10 000 отказов. Поскольку simpletest печатает сразу после сбоя, и это всего лишь php-код, вы можете остановить тестирование с помощью простого оператора die.

Вот как выглядит мой код для моего критического теста «подключен ли я».

function testDatabaseAccess()
{
  $connected = TRUE;
  GLOBAL $clients;
  $connected &= $this->assertTrue(is_object($clients), 'Clients database not connected.');

  GLOBAL $practices;
  $connected &= $this->assertTrue(is_object($practices), 'Practices database not connected.');

  GLOBAL $user;
  $connected &= $this->assertTrue(is_array($user), 'User not defined.');

  GLOBAL $practice;
  $connected &= $this->assertTrue(is_object($practice), 'Practice database not connected.');

  if (!$connected)
  {
    die('Not Connected.');
  }
}

Что производит:

введите здесь описание изображения

Конечно, я не получаю сводную строку, но для моего варианта использования мне не нужна или не нужна моя сводная строка. Нет БД, нет смысла тестировать. Что касается остальной части моего тестирования, мне действительно нравится, что он не дает сбой сразу. Обычно я хочу увидеть все свои неудачи за один прогон.

person danielson317    schedule 02.09.2016