Architecture 测试驱动开发是否从设计中获得了关注?

Architecture 测试驱动开发是否从设计中获得了关注?,architecture,tdd,agile,Architecture,Tdd,Agile,我对TDD有复杂的感觉。虽然我相信测试,但对于测试驱动我的开发工作的想法,我有一些问题 当您编写代码以满足为接口编写的一些测试以满足您现在的需求时,您可能会将重点从构建可维护的代码、从干净的设计和良好的体系结构转移 我在驾驶方面有问题,而不是在测试方面。有什么想法吗?这总是一种平衡: -过多的TDD会导致代码无法正常工作,但这是一种痛苦。 -太多的“可维护代码、干净的设计和完善的体系结构”最终会导致编码瘫痪 凡事要适度。不 如果做得正确,测试驱动开发就是您的设计工具 我希望您原谅我链接到的原因,

我对TDD有复杂的感觉。虽然我相信测试,但对于测试驱动我的开发工作的想法,我有一些问题

当您编写代码以满足为接口编写的一些测试以满足您现在的需求时,您可能会将重点从构建可维护的代码、从干净的设计和良好的体系结构转移

我在驾驶方面有问题,而不是在测试方面。有什么想法吗?

这总是一种平衡:
-过多的TDD会导致代码无法正常工作,但这是一种痛苦。
-太多的“可维护代码、干净的设计和完善的体系结构”最终会导致编码瘫痪

凡事要适度。

如果做得正确,测试驱动开发就是您的设计工具

我希望您原谅我链接到的原因,因为开发人员只将他们的测试视为测试

在以前的一个项目中,开发人员使用了一种极具破坏性的单例模式,这种模式在整个项目中强制实施依赖关系,当需求发生变化时,这种模式就破坏了整个项目:

TDD被视为一项任务 应该被当作一个 方法[……]

没有认识到这一点 TDD不是关于测试,而是 关于设计。猖獗的犯罪案件 单元测试中的单例滥用 这是显而易见的:而不是测试 认为“WTF”的作家是这些吗 singleton=value;语句在 “我的测试?”,测试作者刚刚 将单例传播到 测验。330次

不幸的结果是 生成服务器强制测试失败 不管付出什么代价,都能成功

正确的测试驱动开发应该使开发人员高度意识到设计陷阱,如紧耦合、违反DRY(不要重复自己)、违反SRP(单一责任原则)等

如果为了通过测试而编写通过测试的代码,那么您已经失败了:您应该将难以编写的测试视为路标,让您问:为什么这样做?为什么我不能在不依赖其他代码的情况下测试此代码?为什么我不能重用这个代码?为什么这个代码在单独使用时会被破坏


此外,如果您的设计是真正干净的,并且您的代码是真正可维护的,那么为什么为其编写测试并不简单呢?

完成软件有三个步骤:

  • 让它工作
  • 做对
  • 快点
  • 考试让你得到1分。您的代码并不是因为测试通过而完成的。在开始编写测试/代码之前,最好对项目结构有一些概念(实用程序、通常访问的对象、层、框架)。在编写代码以使测试通过之后,需要重新评估代码,以查看哪些部分可以重构到应用程序的不同方面。Yuo可以自信地做到这一点,因为您知道,只要您的测试仍然通过,您的代码仍然是功能性的(或者至少满足需求)


    在项目开始时,考虑一下结构。随着项目的进行,继续评估和重新评估您的代码,以保持设计到位,或者在设计不再有意义时更改设计。在进行估算时,必须考虑到所有这些项目,否则最终会得到spagetti代码,TDD与否。

    我完全同意pjz。没有一种正确的方法来设计软件。如果你把TDD带到了一个极端,除了下一个单元测试之外,你没有任何先见之明,你可能会让事情变得更困难。同样适用于那些花数月时间在图表和文档上而没有代码的大型软件项目的人


    适度。如果你想快速绘制一张图表,帮助你可视化代码的结构,那就去做吧。如果您需要两页,可能是时候开始编写一些代码了。如果您想在编写测试之前这样做,那又怎样呢。目标是工作、高质量的软件,而不是绝对符合任何特定的软件开发原则。做对你和你的团队有用的事情。找出可以改进的地方。迭代。

    我对TDD和单元测试比较陌生,但在我使用过的两个项目中,我发现它是设计助手,而不是设计的替代品。独立测试和验证组件/子组件的能力使我更容易进行快速更改和尝试新的设计思想

    我与TDD的不同之处在于可靠性。在设计过程开始时,而不是以后,在较小级别的组件上制定组件接口的过程是,我已经有了我可以信任的组件,可以更早地工作,因此我可以不再担心小部件,而是着手解决棘手的问题


    当我不可避免地需要回来维护这些小部件时,我可以花更少的时间来这样做,这样我就可以回到我想做的工作中去。

    在很大程度上,我同意TDD确实提供了一种设计工具。对我来说,这其中最重要的部分是,它构建了进行更多更改的能力(你知道,当你有了顿悟的瞬间,你可以通过删除代码来添加功能),从而大大降低了风险

    也就是说,我最近承包的一些算法工作在TDD下有点困难,没有仔细平衡设计思想。上面关于更安全的重构的陈述仍然是一个很大的好处,但是对于某些算法来说,TDD(尽管仍然有用)不足以让您找到理想的解决方案。以排序为例。TDD可以很容易地将您引导到次优(N^2)算法(以及允许您重构为快速排序的通过测试的SCAD),比如冒泡排序。TDD是一个工具,一个非常好的工具,但像许多东西一样,需要在上下文中适当地使用