среда, 5 июня 2019 г.

Как писать тесты на поведение с разными конфигурациями настроек?

или "Как писать тесты на расширение поведения контролов?"

Например, у меня есть контрол MyTextEdit и у него сейчас есть свойство "repaintChangesOnly {false, true}". В моем текущем проекте много таких свойств: сначала сделали одну реализацию (и кучу тестов на нее), потом один из клиентов сообщил о ее недостатках и мы придумали другую (и добавили новое свойство). Обычное дело в долгоиграющем проекте на несколько лет.


И для этого "обычного дела" я сейчас часто вижу "половину" тестов.
Во-первых, это сценарии от клиентов для проблем с новым режимом, тесты типа таких:

[Test]
public void Show_DoAction12345() {
   MyTextEdit textEdit = new MyTextEdit();
   textEdit.repaintChangesOnly = true;
   DoAction1();
   ...
   Assert.IsTrue(passed);
}

Уже здесь видно что результаты работы моего контрола в режиме "repaintChangesOnly: false" в этом сценарии не проверяются.

Во-вторых, это "старые" тесты, которые написали когда свойства "repaintChangesOnly" вообще не было:

[Test]
public void Show_DoAction1() {
   MyTextEdit textEdit = new MyTextEdit();
   DoAction1();
   ...
   Assert.IsTrue(passed);
}

С таким тестом результаты работы в режиме "repaintChangesOnly: true" в этом сценарии вообще не проверяются.

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

Подобная задача с repaintChangesOnly подразумевает что у меня на самом деле два контрола, которые работают по разному, только я упаковал их в один класс и сделал свойство переключатель. 

Сейчас я делаю для них запуск всей группы тестов в каждой конфигурации: каждый тест проверяет свой сценарий и на каждую конфигурацию в тесте есть своя проверка результатов. При появлении новой конфигурации (например добавление опции "repaintChangesOnly") я добавляю новый цикл на все тесты и они начинают проверять результаты для обоих значений:

[false, true].forEach(repaintChangesOnly => {
  [false, true].forEach(deferRendering => {
    [false, true].forEach(animationEnabled => {
      const context = { repaintChangesOnly, deferRendering, animationEnabled };
      const contextName = JSON.stringify(context);
      test("show [], " + contextName, () => {
        var tree = new MyTree(context, []);
        ..
      }
      test("show [a], " + contextName, () => {
        var tree = new MyTree(context, ['a']);
        ..
      }
      test("show [a, b], " + contextName, () => {
        var tree = new MyTree(context, ['a', 'b']);
        ..
      }
      ...
    }
  }
})

----
Что делать если контрол с моим новым PaintMode.V2 в некоторых сценария приводит к неправильным результатам? Ведь польза от него явно есть, клиенту отдали и он доволен, эти "некоторые сценарии" ему до лампочки...
Для этой ситуации в описании значения V2 для свойства PaintMode я добавляю в его документацию "Сценарий ХХ не будет работать если присвоено значение V2" и исключаю этот проверку результатов для расклада {repaintChangesOnly: true} из конкретного теста который проверяет этот сценарий.

Комментариев нет:

Отправить комментарий