我应该测试算法的精确结果还是仅测试结果的某些元素?

问题描述 投票:0回答:1

我已经写了一个BFS算法,我想测试该算法。

我用两种方法编写了测试,因为我意识到,例如,存储相邻顶点的方式可能会发生变化,顺序将有所不同,因此结果将有所不同,但不一定是不正确的。

完整路径测试:

@Test
void traverse_UndirectedGraph_CommonTraverse() {
    BreathFirstSearch<String> breathFirstSearch = new BreathFirstSearch<>(undirectedGraph);
    assertIterableEquals(Lists.newArrayList("A", "B", "E"), breathFirstSearch.traverse("A", "E"));
}

测试路径是否包含初始顶点和终端顶点:

@Test
void traverse_UndirectedGraph_CommonTraverse() {
    BreathFirstSearch<String> breathFirstSearch = new BreathFirstSearch<>(undirectedGraph);
    List<String> path = breathFirstSearch.traverse("A", "E");
    assertEquals("A", path.get(0));
    assertEquals("E", path.get(path.size() - 1));
}

这两种方法中的任何一种正确吗?如果没有,您将如何测试该算法?

java algorithm unit-testing graph
1个回答
0
投票

这两种方法中的任何一种正确吗?

可能但这很难说[[hard,例如您的搜索所依赖的类/数据结构。

如果没有,您将如何测试该算法?

我会遵循TDD。

含义:从编写测试

第一

开始。准确地说:

    您编写一个简单的测试
  • 您确保测试失败
  • 然后您编写
  • just just
  • “生产”代码,以便测试通过您可能重构代码库(以提高其质量)
  • 返回步骤1
  • 换句话说:您在逐步从小型,简单的测试过渡到更高级的场景的同时开发了算法。

除此之外,您还可以从真正的“测试者”角度看待这个问题。含义:您

totally

忽略实现。相反,您要查看问题以及生产代码应遵循的contract。然后,您尝试查找所有重要案例的示例,最重要的是:边缘案例。您将它们写下来,然后针对您的实现运行它们。 (最像:您的两个测试用例太简单了,您将需要更多)
© www.soinside.com 2019 - 2024. All rights reserved.