Зачем группировать отдельные тесты внутри unit-тестов?

Прислали вопросы для подготовки к собеседованию. Один из них звучит так: Зачем группировать отдельные тесты внутри unit-тестов?

Подскажите, что это значит? Как это выглядит в целом? И для чего нужно?


Ответы (1 шт):

Автор решения: Алексей Шиманский

Группировать нужно операции, которые можно объединить по какой-либо концепции.

Например, вам нужно проверить работу валидации. Но валидация может быть разной: можно проверять на то, что поля заполнены неправильно (например email или логин не соответствует шаблону); проверять, что поле уникально (опять же, например, email), проверять, что все обязательные поля заполнены и т.д. То есть можно сделать несколько разных тестов:

testValidateEmptyValues() {
    // ...
}

testValidatewrongValues() {
    // ...
}

testValidateRequiredValues() {
    // ...
}

testValidateExistedValues() {
    // ...
}

testValidateUniqueValues() {
    // ...
}

Это отлично, но в целом можно это объединить в один метод:

testValidation() {
    // ...
}

И этот метод говорит сам за себя.

Конечно, там не должно быть портянки кода на проверку всевозможнных валидаций, их там внутри тоже можно объединить. Я не знаю как это сделано в Jest, но, например у PHP в Codeception есть специальная штука, под названием specify. В грубом приближении это обёртка, в которой код теста работает независимо. Попробую пояснить

public function testValidation() {
    $this->user = User::create();

    $this->specify("username is required", function() {
        $this->user->username = null;
        $this->assertFalse($this->user->validate(['username']));
    });

    $this->specify("username is too long", function() {
        $this->user->username = 'toolooooongnaaaaaaameeee';
        $this->assertFalse($this->user->validate(['username']));
    });

    $this->specify("username is ok", function() {
        $this->user->username = 'davert';
        $this->assertTrue($this->user->validate(['username']));
    });
}

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

→ Ссылка