Parameterized тесты (или “параметризованные тесты”) — это механизм, который позволяет запускать одну и ту же тестовую логику с разными наборами данных. В Jasmine этот подход помогает значительно улучшить читаемость и поддержку тестов, исключая избыточный код. Вместо того чтобы писать несколько схожих тестов с минимальными изменениями в данных, можно параметризовать один тест и передавать в него различные значения. Это значительно сокращает объем тестов, упрощает их поддержку и делает тесты более гибкими.
Основная цель использования параметризированных тестов — это увеличение покрытия кода тестами, улучшение его читаемости и упрощение изменений в тестах. Когда требуется проверять несколько вариантов входных данных для одного и того же метода или функции, параметризация позволяет избежать написания одинаковых тестов с изменяющимися данными.
Пример:
describe("Функция сложения", function() {
it("должна правильно складывать два числа", function() {
const testData = [
{a: 1, b: 2, expected: 3},
{a: -1, b: -2, expected: -3},
{a: 0, b: 0, expected: 0},
{a: 5, b: -3, expected: 2}
];
testData.forEach(function(data) {
const result = data.a + data.b;
expect(result).toBe(data.expected);
});
});
});
В данном примере создается массив с объектами, каждый из которых представляет собой набор данных для теста. Для каждого набора данных вызывается одна и та же логика теста, что делает код гораздо более компактным и легко расширяемым.
В Jasmine нет прямой поддержки параметризации через стандартные API, как это реализовано в некоторых других тестовых фреймворках. Однако, можно использовать несколько различных подходов для имитации параметризации тестов.
forEach для параметризацииКак показано в примере выше, самым простым способом является
использование метода forEach для перебора массива данных.
Это позволяет запустить один и тот же тест с разными значениями без
необходимости дублировать код.
describe с динамическими блокамиЕсли требуется более сложная параметризация с разными наборами
тестов, можно использовать describe в комбинации с
динамическим созданием блоков тестов. Это полезно в случае, если каждый
тест должен быть организован в отдельный блок, но данные для тестов
приходят из внешнего источника.
const testCases = [
{name: "Тест 1", a: 1, b: 2, expected: 3},
{name: "Тест 2", a: -1, b: -2, expected: -3},
{name: "Тест 3", a: 5, b: -3, expected: 2}
];
testCases.forEach(function(testCase) {
describe(testCase.name, function() {
it("должен правильно сложить числа", function() {
const result = testCase.a + testCase.b;
expect(result).toBe(testCase.expected);
});
});
});
В этом примере для каждого набора данных создается отдельный блок
describe, что помогает структурировать тесты и убедиться,
что каждый тест выполняется независимо.
Для более сложной реализации параметризированных тестов можно
использовать внешние библиотеки, такие как
jasmine-data-provider, которые позволяют легко
организовывать параметризацию.
Пример с использованием jasmine-data-provider:
describe("Функция сложения", function() {
var dataProvider = function() {
return [
{a: 1, b: 2, expected: 3},
{a: -1, b: -2, expected: -3},
{a: 0, b: 0, expected: 0},
{a: 5, b: -3, expected: 2}
];
};
it("должна правильно складывать два числа", function() {
dataProvider().forEach(function(data) {
const result = data.a + data.b;
expect(result).toBe(data.expected);
});
});
});
В этом примере используется вспомогательная функция
dataProvider, которая предоставляет тестовые данные. Тест
выполняется для каждого набора данных, передавая их в тестовую
логику.
Преимущества:
Недостатки:
Parameterized тесты в Jasmine позволяют эффективно управлять большими объемами тестовых данных, делая тесты более читаемыми и легко расширяемыми. Несмотря на то, что стандартный Jasmine не предоставляет прямой поддержки для параметризации, различные подходы и сторонние библиотеки позволяют реализовать параметризацию в удобной и понятной форме.