PHPUnit - утверждение не удалось, но я хочу продолжить тестирование - PullRequest
14 голосов
/ 26 июля 2011
->assertTrue(false);
->assertTrue(true);

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

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

Ответы [ 4 ]

12 голосов
/ 30 июля 2015

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

Сбои утверждения 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)
        );
    }
}

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

10 голосов
/ 26 июля 2011

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

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

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

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

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

7 голосов
/ 26 июля 2011

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

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

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

MyMethod2и myResult2 потерпит неудачу.

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

MyTestMethod1()
{
   someResult = MyMethod();
   assertIsCorrect(someResult);
}
MyTestMethod2()
{
   myResult2 = MyMethod2(someCorrectResult);
   assertIsCorrect(myResult2);
}
0 голосов
/ 10 июня 2019

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

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

PHPUnit 3.7.38 от Sebastian Bergmann.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...