<rmcreative>

RSS

Зачистка контекста в 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

  1. №12052
    slavcodev
    slavcodev 09 нояб. 2020 г., 14:24:44

    Это уже не юнит тест раз он связан с инфра так жестко :)

  2. №12055
    Sam
    Sam 10 нояб. 2020 г., 18:33:37

    Если тестрируем, например, библиотеку для работы с файловой системой, то вполне себе юнит.

  3. №12056
    slavcodev
    slavcodev 10 нояб. 2020 г., 18:48:56

    Не думаю. Юнит тесты это тестирование строчек кода в этом юните, а не его взимодествие с чем вне юнита.

  4. №12057
    Дмитрий
    Дмитрий 12 нояб. 2020 г., 12:13:45

    slavcodev, а потом получаем работающие тесты и не работающий продакшн. Проходили это.

  5. №12058
    Дмитрий
    Дмитрий 12 нояб. 2020 г., 12:15:19

    С Александром полностью согласен. К примеру, вы пишите библиотеку для скачивания картинок и ресайза их. Как вы будете тестировать этот код без собственно скачивания картинки и без ее ресайза? Это все замокать нереально. Вы же должны сделать много проверок на ФС.

  6. №12059
    slavcodev
    slavcodev 12 нояб. 2020 г., 12:42:46

    Дмитрий не вижу как твой комментарий связан с моими. Конечно, продолжай писать писать тесты, которые дергают ФС, можно их просто не называт unit.

    ЗЫ: Я понимаю что это холиварный вопрсо и дело принципа. Если нравится писать isolated unit tests которые не зависят от внешних факторов, будете мокать, причем это стиль выявляет пробелмы дизайна и помогает увидеть где можно сделать код лучше. Он будет лучше когда мокать в тестах надо меньше или моки в тестах юзаются просто.

    Even a classic tester like myself uses test doubles when there's an awkward collaboration. They are invaluable to remove non-determinism when talking to remote services. Indeed some classicist xunit testers also argue that any collaboration with external resources, such as a database or filesystem, should use doubles. Partly this is due to non-determinism risk, partly due to speed. While I think this is a useful guideline, I don't treat using doubles for external resources as an absolute rule. If talking to the resource is stable and fast enough for you then there's no reason not to do it in your unit tests. - Martin Fauler

  7. №12064
    Oldy
    Oldy 13 дек. 2020 г., 0:42:24

    slavcodev, в юнит тестировании ключевое слово юнит. Если ваш код нацелен на работу с файловой системой, то они вместо образуют один так сказать юнит. поэтому такое тестирование остается юнит тестирование.

    А вообще зря вы зацикливаетесь на именовании. Большинство корифеев, дают разные определения для юнит тестирования. Один параметр который остается общим, они должны быть очень быстрыми.

  8. №12065
    slavcodev
    slavcodev 13 дек. 2020 г., 1:13:08

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

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.