Это нормально делать единичные случаи при тестировании с phpunit? - PullRequest
0 голосов
/ 15 мая 2019

Можно ли создать отдельный экземпляр объекта и сохранить его в свойстве private или static ?

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

Вот пример:

use PHPUnit\Framework\TestCase;

class MyClassTest extends TestCase
{
    private $obj;

    public function testFoo()
    {
        $this->assertEquals($this->obj->foo(), 'something');
    }


    public function testBar()
    {
        $this->assertEquals($this->obj->bar(), 'something else');
    }

    public function __construct()
    {
        $this->obj = new MyClass();
    }
}

Может ли это считаться плохой практикой или вызывать неожиданное поведение (източка зрения тестирования)?

1 Ответ

2 голосов
/ 15 мая 2019

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

Рассмотрим этот надуманный пример:

public function testSet()
{
    $this->obj->setValue(4);
    $this->assertEquals(4, $this->obj->getValue());
}

public function testAdd()
{
    $this->obj->add(4);
    $this->assertEquals(8, $this->obj->getValue());
}

Нет гарантии, что PHPUnit запускает тесты в определенном порядке, поэтому произойдет сбой, если он решит запустить testAdd до testSet.

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

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

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