java - 我应该测试算法的确切结果还是只测试结果的某些元素?

标签 java algorithm unit-testing graph

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

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

全路径测试:

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

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

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

这两种方法是否正确? 如果不是,您将如何测试该算法?

最佳答案

Is any of these two approaches correct?

可能吧。但是,如果不完全了解您的全部要求和上下文(例如您的搜索所依赖的类/数据结构),这很难说。

If no how would you test that algorithms?

我会遵循 TDD。

意思是:您首先开始编写测试。

准确地说:

  • 你写了一个简单的测试
  • 你确保测试失败
  • 然后您编写刚好“生产”代码,以便您的测试通过
  • 您可能会重构您的代码库(以提高其质量)
  • 回到第一步

换句话说:您在开发算法的同时逐渐从小型、简单的测试走向更高级的场景。

除此之外,您还可以从真正的“测试人员”角度来看待这个问题。意思是:你完全忽略了实现。相反,您查看问题以及生产代码应遵循的契约(Contract)。然后你尝试为所有重要案例寻找示例,最重要的是:边缘案例。您将它们写下来,然后针对您的实现运行它们。

(最像:你的两个测试用例太简单了,你还需要更多)

关于java - 我应该测试算法的确切结果还是只测试结果的某些元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58506820/

相关文章:

c++ - 大矩阵求逆方法

algorithm - 代表光的 RGB 颜色的加法混合

c++ - 在 O(n.logn) 中至少出现两次的最长子串

unit-testing - 在 Kotlin 中测试 CoroutineScope 基础设施

delphi - 如何/如果仅使用表单和数据模块重构 Delphi 程序

reactjs - 在 componentDidMount 中获取时如何测试 react 组件?

java - "correct"在 HSQLDB 2.0.0-rc8 中选择下一个序列值的方法

java - 找出 Eclipse 项目中引用的 jar 的所有冲突包/类

Java - 使用自定义对象增强 ArrayList 的 for 循环

java - 在jsp中显示pdf