Подтвердить что ты не робот

PHPUnit - утверждение не выполнено, но я хочу продолжить тестирование

->assertTrue(false);
->assertTrue(true);

Первое утверждение не выполнено, и исполнение было остановлено. Но я хочу продолжить дальнейший фрагмент кода.

Возможно ли в PHPUnit

4b9b3361

Ответ 1

Вы можете просто сохранить ошибки на конец, скажем, с

$passing = true;
if (! false) { $passing = false; }
if (! true) { $passing = false; }
$this->assertTrue($passing);

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

Кроме того, более умные люди, чем я, согласны, тесты не должны иметь каких-либо условий (если/еще, попробовать/поймать), потому что каждое условие усложняет тест. Если необходимо условие, возможно, следует внимательно изучить как тест, так и тестируемое устройство или тестируемую систему, чтобы упростить его.

Гораздо лучшим способом было бы изменить его на два теста, и, если они разделяют значительную часть установки, затем переместить эти два теста в новый класс испытаний, когда общая установка выполняется в методе Setup().

Ответ 2

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

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

public function testDemo()
{
    $failures = [];
    try {
        $this->assertTrue(false);
    } catch(PHPUnit_Framework_ExpectationFailedException $e) {
        $failures[] = $e->getMessage();
    }
    try {
        $this->assertTrue(false);
    } catch(PHPUnit_Framework_ExpectationFailedException $e) {
        $failures[] = $e->getMessage();
    }
    if(!empty($failures))
    {
        throw new PHPUnit_Framework_ExpectationFailedException (
            count($failures)." assertions failed:\n\t".implode("\n\t", $failures)
        );
    }
}

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

Ответ 3

который побеждает точку unit test. вам может понадобиться разбить его на несколько тестовых методов вместо метода монолитного теста.

Вот какой-то псевдокод, как плохой пример.

MyBadTestMethod()
{
   someResult = MyMethod();
   assertIsCorrect(someResult);
   myResult2 = MyMethod2(someResult);
   assertIsCorrect(myResult2);
}

MyMethod2 и myResult2 не удастся.

Вот лучший пример.

MyTestMethod1()
{
   someResult = MyMethod();
   assertIsCorrect(someResult);
}
MyTestMethod2()
{
   myResult2 = MyMethod2(someCorrectResult);
   assertIsCorrect(myResult2);
}

Ответ 4

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

Вы можете создать файл phpunit.xml из которого вы запускаете тест phpunit. Следовательно, phpunit запустит необходимые тесты, перечисленные там.

PHPUnit 3.7.38 от Себастьяна Бергмана.

Конфигурация читается из /path/phpunit.xml

В этом файле вы можете указать, что не хотите останавливаться при сбое.

<phpunit bootstrap="vendor/autoload.php" stopOnFailure="false">
  <testsuites>
    <testsuite name="Test">
      <file>tests/ClassTest.php</file>
    </testsuite>
  </testsuites>
</phpunit>

Надеюсь это поможет.