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的測試例子。

創做不易,禁止未受權的轉載。若是個人文章對您有幫助,就請點贊/收藏/關注鼓勵支持一下吧💕💕💕💕💕💕

相關文章
相關標籤/搜索