Написание тестов для PHPUnit (выходы)
Вступление
# Тестирование вывода
Иногда вы хотите утверждать, что выполнение метода генерирует ожидаемый вывод, используя либо echo, либо print .
Эта функциональность обеспечивается классом PHPUnit / Framework / TestCase с использованием функции буферизации вывода PHP.
В приведенном ниже примере показано использование метода waitOutputString () для установки ожидаемого результата. Если этот ожидаемый результат не генерируется, тест будет засчитан как неудачный тест.
<?php
use PHPUnit\Framework\TestCase;
class OutputTest extends TestCase
{
public function testExpectFooActualFoo()
{
$this->expectOutputString('foo');
print 'foo';
}
public function testExpectBarActualBaz()
{
$this->expectOutputString('bar');
print 'baz';
}
}
?>
Приведенный выше тест дает следующий результат.
$ phpunit OutputTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
.F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) OutputTest::testExpectBarActualBaz
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'bar'
+'baz'
FAILURES!
Tests: 2, Assertions: 2, Failures: 1.
Некоторые другие методы также могут быть использованы для проверки результатов в тестах PHPUnit, в таблице перечислены некоторые методы с их значениями.
метод | Имея в виду |
---|---|
void allowOutputRegex (строка $ регулярное выражение) | Установите ожидание того, что результат соответствует $ регулярное выражение . |
void allowOutputString (строка $ Ожидаемое_строки) | Установите ожидание того, что выход равен к $ Ожидаемая строка . |
bool setOutputCallback (вызываемый $ callback) | Устанавливает обратный вызов, который используется, например, для нормализовать фактический выход. |
строка getActualOutput () | Получите фактический результат. |
Следует отметить, что в строгих режимах тест, выдающий выходные данные, не будет выполнен.
# Ошибка вывода
Всякий раз, когда тест не проходит, PHPUnit старается предоставить вам как можно больше контекста, который может помочь определить причину проблемы. Пример ниже иллюстрирует некоторые из этих сообщений об ошибках, сгенерированных PHPUnit в неудачных тестовых экземплярах.
Пример, иллюстрирующий вывод ошибки, сгенерированный при сбое сравнения массивов
<?php
use PHPUnit\Framework\TestCase;
class ArrayDiffTest extends TestCase
{
public function testEquality()
{
$this->assertSame(
[1, 2, 3, 4, 5, 6],
[1, 2, 33, 4, 5, 6]
);
}
}
?>
Когда этот тест выполняется, приведенное ниже сообщение PHPUnit пытается объяснить, почему тест не удался.
$ phpunit ArrayDiffTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
F
Time: 0 seconds, Memory: 5.25Mb
There was 1 failure:
1) ArrayDiffTest::testEquality
Failed asserting that two arrays are identical.
--- Expected
+++ Actual
@@ @@
Array (
0 => 1
1 => 2
- 2 => 3
+ 2 => 33
3 => 4
4 => 5
5 => 6
)
/home/sb/ArrayDiffTest.php:7
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
В этом примере отличается только одно из значений массива, а другие значения показаны для предоставления контекста, в котором произошла ошибка.
Если сгенерированный вывод будет длинным, PHPUnit разделит его и предоставит несколько строк контекста вокруг каждой разницы.
В приведенном ниже примере показан вывод ошибки при сбое сравнения длинного массива
<?php
use PHPUnit\Framework\TestCase;
class LongArrayDiffTest extends TestCase
{
public function testEquality()
{
$this->assertSame(
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 33, 4, 5, 6]
);
}
}
?>
Ниже сгенерированный вывод для вышеуказанного теста
$ phpunit LongArrayDiffTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
F
Time: 0 seconds, Memory: 5.25Mb
There was 1 failure:
1) LongArrayDiffTest::testEquality
Failed asserting that two arrays are identical.
--- Expected
+++ Actual
@@ @@
11 => 0
12 => 1
13 => 2
- 14 => 3
+ 14 => 33
15 => 4
16 => 5
17 => 6
)
/home/sb/LongArrayDiffTest.php:7
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
Края
Если сравнение не удается, PHPUnit создает текстовые представления входных значений и сравнивает их. Из-за этой реализации разница может показать больше проблем, чем она существует на самом деле.
Это происходит только при использовании assertEquals () или других «слабых» функций сравнения для массивов или объектов.
Пример ниже иллюстрирует крайний случай при использовании слабого сравнения.
<?php
use PHPUnit\Framework\TestCase;
class ArrayWeakComparisonTest extends TestCase
{
public function testEquality()
{
$this->assertEquals(
[1, 2, 3, 4, 5, 6],
['1', 2, 33, 4, 5, 6]
);
}
}
?>
Приведенный выше тест, иллюстрирующий слабое сравнение, выдает ниже
$ phpunit ArrayWeakComparisonTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.
F
Time: 0 seconds, Memory: 5.25Mb
There was 1 failure:
1) ArrayWeakComparisonTest::testEquality
Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
Array (
- 0 => 1
+ 0 => '1'
1 => 2
- 2 => 3
+ 2 => 33
3 => 4
4 => 5
5 => 6
)
/home/sb/ArrayWeakComparisonTest.php:7
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
В этом примере сообщается о разнице в первом индексе между 1 и '1', даже если assertEquals () считает значения равными.
Предыдущая: Написание тестов для phpunit (провайдеры данных)
Далее: Написание тестов для phpunit (исключения и ошибки)
Новый контент: Composer: менеджер зависимостей для PHP , R программирования