虽然我全都在进行单元测试,但有时我想知道这种形式的测试优先开发是否真的有益……
像这样的小型,琐碎的测试可以成为您代码库中的“煤矿中的金丝雀”,在为时已晚之前警告危险。琐碎的测试对保持环境有用,因为它们可以帮助您正确进行交互。
例如,考虑进行一个琐碎的测试以探究如何使用您不熟悉的API。如果该测试与您使用“真实的” API的代码中的操作相关,那么保持该测试很有用。当API发布新版本时,您需要升级。现在,您对如何以一种可执行的格式记录该API的行为做出了假设,该格式可以用来捕获回归。
... [在实际过程中,您的代码(业务请求,需求文档,体系结构文档)上方有3-4层,其中实际定义的业务规则(折扣价为价格-折扣)可能会错误定义。如果是这种情况,您的单元测试对您没有任何意义。
如果您已经编写了多年代码,而没有编写测试,那么对于您来说可能没有立即意识到是否有任何价值。但是,如果您的心态是最好的工作方式是“过早发布,经常发布”或“敏捷”,因为您想要快速/连续部署的能力,那么您的测试肯定会有所帮助。做到这一点的唯一方法是通过测试使对代码所做的每项更改合法化。无论测试多么小,一旦有了绿色的测试套件,理论上就可以部署了。另请参见“连续生产”和“永久Beta版”。
您也不必“先测试”就可以拥有这种思维方式,但这通常是到达那里的最有效方法。当您执行TDD时,您将自己锁定在两到三分钟的红色绿色重构周期中。您绝对不会停下来离开,手上完全混乱,这将花费一个小时来调试并重新组装。
此外,单元测试是另一个失败点。
成功的测试是表明系统故障的测试。测试失败会警告您测试逻辑或系统逻辑中的错误。测试的目的是破坏代码或证明一种方案可行。
如果要在代码后编写测试,则冒编写“不良”测试的风险,因为要确保测试真正有效,您需要同时查看其是否损坏和正常工作。当您在代码之后编写测试时,这意味着您必须“跳出陷阱”并将错误引入代码中才能看到测试失败。大多数开发人员不仅对此感到不安,而且会认为这是浪费时间。
我们在这里能获得什么?
用这种方式做事绝对有好处。Michael Feathers将“旧版代码”定义为“未经测试的代码”。采用这种方法时,您会将对代码库进行的每项更改合法化。它比不使用测试更加严格,但是在维护大型代码库时,它是值得的。
说到“羽毛”,您应该参考以下两项重要资源:
这两篇文章都说明了如何将这些类型的实践和学科应用到非“绿地”项目中。它们提供了用于围绕紧密耦合的组件,硬连线的依赖项以及您不必控制的事物编写测试的技术。这全都在于寻找“接缝”并围绕这些接缝进行测试。
[i]如果折扣价格错误,测试团队仍会发现问题,单元测试如何节省工作?
这些习惯就像一种投资。退货不是立即的;他们会随着时间的流逝而积累。不进行测试的替代方法实质上是承担着无法捕捉回归,无法担心集成错误而引入代码或驱动设计决策的负担。这样做的好处是您可以合法化代码库中引入的所有更改。
我在这里想念什么?请教我爱TDD,因为到目前为止我很难接受它。我也想要,因为我想保持进步,但这对我来说毫无意义。
我将其视为专业责任。努力奋斗是理想的。但是很难遵循且乏味。如果您关心它,并且感觉到您不应该生成未经测试的代码,那么您将能够找到学习良好测试习惯的意愿。我现在(和其他人一样)经常做的一件事是自己一个小时的时间来编写代码,根本不做任何测试,然后有纪律将其丢弃。这可能看起来很浪费,但实际上并非如此。锻炼并不会花费公司实际的材料。它帮助我理解了问题以及如何以更高的质量和可测试的方式编写代码。
我的建议最终是,如果您真的不希望擅长于此,那就根本不要这样做。未维护,性能不佳等不良测试可能比没有任何测试更糟糕。很难独自学习,并且您可能不会喜欢它,但是如果您不想这样做或无法看到足够的价值来学习,它将几乎是不可能的。保证时间投入。
一直有人提到测试有助于实施规范。根据我的经验,该规范也经常是错误的...
开发人员的键盘是橡胶与道路相交的地方。如果规范是错误的,并且您没有在其上升旗,那么您很有可能会为此受到指责。或者至少您的代码会。很难遵守测试的纪律性和严格性。这一点都不容易。它需要练习,大量学习和很多错误。但是最终它确实会得到回报。在一个快节奏,快速变化的项目中,这是您晚上入睡的唯一方法,无论它是否会使您减速。
这里要考虑的另一件事是,过去已证明与测试基本相同的技术可以工作:“无尘室”和“按合同设计”都倾向于产生相同类型的“元”代码构造,测试可以执行,并在不同的地方执行。这些技术都不是灵丹妙药,严格的定价最终会使您付出代价,无法按时将产品推向市场。但这不是问题所在。这是关于保持所做的事情的能力。这对于大多数项目而言非常重要。