Иногда бывает, что тестируемый метод является зависимым от выполнения других методов. Для тестирования таких методов нужно сначала выполнить и возможно протестировать методы, от которых зависит тестируемый метод. Для этих целей в PHPUnit есть аннотация @depends, значение которой метод-поставщик. Результат его выполнения будет передан методам-потребителям, у которых указана аннотация @depends. Но такие зависимости не определяют порядок, в котором должны быть выполнены методы.
Приведём пример, в котором протестируем класс User.
<?php // src/ExampleProject/User.php namespace ExampleProject; class User { /** * @var string */ protected $username; /** * @param string $username * @return User */ public function setUsername(string $username): User { $this->username = $username; return $this; } /** * @return string */ public function getUsername() { return $this->username; } }
Код теста:
<?php // tests/ExampleProject/UserTest.php namespace Tests\ExampleProject; use PHPUnit\Framework\TestCase; use ExampleProject\User; class UserTest extends TestCase { /** * @return User */ public function testSetUsername() { $user = new User(); $this->assertEquals($user, $user->setUsername('Test User Name')); return $user; } /** * @param User $user * @depends testSetUsername */ public function testGetUsername(User $user) { $this->assertEquals('Test User Name', $user->getUsername()); } }
Если метод-поставщик потерпит неудачу, то метод-потребитель не будет выполнен. Это позволяет сосредоточиться на конкретных тестах. В данном примере, если testSetUsername не пройдёт, т.е. скорее всего не будет установлен $username, то метод getUsername выполнять бессмысленно, поэтому нам не интересно, какой будет результат выполнения testGetUsername, его результат будет только мешать в выводе.
Если тест имеет тест-поставщика данных, у которого есть dataProvider, то тест будет выполнен, если тест-поставщик выполнится успешно хотя бы для одного набора данных. К тому же результат выполнения теста-поставщика не может быть передан в тест-потребитель.