业务专家向我们(开发人员)解释业务限制。 但是,如何确保我们正确理解它们呢? 或更糟糕的是,一旦约束条件正式化,我们如何测试他们之间是否同意?
好吧,有一种很棒的方法可以做到这一点:由*.xlsx
数据填充的JUnit测试。 我们允许他们在Excel / LibreOffice中重新创建解决方案的一小部分,并让他们决定匹配多少个约束。 然后,我们的JUnit测试将检查我们的约束实现是否符合那些要求。
传统单元测试
在“ 会议安排”示例中 ,要测试会议室冲突约束(在重叠的时隙中,同一会议室中每对讲话对的硬性惩罚),请输入:
@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);
}
为了测试会议室冲突,您需要初始化两个对话,三个时隙和一个会议室。 但是,对于这样一个简单的单元测试,前面的代码片段太长了,大多数样板代码用于初始化会议解决方案的必需字段,而您不需要进行单元测试,因此必须对每个单元进行一次测试。 对于更复杂的约束,编写传统的单元测试及其原因变得太麻烦了。
为了避免初始化不需要的字段,您可以利用ConferenceSchedulingXlsxFileIO为您初始化它们,并仅在该测试或同一电子表格中的其他测试中编写您使用的内容。
要使用xlsx
文件测试会议室冲突,请创建三个时隙,两个对话和一个会议室:
初始化必填字段后,为每个约束的每次得分验证创建一个单独的表。 例如,以下两张纸检查房间冲突约束:
在每个测试表(蓝色)中,指定约束条件包,约束条件名称,当前测试方案的描述和预期分数。 然后将对话分配给房间和时隙以使其可视化。 请注意,您无需列出在“时隙和房间”工作表中声明的所有时隙和房间。
结论
与使用代码编写单元测试不同,业务专家可以指定他们希望如何在Excel / LibreOffice文件中匹配约束。 然后,开发人员实施约束以通过这些测试。 这提供了开发人员和领域专家之间更有效的通信方式。
要测试xlsx
文件中的评分规则:
- 在设置表中列出测试的所有必填字段。
- 对于每个分数验证,请创建一个单独的蓝色测试表,其中包含约束包,约束名称和预期分数。
- 仅列出要用于相应规则的字段。
- 在ConferenceSchedulingScoreRulesXlsxTest中设置testFileName并运行测试文件。
相关资料
使用OptaPlanner安排苏黎世Voxxed Days 2018
翻译自: https://www.javacodegeeks.com/2018/08/unit-testing-constraints-business-input.html