2010-01-29 3 views
2

Я новичок в структуре 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 на неудачу, или мне просто нужно жить с другим стилем?

ответ

5

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

Или

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

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

бы закончить текущую функцию тестирования.

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

1

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

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

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

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

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

3

Это действительно не отвечает на ваш вопрос, но для чего он стоит, PHPUnit всегда не работает быстро.

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

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

+0

Я не выбрал SimpleTest, он просто интегрирован с CakePHP. Пока это не слишком раздражает, чтобы заставить меня проверить PHPUnit. –

1

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

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