业务专家向我们(开发人员)解释业务限制。 但是,如何确保我们正确理解它们呢? 或更糟糕的是,一旦约束条件正式化,我们如何测试他们之间是否同意?
好吧,有一种很棒的方法可以做到这一点:由*.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 slotstalk1.withRoom(room1).withTimeslot(slot1);talk2.withRoom(room1).withTimeslot(slot3);scoreVerifier.assertHardWeight(ROOM_CONFLICT, 0, solution);// Talks in same room with overlapping time slotstalk2.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