【问题标题】:Testing Unit's Efficiency in TDD测试单元在 TDD 中的效率
【发布时间】:2019-08-26 03:44:06
【问题描述】:

假设我们需要一个排序函数并希望确保它在O(nlogn) 而不是O(n^2) 中实现。

使用测试驱动开发,有没有系统的方法来测试这个功能的执行效率?

根据Wikipedia测试实现细节被认为是测试驱动开发中的反模式,这是否会阻止 TDD 尝试检查满足需求的代码的效率?或者有系统的方法吗?

【问题讨论】:

    标签: python unit-testing testing tdd


    【解决方案1】:

    您可以使用 test-after 代替 TDD:

    • 注入测量操作次数的计数器
    • 针对给定输入运行算法
    • 确认计数小于阈值

    这将防止操作数量的倒退。 (请记住,这并不能保证实际性能。)

    【讨论】:

      【解决方案2】:

      这并不是 TDD 的真正优势——请记住,TDD 的动机不是测试(尽管这是一个很好的副作用),而是 设计,也就是说代码易于更改。

      TDD 仪式的一部分是在开发周期中频繁运行测试;分散开发流程的测试(例如,通过花费很长时间运行)是超出范围的。这并不是说您不能进行这些测试。支持 TDD 的理由之一是它确保您拥有可测试的代码。但是您通常不会期望在红色/绿色/回收仪式期间运行需要大量挂钟时间的测试。

      此外,当实现不稳定时,与实现紧密耦合的测试是真正的拖累。当测试干扰更改代码中的封装设计时,您就会失去可信度。

      有时,您可以引入可观察性要求,这样您就可以从系统外部计算调用关键部分的频率。只要系统正在使用该关键部分,那么也许您可以使用计数作为证据,并估计实施是否按您期望的方式扩展。

      在排序的情况下,这可能意味着比较函数是可配置依赖项的设计,并且在测试中我们提供了一个计算它被调用频率的实现。

      但这确实引入了一些耦合——此时您要衡量的是您的方法是否被调用,不是测试对象是否产生正确的答案。在某些情况下,这很好。在其他情况下,这是过度耦合。我不知道有什么简单的启发式方法可以用来区分这两种情况,而无需尝试实验并在发生过度耦合时被烧毁。

      【讨论】:

        猜你喜欢
        • 2011-03-14
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多