Этот вопрос проверяет понимание принципов модульного тестирования и умение проектировать тесты, которые эффективно покрывают различные логические пути в методе.
В модульном тестировании цель — проверить корректность работы отдельных единиц кода (обычно методов или функций) в изоляции. Метод, содержащий условные операторы (if/else, switch), имеет несколько логических путей (веток).
Тест, который пытается проверить несколько сценариев в одном методе, нарушает принцип "один тест — одна ответственность". Такой тест:
Для каждой значимой ветки логики следует писать отдельный тестовый метод. Это соответствует паттерну "Arrange-Act-Assert".
// Пример метода с ветвлением
function calculateDiscount(userType, purchaseAmount) {
if (userType === 'premium') {
return purchaseAmount * 0.2; // Ветка 1: скидка 20%
} else if (purchaseAmount > 100) {
return purchaseAmount * 0.1; // Ветка 2: скидка 10%
} else {
return 0; // Ветка 3: скидки нет
}
}
// ПЛОХО: Один тест на все ветки
it('calculates discount correctly', () => {
expect(calculateDiscount('premium', 50)).toBe(10);
expect(calculateDiscount('regular', 150)).toBe(15);
expect(calculateDiscount('regular', 50)).toBe(0);
});
// ХОРОШО: Отдельные тесты для каждой ветки
it('gives 20% discount for premium users', () => {
const discount = calculateDiscount('premium', 100);
expect(discount).toBe(20);
});
it('gives 10% discount for large purchases', () => {
const discount = calculateDiscount('regular', 200);
expect(discount).toBe(20); // 10% от 200
});
it('gives no discount for small regular purchases', () => {
const discount = calculateDiscount('regular', 50);
expect(discount).toBe(0);
});Такой подход является стандартом в модульном тестировании на любом языке (JavaScript/Python/Java и т.д.) и используется с фреймворками вроде Jest, PyTest, JUnit. Он напрямую связан с метрикой покрытия кода (code coverage), которая измеряет, какой процент веток (branch coverage) или строк кода покрыт тестами.
Вывод: Писать один тест на несколько веток метода технически возможно, но это антипаттерн. Для создания надежной, поддерживаемой и понятной тестовой базы всегда следует стремиться к изолированным тестам, каждый из которых проверяет одну конкретную логику или сценарий работы метода.