测试驱动开发 Optaplanner
Test driven development Optaplanner
在 Optaplanner 库中,文件“CloudBalancingScoreConstraintTest.java”中有以下代码行:scoreVerifier.assertHardWeight(“requiredCpuPowerTotal”, -570, solution)。如何计算预期重量“-570”?这是在测试驱动开发方法中创建 类(CloudBalance.java、CloudComputer.java)之前或在创建 类?
之后已知的
TLDR:忽略 CloudBalancingScoreConstraintTest
并改为查看 CloudBalancingConstraintProviderTest
。
详细解释:
CloudBalancing 当前仍默认为 scoreDrl
。它还具有 ConstrainStreams 的替代实现:CloudBalancingConstraintProvider
。 ConstraintStreams 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.
在 Optaplanner 库中,文件“CloudBalancingScoreConstraintTest.java”中有以下代码行:scoreVerifier.assertHardWeight(“requiredCpuPowerTotal”, -570, solution)。如何计算预期重量“-570”?这是在测试驱动开发方法中创建 类(CloudBalance.java、CloudComputer.java)之前或在创建 类?
之后已知的TLDR:忽略 CloudBalancingScoreConstraintTest
并改为查看 CloudBalancingConstraintProviderTest
。
详细解释:
CloudBalancing 当前仍默认为 scoreDrl
。它还具有 ConstrainStreams 的替代实现:CloudBalancingConstraintProvider
。 ConstraintStreams 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.