利用Excel或LibreOffice的业务输入进行单元测试约束

业务专家向我们(开发人员)解释业务限制。 但是,如何确保我们正确理解它们呢? 或更糟糕的是,一旦约束条件正式化,我们如何测试他们之间是否同意?

好吧,有一种很棒的方法可以做到这一点:由*.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文件中的评分规则:

  1. 在设置表中列出测试的所有必填字段。
  2. 对于每个分数验证,请创建一个单独的蓝色测试表,其中包含约束包,约束名称和预期分数。
  3. 仅列出要用于相应规则的字段。
  4. ConferenceSchedulingScoreRulesXlsxTest中设置testFileName并运行测试文件。

相关资料

使用OptaPlanner安排苏黎世Voxxed Days 2018


翻译自: https://www.javacodegeeks.com/2018/08/unit-testing-constraints-business-input.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LibreOffice可以通过Python UNO API与Python进行交互,可以使用Python编写脚本来控制LibreOffice的各种功能,包括创建、读取和修改Excel文件。 下面是一个简单的Python脚本,可以使用LibreOffice的Python UNO API创建一个新的Excel文档,并向其中添加一些数据: ```python import uno import os # 启动LibreOffice localContext = uno.getComponentContext() resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext) context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context) # 创建一个新的Excel文档 calc = desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, ()) # 获取文档的第一个表格 sheets = calc.getSheets() sheet = sheets.getByIndex(0) # 向表格中添加一些数据 cell = sheet.getCellByPosition(0, 0) cell.setValue(1) cell = sheet.getCellByPosition(1, 0) cell.setValue(2) cell = sheet.getCellByPosition(2, 0) cell.setFormula("=sum(A1:B1)") # 保存文档 filename = os.path.join(os.getcwd(), "example.xlsx") calc.storeToURL("file://" + filename.replace("\\", "/"), ()) # 关闭文档 calc.close(True) ``` 这个脚本的作用是创建一个新的Excel文档,向其中添加一些数据,然后将其保存到指定的文件中。你可以根据自己的需求修改这个脚本,添加更多的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值