测试驱动开发(TDD)

什么是测试驱动开发(TDD)?

大__8282043567 测试驱动开发是依赖于非常短的开发周期的重复的过程。 它基于极限编程(XP)的“测试优先”概念,该概念鼓励高度自信地进行简单设计。

执行TDD的过程如下:

  1. 编写测试
  2. 运行所有测试
  3. 编写实现代码
  4. 运行所有测试
  5. 重构

此过程通常称为“红绿重构”。

在编写测试时,我们处于红色状态。 由于测试是在实际实现之前编写的,因此应该会失败。 如果不是,则测试是错误的。 它描述了已经存在或写错的东西。 编写测试时呈绿色表示错误肯定。 应该删除或重构这样的测试。

接下来是绿色状态。 当最后一个测试的实施完成时,所有测试都应通过。 如果不正确,则实现是错误的,应予以纠正。

这个想法不是使实现最终完成,而是提供足够的代码供测试通过。 一旦一切变为绿色,我们就可以继续重构现有代码。 这意味着我们在不引入新功能的情况下使代码更优化。 重构到位后,所有测试都应该一直通过。 如果其中之一失败,则重构会破坏现有功能。 重构不应包括新测试。

速度是关键

large_5836417589
我倾向于将TDD视为乒乓球(或乒乓球)游戏。 游戏非常快。 TDD也是如此。 我倾向于在表的两边(测试和实现)花费不超过一分钟。 编写一个简短的测试并运行(ping),编写实现并运行所有测试(pong),编写另一个测试(ping),编写该测试的实现(pong),重构并确认所有测试均通过(得分),重复。 乒乓,乒乓,乒乓,乒乓,乒乓,比分,再次发球。 不要尝试编写完美的代码。 相反,尝试使球保持滚动状态,直到您认为是时候得分(重构)为止。

与测试无关

TDD中的T通常被误解。 TDD是我们进行设计的方式。 这是迫使我们在编写代码之前考虑实现的方法。 这是更好地构造代码的方式。 这并不意味着使用TDD进行的测试是没有用的。 远非如此。 它们非常有用,可以使我们快速发展,而不必担心会被破坏。 进行重构时尤其如此。 能够重新组织代码,同时确信不会破坏任何功能,这极大地提高了代码的质量。

TDD的主要目标是将代码设计与测试一起用作非常有用的副产品。

嘲笑

为了使测试快速运行从而提供持续的反馈,需要以一种可以轻松模拟和存根方法,函数和类的方式来组织代码。 执行速度会严重影响它,例如,我们的测试需要与数据库进行通信。 通过模拟外部依赖关系,我们可以大大提高该速度。 整个单元测试套件的执行应以分钟为单位,而不是秒。 比速度更重要的是,以一种易于模拟和存根的方式设计代码,这迫使我们通过应用关注点分离来更好地构造代码。 无论有无模拟,代码的编写方式都应使我们能够例如轻松地将一个数据库替换为另一个数据库。 该“另一个”可以是例如模拟数据库或内存数据库。

可在Scala测试驱动开发(TDD):使用Specs2和Mockito进行单元测试文件操作中找到Scala中的模拟示例 。 如果您选择的编程语言不是Scala,那么文章对查看适用于任何语言的模式仍然非常有用。

观察者

观察者是使用TDD方式工作时非常有用的工具。 它们是在我们开始工作之前就已执行的框架或工具,它们正在监视代码中的任何更改。 当检测到这种变化时,将运行所有测试。 对于JavaScript,几乎所有的构建系统和任务运行器都允许这样做。 Gulp (我最喜欢的)和Grunt是许多示例中的两个。 Scala有sbt-左轮手枪 (还有其他)。 大多数其他编程语言都有类似的工具,可以在代码更改时重新编译(如果需要)并运行所有(或受影响的)测试。 我总是最终将屏幕分成两个窗口。 一个使用我正在处理的代码,另一个使用不断执行的测试结果。 我要做的就是注意那些观察者的输出与我所处的阶段(红色或绿色)相对应。

文献资料

TDD(以及结构良好的测试)的另一个非常有用的副作用是文档。 在大多数情况下,通过查看测试来查找代码的作用比实现本身要容易得多。 其他类型的文档无法提供的其他好处是,测试永远不会过时。 如果测试与实现代码之间存在差异,则测试将失败。 测试失败意味着文档不正确。

作为文档的测试文章在使用测试而不是传统文档的背后提供了更深层的理由。

摘要

以我的经验,TDD可能是我们软件工具箱中最重要的工具。 精通TDD需要花费大量时间和耐心,但是一旦掌握了该技术,生产率和质量就会急剧提高。 学习和实践TDD的最佳方法是与结对编程相结合。 就像在需要两个参与者的乒乓球游戏中一样,TDD可以成对出现,其中一个编码员编写测试,而另一个由程序员编写这些测试的实现。 角色可以在每次测试后进行切换(就像在编写dojos中所做的那样)。

尝试一下,在遇到障碍时不要放弃,因为会有很多。

测试驱动开发(TDD):使用Java示例的最佳实践是一个很好的起点。 即使它使用Java示例,也可以将相同(即使不是全部)的实践应用于任何编程语言。 对于Java中的示例(与以前的示例一样,它很容易适用于其他语言),请查看TDD示例演练文章。

完善TDD技能的另一种好方法是代码katas(此站点上有很多)。

您在TDD方面的经验是什么? 团队练习的形式多样,我想听听您的经验。

翻译自: https://www.javacodegeeks.com/2014/10/test-driven-development-tdd.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值