Статьи

Ограничения модульного тестирования с бизнес-вводом из Excel или LibreOffice

Бизнес-эксперты объясняют бизнес-ограничения нам, разработчикам. Но как мы можем быть уверены, что поняли их правильно? Или хуже, как мы можем проверить, что они согласны между собой после того, как ограничения формализованы?

Что ж, есть один отличный способ сделать это: тесты JUnit, заполненные данными *.xlsx . Мы разрешаем им воссоздать небольшое подмножество решения в Excel / LibreOffice и разрешаем им решать, сколько ограничений соответствуют. Затем наши тесты JUnit проверяют, соответствуют ли наши реализации ограничений этим требованиям.

Традиционные юнит-тесты

В примере планирования конференций для проверки ограничения конфликта в комнате (жесткое наказание за пару разговоров в одной комнате в перекрывающихся временных интервалах) напишите:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Test
public void roomConflict() {
    TalkType talkType = new TalkType(0L, "type1");
    Talk talk1 = new Talk(1L)
            .withTalkType(talkType)
            .withSpeakerList(Collections.emptyList())
            .withRequiredRoomTagSet(Collections.emptySet())
            ...
    Talk talk2 = new Talk(2L)
            ...
    LocalDateTime start1 = LocalDateTime.of(2018, 1, 1, 9, 0);
    LocalDateTime end1 = LocalDateTime.of(2018, 1, 1, 10, 0);
    LocalDateTime start2 = LocalDateTime.of(2018, 1, 1, 9, 30);
    LocalDateTime end2 = LocalDateTime.of(2018, 1, 1, 10, 30);
    LocalDateTime start3 = LocalDateTime.of(2018, 1, 1, 10, 0);
    LocalDateTime end3 = LocalDateTime.of(2018, 1, 1, 11, 0);
    Timeslot slot1 = new Timeslot(1L)
            .withTalkTypeSet(Collections.singleton(talkType))
            .withStartDateTime(start1)
            .withEndDateTime(end1);
    Timeslot slot2 = new Timeslot(2L)
            ...
    Timeslot slot3 = new Timeslot(3L)
            ...
    Room room1 = new Room(1L)
            .withTalkTypeSet(Collections.singleton(talkType))
            .withUnavailableTimeslotSet(Collections.emptySet());
    ConferenceSolution solution = new ConferenceSolution(1L)
            .withTalkTypeList(Collections.singletonList(talkType))
            ...
    scoreVerifier.assertHardWeight(ROOM_CONFLICT, 0, solution);
    // Talks in same room without overlapping time slots
    talk1.withRoom(room1).withTimeslot(slot1);
    talk2.withRoom(room1).withTimeslot(slot3);
    scoreVerifier.assertHardWeight(ROOM_CONFLICT, 0, solution);
    // Talks in same room with overlapping time slots
    talk2.withTimeslot(slot2);
    scoreVerifier.assertHardWeight(ROOM_CONFLICT, -10, solution);
}

Чтобы проверить конфликт между комнатами, вам нужно инициализировать два разговора, три временных интервала и одну комнату. Однако предыдущий фрагмент кода слишком длинный для такого простого модульного теста, большая часть стандартного кода предназначена для инициализации обязательных полей для решения конференции, которое вам не нужно для модульного теста, и вы должны сделать это для каждого отдельного блока тест. Для более сложных ограничений становится слишком громоздким, чтобы писать традиционные модульные тесты и рассуждать о них.

Модульные тесты в файлах xlsx

Чтобы избежать инициализации нежелательных полей, вы можете воспользоваться ConferenceSchedulingXlsxFileIO, чтобы инициализировать их для вас, и записывать только то, что вы используете в этом тесте или в других тестах в той же электронной таблице.

Чтобы проверить конфликт между комнатами с помощью файла xlsx , создайте три временных интервала, два разговора и одну комнату:

Модульное тестирование

Модульное тестирование

Модульное тестирование

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

Модульное тестирование

Модульное тестирование

В каждом тестовом листе (синим цветом) укажите пакет ограничений, имя ограничения, описание текущего сценария тестирования и ожидаемый результат. Затем назначьте доклады комнатам и временным интервалам, чтобы легко их визуализировать. Обратите внимание, что вам не нужно перечислять все временные интервалы и комнаты, объявленные в листах временных интервалов и комнат.

Вывод

Вместо написания модульных тестов в коде бизнес-эксперты могут указать, как они хотят, чтобы ограничения соответствовали в файле Excel / LibreOffice. Затем разработчики реализуют ограничения для прохождения этих тестов. Это обеспечивает более эффективный способ связи между разработчиками и экспертами в предметной области.

Чтобы проверить правила оценки в файле xlsx :

  1. Перечислите все обязательные поля для ваших тестов в установочных листах.
  2. Для каждой проверки оценки создайте отдельный синий тестовый лист с пакетом ограничений, именем ограничения и ожидаемой оценкой.
  3. Перечислите только те поля, которые вы хотите использовать для соответствующего правила.
  4. Установите testFileName в ConferenceSchedulingScoreRulesXlsxTest и запустите тестовый файл.

Связанные материалы

Планирование Voxxed Days Zurich 2018 с OptaPlanner

Опубликовано на Java Code Geeks с разрешения Мусы Таллузи, партнера нашей программы JCG. См. Оригинальную статью здесь: ограничения модульного тестирования с бизнес-данными из Excel или LibreOffice

Мнения, высказанные участниками Java Code Geeks, являются их собственными.