gpt4 book ai didi

language-agnostic - 使用 TDD 开发接口(interface)

转载 作者:行者123 更新时间:2023-12-04 23:11:20 25 4
gpt4 key购买 nike

我是 TDD 的忠实拥护者,并且这些天在我的绝大多数开发中都使用它。但是,我经常遇到的一种情况,并且从未找到我认为是“好的”答案的情况,类似于以下(人为的)示例。

假设我有一个像这样的接口(interface)(用 Java 编写,但实际上,这适用于任何 OO 语言):

public interface PathFinder {
GraphNode[] getShortestPath(GraphNode start, GraphNode goal);

int getShortestPathLength(GraphNode start, GraphNode goal);
}

现在,假设我想创建这个接口(interface)的三个实现。我们就叫他们 DijkstraPathFinder , DepthFirstPathFinder , 和 AStarPathFinder .

问题是,如何使用 TDD 开发这三个实现?它们的公共(public)接口(interface)将是相同的,并且大概我会为每个接口(interface)编写相同的测试,因为 getShortestPath() 和 getShortestPathLength() 的结果在所有三个实现中应该是一致的。

我的选择似乎是:
  • 针对 PathFinder 编写一组测试当我编写第一个实现时。然后“盲目”编写其他两个实现,并确保它们通过 PathFinder测试。这似乎不对,因为我没有使用 TDD 来开发后两个实现类。
  • 以测试优先的方式开发每个实现类。这似乎不对,因为我将为每个类(class)编写相同的测试。
  • 结合上述两种技术;现在我有一组针对接口(interface)的测试和一组针对每个实现类的测试,这很好,但是测试都是一样的,这不好。

  • 这似乎是一种相当普遍的情况,尤其是在实现策略模式时,当然实现之间的差异可能不仅仅是时间复杂度。其他人如何处理这种情况?是否有针对我不知道的接口(interface)进行测试优先开发的模式?

    最佳答案

    您编写接口(interface)测试来运行接口(interface),并为实际实现编写更详细的测试。 Interface-based design谈到了一个事实,即您的单元测试应该为该接口(interface)形成一种“契约(Contract)”规范。也许当 Spec# 出来时,会有一种语言支持的方式来做到这一点。

    在这种特殊情况下,这是一个严格的策略实现,接口(interface)测试就足够了。在其他情况下,接口(interface)是实现功能的子集,您将对接口(interface)和实现进行测试。例如,考虑一个实现 3 个接口(interface)的类。

    编辑:这很有用,因此当您添加接口(interface)的另一个实现时,您已经有测试来验证该类是否正确实现了接口(interface)的契约。这可以适用于像 ISortingStrategy 这样特定的东西,也适用于像 IDisposable 这样广泛的东西。

    关于language-agnostic - 使用 TDD 开发接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/544472/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com