Каковы лучшие практики для модульного тестирования нескольких функций, которые имеют очень похожие сценарии тестирования? - PullRequest
0 голосов
/ 19 июня 2019

Допустим, у меня есть две чистые функции, 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 тестов, и не забывать обновлять все подобные тесты, когда один из них меняется навсегда.

Таким образом, между этими подходами, что лучшеметод?Или есть третий метод, лучший способ написания юнит-тестов таким образом, чтобы мы получали преимущества абстракции, не мешая следующему разработчику сразу же понять, что пошло не так, и, таким образом, не препятствуютим от написания еще этих тестов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...