5.1 Drools约束评分测试

这是我参与更文挑战的第19天,活动详情查看: 更文挑战java

前情提示

至此咱们在前几天已经学习了三个实例的学习,相信你们对OptaPlanner有了一个更深的学习。你们会发现这几个例子咱们使用的都是Drools来编写约束和评分。在这几个例子的学习,你们会有一个疑问,咱们增长或者修改约束,如何测试约束是否生效了,匹配的状况如何?那么今天就来学习下基于Drools方式的约束测试内容。markdown

内容

基于Drools的约束条件有一个单元测试工具,要使用它,首先要添加optaplanner-test.jar,以利用JUnit集成的优点,并使用ScoreVerifier类来测试DRL中的分数规则(或一个约束匹配的增量分数计算器)。例如,咱们来看CloudBalance案例,测试这些分数规则:ide

global HardSoftScoreHolder scoreHolder;

rule "requiredCpuPowerTotal"
    when
        ...
    then
        scoreHolder.addHardConstraintMatch(...);
end

...

rule "computerCost"
    when
        ...
    then
        scoreHolder.addSoftConstraintMatch(...);
end
复制代码

实现

对于每一个评分规则,建立一个单独的@Test,只测试该评分规则对分数的影响。工具

CloudBalancingScoreConstraintTest.javapost

public class CloudBalancingScoreConstraintTest {

    private HardSoftScoreVerifier<CloudBalance> scoreVerifier = new HardSoftScoreVerifier<>(
            SolverFactory.createFromXmlResource(CloudBalancingApp.SOLVER_CONFIG));

    @Test
    public void requiredCpuPowerTotal() {
        ......
    }

    @Test
    public void requiredMemoryTotal() {
        ......

    @Test
    public void requiredNetworkBandwidthTotal() {
        ......
    }

    @Test
    public void computerCost() {
        CloudComputer c1 = new CloudComputer(1L, 1, 1, 1, 200);
        CloudComputer c2 = new CloudComputer(2L, 1, 1, 1, 30);
        CloudComputer c3 = new CloudComputer(3L, 1, 1, 1, 4);
        CloudProcess p1 = new CloudProcess(1L, 5, 5, 5);
        CloudProcess p2 = new CloudProcess(2L, 5, 5, 5);
        CloudProcess p3 = new CloudProcess(3L, 5, 5, 5);
        CloudBalance solution = new CloudBalance(0L,
                Arrays.asList(c1, c2, c3),
                Arrays.asList(p1, p2, p3));
        scoreVerifier.assertSoftWeight("computerCost", 0, solution);
        p1.setComputer(c1);
        p2.setComputer(c1);
        scoreVerifier.assertSoftWeight("computerCost", -200, solution);
        p3.setComputer(c3);
        scoreVerifier.assertSoftWeight("computerCost", -204, solution);
    }

}
复制代码

能够看到,若是咱们测试某一个规则,最好单独增长一个方法进行测试。单元测试

测试方法

咱们来看这一个约束测试:学习

@Test
    public void computerCost() {
        CloudComputer c1 = new CloudComputer(1L, 1, 1, 1, 200);
        CloudComputer c2 = new CloudComputer(2L, 1, 1, 1, 30);
        CloudComputer c3 = new CloudComputer(3L, 1, 1, 1, 4);
        CloudProcess p1 = new CloudProcess(1L, 5, 5, 5);
        CloudProcess p2 = new CloudProcess(2L, 5, 5, 5);
        CloudProcess p3 = new CloudProcess(3L, 5, 5, 5);
        CloudBalance solution = new CloudBalance(0L,
                Arrays.asList(c1, c2, c3),
                Arrays.asList(p1, p2, p3));
        scoreVerifier.assertSoftWeight("computerCost", 0, solution);
        p1.setComputer(c1);
        p2.setComputer(c1);
        scoreVerifier.assertSoftWeight("computerCost", -200, solution);
        p3.setComputer(c3);
        scoreVerifier.assertSoftWeight("computerCost", -204, solution);
    }
复制代码

测试步骤

首先咱们须要new一个Solution对象,CloudBalance案例中的Solution类为CloudBalance.java。而后进行数据初始化。测试

CloudProcess是一个PlanningEntity,其中的computer属性是PlanningVariable,咱们能够经过修改这个变量后,经过assertSoftWeight断言方法来测试结果是否符合咱们的预期。ui

步骤1:初始化Progress未分配Computer的,其成本为0;spa

步骤2:p1p2线程分配Computerc1的机器,其成本为-200元;

步骤3:p3线程分配Computerc3的机器,其成本为-204元;

咱们执行一下看看结果:

com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit5 org.optaplanner.examples.cloudbalancing.solver.CloudBalancingScoreConstraintTest,computerCost

Process finished with exit code 0
复制代码

此时咱们修改一行:

......
scoreVerifier.assertSoftWeight("computerCost", 0, solution);
p1.setComputer(c1);
p2.setComputer(c1);
scoreVerifier.assertSoftWeight("computerCost", 0, solution); // 200 -> 0
......
复制代码

此时咱们再来看结果:

org.opentest4j.AssertionFailedError: 
Expected :0
Actual   :-200
<Click to see difference>
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
	at org.junit.platform.launcher.core.DefaultLauncher$$Lambda$132/695682681.accept(Unknown Source)
	at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
	at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

复制代码

预期结果Expected与Actual结果不相符。

总结

经过这个例子,咱们学习了OptaPlanner如何测试Drools的约束规则,这对咱们来讲很是的重要,由于你不会指望着在生产环境测试,或者本地须要一套完整的求解数据才能开始测试。

结束语

下一篇章咱们来学习ConstraintStream的测试例子。

创做不易,禁止未受权的转载。若是个人文章对您有帮助,就请点赞/收藏/关注鼓励支持一下吧💕💕💕💕💕💕

相关文章
相关标签/搜索