Предисловие переводчика
Эта статья продолжает серию переводов официальной документации по PHPUnit на русский язык. Часть 1,
Часть 2,
Часть 3,
Часть 4,
Комбинируемость - это одна из целей PHPUnit (см. Цели PHPUnit).
Мы хотим иметь возможность запускать несколько тестов отдельно или все вместе, например, все тесты для всего проекта целиком или все тесты для всех классов
только одного компонента, который является частью проекта или тесты только для одного класса.
PHPUnit поддерживает различные способы организации тестов и объединения их в тестовый набор. В этой статье рассматривается наиболее распространенный подход.
Составление набора тестов при помощи файловой системы
Пожалуй самый простой способ составить набор тестов заключается в хранении файлов всех исходных текстов в специальном каталоге для тестов.
PHPUnit может автоматически найти и запустить тесты, рекурсивно обойдя такой каталог.
Давайте посмотрим набор тестов для библиотеки Object_Freezer.
Посмотрев на структуру каталогов, мы заметим, что структура тестовых классов - System Under Test (SUT), к каталоге Tests
полностью повторяет структуру классов в каталоге Object.
Чтобы запустить все тесты библиотеки, нам всего лишь надо перейти в каталог с тестами PHPUnit и выполнить команду запуска:
phpunit Tests
PHPUnit 3.4.2 by Sebastian Bergmann.
............................................................ 60 / 75
...............
Time: 0 seconds
OK (75 tests, 164 assertions)
Чтобы выполнить все тесты, которые декларированы в классе Object_FreezerTest (Tests/FreezerTest.php),
надо выполнить следующую команду:
phpunit Tests/FreezerTest
PHPUnit 3.4.2 by Sebastian Bergmann.
............................
Time: 0 seconds
OK (28 tests, 60 assertions)
Для более точного управления тестами можно использовать переключатель --filter:
phpunit --filter testFreezingAnObjectWorks Tests
PHPUnit 3.4.2 by Sebastian Bergmann.
.
Time: 0 seconds
OK (1 test, 2 assertions)
Примечание
Недостаток этого подхода заключается в том, что мы не можем управлять последовательностью выполнения тестов.
Это может привести к проблемам зависимости тестов,
см.
раздел "Зависимости тестов".
Составление набора тестов при помощи XML-конфигурации
Конфигурационный XML-файл PHPUnit (
Приложение C)
тоже может быть применен для составления тестового набора.
Пример 7.1
показывает как добавить все классы *Test, которые будут найдены в файлах *Test.php во время рекурсивного обхода каталога
Tests.
Пример 7.1: Составление тестового набора при помощи XML-конфигурации
У этого подхода тот же недостаток, что и в предыдущем способе - мы не можем управлять последовательностью выполнения
тестов. Это может привести к проблемам зависимости тестов,
см.
раздел "Зависимости тестов".
В качестве альтернативы, мы можем четко прописать порядок запуска тестов: Пример 7.2: Составление тестового набора при помощи XML-конфигурации
Package_ClassTest - это типовой класс тестов, который наследует класс PHPUnit_Framework_TestCase.
Выполнение phpunit AllTests в каталоге Tests приведет к запуску всех тестов.
Выполнение phpunit AllTests в каталоге Tests/Package приведет к запуску тестов классов Package_*.
Выполнение phpunit ClassTest в каталоге Tests/Package приведет к запуску тестов класса Package_Class
(которые объявлены в классе Package_ClassTest).
Выполнение phpunit --filter testSomething ClassTest в каталоге Tests/Package приведет к запуску теста
testSomething класса Package_ClassTest.
Классы PHPUnit_Framework_TestSuite предлагают два шаблонных метода setUp() и
tearDown(), которые вызываются до первого и после последнего теста тестового набора.
Пример 7.5: Класс MySuite
require_once 'MyTest.php';
class MySuite extends PHPUnit_Framework_TestSuite
{
public static function suite()
{
return new MySuite('MyTest');
}
protected function setUp()
{
print __METHOD__ . "\n";
}
protected function tearDown()
{
print __METHOD__ . "\n";
}
}
?>
* This source code was highlighted with Source Code Highlighter.
Тестовый класс MyTest, добавленный в набор тестовых методов MySuite в
Примере 7.5
содержит два тестовых метода testOne() и testTwo().
В результатах работы теста видно в каком порядке вызываются функции testOne() и testTwo(),
setUp() и tearDown().
Метод setUp() класса PHPUnit_Framework_TestSuite сохраняет переменные в
$this->sharedFixture. Эти данные доступны во всех тестах этого набора
как $this->sharedFixture (см.
раздел "Совместное использование тестового окружения").
Примечание
Методы класса TestSuitesetUp() и tearDown()
будут вызваны даже если набор тестов не содержит тесты.