查看: 424|回复: 14

[转载] 在敏捷中应用测试驱动开发

[复制链接]
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-9 16:31 | 显示全部楼层 |阅读模式
在敏捷和DevOps领域,企业越来越关注持续集成和持续部署问题。他们更频繁地更新软件,给软件测试造成额外的时间压力。而测试驱动开发可以成为解决这个问题的一剂良方。
什么是测试驱动开发?
测试驱动开发(Test-Driven Development, TDD)是一种开发方法,即在开发阶段使用自动化测试。与传统的开发方法相比,一个很大的区别是TDD要求你在开发之前先编写测试。
TDD似乎只与软件测试有关,但这并不是它的最终目的。TDD的目标是通过自动化的方式来演化系统,以满足所有的功能和非功能性需求。
经常会被提及的另一个术语是KISS原则。KISS是“Keep It Simple, Stupid”或“Keep It Simple and Straightforward”的缩写。这个原则的核心思想是尽可能用最少的精力来解决给定的问题(或挑战)。

认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-9 16:32 | 显示全部楼层
那么TDD看起来是怎样的?
要正确使用TDD方法,最好先搭建一个初始的软件架构。我说的不一定是宏伟的架构设计,但至少是一个粗略的架构。
当然,也要看你都做了哪些架构决策。在某些情况下,你不想编写单元测试,因为它会降低代码的质量,或者测试用例太过复杂。你可以改为编写自动化的场景或集成测试。关键是要对它们进行自动化。在以下步骤中,我假设它们是单元测试。
  • 确定合理的测试用例;
  • 确定测试条件;
  • 编写一个骨架类(只有方法签名),让代码可以通过编译;
  • 编写测试代码;
  • 运行测试(它应该会失败);
  • 花最少的工作量让测试用例可以运行;
  • 运行自动化测试;
  • 重构代码;
  • 再次运行自动化测试,保证软件仍然可以正常运行;
  • 重复,直到符合产品待办事项(用户故事)的验收标准。


使用道具 举报

回复
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-9 16:32 | 显示全部楼层
第1步:确定合理的测试用例
第一步是确定要编写的第一个测试是什么,你需要考虑到依赖关系。首先,你要实现你所依赖的变更。

使用道具 举报

回复
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-9 16:33 | 显示全部楼层
第2步:确定测试条件
一个单元测试由三部分组成:Arrange、Act和Assert。为了确保只实现所需的内容,你要知道方法的前置和后置条件。
比如有这样的一个用户故事:
作为用户,我只想安排没有冲突的预约,这样就不会让客户失望。
在这个用户故事中,用户只想要没有冲突的预约。有五种情况可能会让新的预约产生冲突。
  • 新预约的开始时间处于现有预约的时间范围内;

  • 新预约的结束时间处于现有预约的时间范围内;

  • 现有预约的开始和结束时间段处于新预约的开始和结束时间段内;

  • 新预约的开始和结束时间段处于现有预约的开始和结束时间段内;

  • 新预约的开始和结束时间与现有预约完全一样。

在进行单元测试期时,你检查所有这些条件,以及方法的预期结果。

使用道具 举报

回复
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-9 16:34 | 显示全部楼层
第3步:编写一个骨架类(只有方法签名),让代码可以通过编译
这一步并不是正式TDD的一个步骤,不过这样做可以给我们带来方便,因为后续我们就可以利用代码自动完成。
你将创建一个类(如果它是新的)和它的方法,但先不要实现任何功能代码。

使用道具 举报

回复
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-10 09:42 | 显示全部楼层
第4步:编写测试代码
现在可以编写实际的测试代码了,可以遵循Arrange、Act、Assert这样的结构。
  • Arrange:设置环境(如桩和测试数据),这样就可以断言你的测试方法。
  • Act:调用方法!
  • Assert:检查结果、桩等等。


使用道具 举报

回复
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-10 09:43 | 显示全部楼层
第5步:运行测试(它应该会失败)
运行之前创建的测试,预期的结果是测试无法通过。如果它运行成功了,你必须回到第4步。

使用道具 举报

回复
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-10 09:43 | 显示全部楼层
第6步:花最少的工作量让测试用例可以运行
接下来是代码时间!但是有一个问题,你必须用尽可能少的代码让测试运行通过。
对于第2步中的预约用户故事,还没有用于检查错误日期的测试,这就是为什么之前先不实现它。

使用道具 举报

回复
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-10 09:43 | 显示全部楼层
第7步:运行所有的自动化测试
写完代码并通过测试后,就可以再次运行所有的自动化测试。新增加的代码不应该破坏已有的构建或导致其他测试失败。
如果出现其他测试失败,请务必做出修改,让所有测试可以再次通过。

使用道具 举报

回复
认证徽章
论坛徽章:
1053
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
发表于 2018-10-10 09:43 | 显示全部楼层
第8步:重构代码
在运行完所有的自动化测试(全部通过)之后,可以开始对代码进行重构了。
这次应该把重心放在代码质量上。检查代码是否符合编码指南和规范,删除重复的代码,在不清晰的地方添加注释。另外,添加用于生成文档的注释。
还有一点不要忘了,看看当前的解决方案是否仍然是能够解决问题的最简单的解决方案。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表