Допустим, у меня есть две чистые функции, pureFn1
и pureFn2
.Эти функции должны проходить похожие тесты.
describe("generic function", () => {
it("should fulfill condition 1", testCondition1);
it("should fulfill condition 2", testCondition2);
it("should fulfill condition 3", testCondition3);
it("should fulfill condition 4", testCondition4);
});
Как бы написать аналогичные тесты для этих функций?Должен ли набор тестов использоваться повторно?
Например, если мы повторно использовали набор тестов, он в конечном итоге будет выглядеть следующим образом:
const reusableTestSuite = (codeUnderTest) => {
describe(`${codeUnderTest.name}`, () => {
it("should fulfill condition 1", testCondition1(codeUnderTest));
it("should fulfill condition 2", testCondition2(codeUnderTest));
it("should fulfill condition 3", testCondition3(codeUnderTest));
it("should fulfill condition 4", testCondition4(codeUnderTest));
});
};
reusableTestSuite(pureFn1);
reusableTestSuite(pureFn2);
Это довольно СУХОЙ, но проблема естьэто абстракция, которая может затруднить чтение и изменение тестов и, таким образом, может отговорить разработчиков от написания большего количества тестов во имя скорости и простоты.Это обсуждается в пункте 8 этой статьи .Когда эти абстрактные тесты прерываются, следующий разработчик может не захотеть их читать.
Другой вариант - скопировать и вставить тесты:
describe("pureFn1", () => {
it("should fulfill condition 1", testCondition1Fn1);
it("should fulfill condition 2", testCondition2Fn1);
it("should fulfill condition 3", testCondition3Fn1);
it("should fulfill condition 4", testCondition4Fn1);
});
describe("pureFn2", () => {
it("should fulfill condition 1", testCondition1Fn2);
it("should fulfill condition 2", testCondition2Fn2);
it("should fulfill condition 3", testCondition3Fn2);
it("should fulfill condition 4", testCondition4Fn2);
});
Это полное дублирование кода.Там нет абстракции.Если бы у нас было две функции с 20 общими свойствами между ними, нам пришлось бы копировать и вставлять 20 тестов, и не забывать обновлять все подобные тесты, когда один из них меняется навсегда.
Таким образом, между этими подходами, что лучшеметод?Или есть третий метод, лучший способ написания юнит-тестов таким образом, чтобы мы получали преимущества абстракции, не мешая следующему разработчику сразу же понять, что пошло не так, и, таким образом, не препятствуютим от написания еще этих тестов?