Можно ли настроить фреймворк PHP SimpleTest на быстрый отказ? - PullRequest
2 голосов
/ 30 января 2010

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 30 января 2010

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

Или

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

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

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

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

3 голосов
/ 30 января 2010

Это на самом деле не отвечает на ваш вопрос, но за все это стоит, PHPUnit всегда терпит неудачу быстро.

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

... при первом сбое теста выполнение теста останавливается, а PHPUnit сообщает об ошибке.

1 голос
/ 02 сентября 2016

Мне это нужно, потому что все мои тесты зависят от работоспособности базы данных. Если база данных не работает, меня не волнует экран с 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.');
  }
}

Который производит:

enter image description here

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

1 голос
/ 30 января 2010

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

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

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

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

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

...