测试驱动开发 Optaplanner

Test driven development Optaplanner

在 Optaplanner 库中,文件“CloudBalancingScoreConstraintTest.java”中有以下代码行:scoreVerifier.assertHardWeight(“requiredCpuPowerTotal”, -570, solution)。如何计算预期重量“-570”?这是在测试驱动开发方法中创建 类(CloudBalance.java、CloudComputer.java)之前或在创建 类?

之后已知的

TLDR:忽略 CloudBalancingScoreConstraintTest 并改为查看 CloudBalancingConstraintProviderTest

详细解释:

CloudBalancing 当前仍默认为 scoreDrl。它还具有 ConstrainStreams 的替代实现:CloudBalancingConstraintProviderConstraintStreams are in many ways better than scoreDRL,从 OptaPlanner 8.4.0 开始,速度同样快,并且与 DRL 具有 99% 的功能对等性。一旦达到 100%,所有示例将默认使用 ConstraintStreams。

那为什么是-570?因为 ScoreVerifier 检查所有约束。所以添加一个约束,你必须调整 all 你的测试。很痛苦。不是 TDD。

有什么解决方法? 使用ConstraintVerifier.ConstraintVerifier是ScoreVerifier++。 ConstraintVerifier 测试一个约束的matchWeight

`constraintWeight * matchWeight * (+1 for reward | -1 for penalize) = score impact`

它甚至忽略了约束的 constraintWeight,一旦业务利益相关者开始调整约束权重,这是一件幸事。此外,它的使用要简单得多(不需要解决方案实例)。有什么收获?它仅适用于 ConstraintStreams。

一个例子:

@Test
public void requiredCpuPowerTotal() {
    CloudComputer computer1 = new CloudComputer(1, 1, 1, 1, 2);
    CloudComputer computer2 = new CloudComputer(2, 2, 2, 2, 4);
    CloudProcess unassignedProcess = new CloudProcess(0, 1, 1, 1);
    // Total = 2, available = 1.
    CloudProcess process1 = new CloudProcess(1, 1, 1, 1);
    process1.setComputer(computer1);
    CloudProcess process2 = new CloudProcess(2, 1, 1, 1);
    process2.setComputer(computer1);
    // Total = 1, available = 2.
    CloudProcess process3 = new CloudProcess(3, 1, 1, 1);
    process3.setComputer(computer2);

    constraintVerifier.verifyThat(CloudBalancingConstraintProvider::requiredCpuPowerTotal)
            .given(unassignedProcess, process1, process2, process3)
            .penalizesBy(1); // Only the first computer.
}

要了解更多信息,watch Lukas's OptaPlanner Test driven development video.