Зависимости тестов PHPUnit

Иногда бывает, что тестируемый метод является зависимым от выполнения других методов. Для тестирования таких методов нужно сначала выполнить и возможно протестировать методы, от которых зависит тестируемый метод. Для этих целей в 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, то тест будет выполнен, если тест-поставщик выполнится успешно хотя бы для одного набора данных. К тому же результат выполнения теста-поставщика не может быть передан в тест-потребитель.