Зачистка контекста в unit-тестах
9 ноября 2020
Unit-тесты должны быть изолированы. То есть тесты должны проходить если выполнять из по-одному или если включить в PHPUnit режим выполнения в случайном порядке через phpunit.xml.dist
:
<phpunit executionOrder="default">
Для этого, если тест работает с окружением (например, с файловой системой), окружение нужно подчищать. Причём подчищать и до и после через setUp()
и tearDown()
:
final class MyTest extends PHPUnit\Framework\TestCase
{
public function setUp(): void
{
$this->cleanup();
$path = realpath(sys_get_temp_dir());
mkdir($path, 755);
}
public function tearDown(): void
{
$this->cleanup();
}
private function cleanup(): void
{
$path = realpath(sys_get_temp_dir());
rmdir($path)
}
Зачистка делается два раза и до и после потому как если какой-то тест упадёт, зачистка в tearDown()
не выполнится и окружение "встанет".
Комментарии RSS по email OK
Это уже не юнит тест раз он связан с инфра так жестко :)
Если тестрируем, например, библиотеку для работы с файловой системой, то вполне себе юнит.
Не думаю. Юнит тесты это тестирование строчек кода в этом юните, а не его взимодествие с чем вне юнита.
slavcodev, а потом получаем работающие тесты и не работающий продакшн. Проходили это.
С Александром полностью согласен. К примеру, вы пишите библиотеку для скачивания картинок и ресайза их. Как вы будете тестировать этот код без собственно скачивания картинки и без ее ресайза? Это все замокать нереально. Вы же должны сделать много проверок на ФС.
Дмитрий не вижу как твой комментарий связан с моими. Конечно, продолжай писать писать тесты, которые дергают ФС, можно их просто не называт unit.
ЗЫ: Я понимаю что это холиварный вопрсо и дело принципа. Если нравится писать isolated unit tests которые не зависят от внешних факторов, будете мокать, причем это стиль выявляет пробелмы дизайна и помогает увидеть где можно сделать код лучше. Он будет лучше когда мокать в тестах надо меньше или моки в тестах юзаются просто.
slavcodev, в юнит тестировании ключевое слово юнит. Если ваш код нацелен на работу с файловой системой, то они вместо образуют один так сказать юнит. поэтому такое тестирование остается юнит тестирование.
А вообще зря вы зацикливаетесь на именовании. Большинство корифеев, дают разные определения для юнит тестирования. Один параметр который остается общим, они должны быть очень быстрыми.
Oldy, я не пытаюсь тебя переубедить, это просто мое мнение. Юнит тесты пишутся чтоб тестировать код этого юнита, а не файловую систему или другие внешние зависимости. Юниты тесты не должны зависить или тестировать глюки этих зависимостей.