InfoQ Geekathon 大模型技术应用创新大赛 了解详情
写点什么

在敏捷中应用测试驱动开发

  • 2018-09-26
  • 本文字数:1871 字

    阅读完需:约 6 分钟

在敏捷和 DevOps 领域,企业越来越关注持续集成和持续部署问题。他们更频繁地更新软件,给软件测试造成额外的时间压力。而测试驱动开发可以成为解决这个问题的一剂良方。

什么是测试驱动开发?

测试驱动开发(Test-Driven Development, TDD)是一种开发方法,即在开发阶段使用自动化测试。与传统的开发方法相比,一个很大的区别是 TDD 要求你在开发之前先编写测试

TDD 似乎只与软件测试有关,但这并不是它的最终目的。TDD 的目标是通过自动化的方式来演化系统,以满足所有的功能和非功能性需求。

经常会被提及的另一个术语是 KISS 原则。KISS 是“Keep It Simple, Stupid”或“Keep It Simple and Straightforward”的缩写。这个原则的核心思想是尽可能用最少的精力来解决给定的问题(或挑战)。

那么 TDD 看起来是怎样的?

要正确使用 TDD 方法,最好先搭建一个初始的软件架构。我说的不一定是宏伟的架构设计,但至少是一个粗略的架构。

当然,也要看你都做了哪些架构决策。在某些情况下,你不想编写单元测试,因为它会降低代码的质量,或者测试用例太过复杂。你可以改为编写自动化的场景或集成测试。关键是要对它们进行自动化。在以下步骤中,我假设它们是单元测试。

  1. 确定合理的测试用例 ;
  2. 确定测试条件 ;
  3. 编写一个骨架类(只有方法签名),让代码可以通过编译 ;
  4. 编写测试代码 ;
  5. 运行测试(它应该会失败);
  6. 花最少的工作量让测试用例可以运行 ;
  7. 运行自动化测试 ;
  8. 重构代码 ;
  9. 再次运行自动化测试,保证软件仍然可以正常运行 ;
  10. 重复,直到符合产品待办事项(用户故事)的验收标准。

第 1 步:确定合理的测试用例

第一步是确定要编写的第一个测试是什么,你需要考虑到依赖关系。首先,你要实现你所依赖的变更。

第 2 步:确定测试条件

一个单元测试由三部分组成:Arrange、Act 和 Assert。为了确保只实现所需的内容,你要知道方法的前置和后置条件。

比如有这样的一个用户故事:

作为用户,我只想安排没有冲突的预约,这样就不会让客户失望。

在这个用户故事中,用户只想要没有冲突的预约。有五种情况可能会让新的预约产生冲突。

  • 新预约的开始时间处于现有预约的时间范围内 ;

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

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

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

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

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

第 3 步:编写一个骨架类(只有方法签名),让代码可以通过编译

这一步并不是正式 TDD 的一个步骤,不过这样做可以给我们带来方便,因为后续我们就可以利用代码自动完成。

你将创建一个类(如果它是新的)和它的方法,但先不要实现任何功能代码。

第 4 步:编写测试代码

现在可以编写实际的测试代码了,可以遵循 Arrange、Act、Assert 这样的结构。

  1. Arrange:设置环境(如桩和测试数据),这样就可以断言你的测试方法。
  2. Act:调用方法!
  3. Assert:检查结果、桩等等。

第 5 步:运行测试(它应该会失败)

运行之前创建的测试,预期的结果是测试无法通过。如果它运行成功了,你必须回到第 4 步。

第 6 步:花最少的工作量让测试用例可以运行

接下来是代码时间!但是有一个问题,你必须用尽可能少的代码让测试运行通过。

对于第 2 步中的预约用户故事,还没有用于检查错误日期的测试,这就是为什么之前先不实现它。

第 7 步:运行所有的自动化测试

写完代码并通过测试后,就可以再次运行所有的自动化测试。新增加的代码不应该破坏已有的构建或导致其他测试失败。

如果出现其他测试失败,请务必做出修改,让所有测试可以再次通过。

第 8 步:重构代码

在运行完所有的自动化测试(全部通过)之后,可以开始对代码进行重构了。

这次应该把重心放在代码质量上。检查代码是否符合编码指南和规范,删除重复的代码,在不清晰的地方添加注释。另外,添加用于生成文档的注释。

还有一点不要忘了,看看当前的解决方案是否仍然是能够解决问题的最简单的解决方案。

第 9 步:再次运行自动化测试,保证软件仍然可以正常运行

再次运行所有测试,确保在重构代码后所有测试仍然可以通过。

如果在代码重构后有测试失败,就要做出必要梗概,再次让所有测试都通过。

第 10 步:重复,直到符合待办事项(用户故事)的验收标准

在前面的步骤中,你可能一次实现了一个或多个方法。在这一步,你需要验证是否满足产品待办事项或用户故事所指定的验收标准。

如果符合验收标准,那么你的任务就完成了。如果没有,请从头开始重复所有步骤。

查看英文原文: https://myhomebase.nl/2018/09/test-driven-development-in-an-agile-world/

感谢张婵对本文的审校。

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2018-09-26 05:181177
用户头像

发布了 731 篇内容, 共 422.0 次阅读, 收获喜欢 1988 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

基于OpenHarmony的ArkUI框架进阶对于高性能容器类和持久化和原子化的运用

恒山其若陋兮

前端 11月月更

手写一个react,看透react运行机制

goClient1992

React

react的useState源码分析

flyzz177

React

如何给 Fiori Elements 应用添加自定义按钮

Jerry Wang

前端开发 web开发 Fiori SAP UI5 11月月更

Zebec开启多链布局,流支付生态持续扩张

EOSdreamer111

使用keytool生成Tomcat证书

源字节1号

看完这篇SpringBoot让我在阿里成功涨薪40%,感谢

钟奕礼

Java java程序员 java面试 java编程

软件测试之 Contract Testing

QE_LAB

契约测试 测试技术

Kafka SASL 用户认证机制

spacerrobot

kafka 认证授权 SASL SCRAM JAAS

如何用科学的方法“撞大运”? | 学点运气

赵新龙

CTO 创新 与运气竞争

【web 开发基础】PHP 中的默认(缺省)参数的函数 (33)

迷彩

缺省参数 函数 web开发基础 11月月更 默认参数

《算法》世界一

初学者

算法 网络 11月月更

《算法》世界二

初学者

算法 网络 11月月更

HarmonyOS 3重磅版本更新,Mate Xs 2等更多设备支持超级中转站!

Geek_2d6073

react源码分析:深度理解React.Context

flyzz177

React

算法基础:单链表图解及模板总结

timerring

算法 11月月更 单链表

创云融达基于 Curve 块存储的智慧税务场景实践

网易数帆

开源 分布式存储 Ceph curve

对于基于鸿蒙系统的应用支持多语言Arkui框架的线性容器类和PieChart的研究实战

恒山其若陋兮

前端 11月月更

微信小程序开发在全局配置和资源加载优化在获取接口上的节点信息实战

恒山其若陋兮

前端 11月月更

2022年第三季度泛出行行业洞察:泛出行行业正在经历数智化升级的关键时期,用户规模保持平稳增长,行业整体良性发展

易观分析

数智化 泛出行

K8S环境的Jenkin性能问题处理续篇(任务Pod设置)

程序员欣宸

Kubernetes jenkins 11月月更

自动化测试成熟度模型

老张

DevOps 自动化测试

Java对象拷贝原理剖析及最佳实践

京东科技开发者

Java Apache 编程 对象拷贝 srping

MASA Framework 事件总线 - 进程内事件总线

MASA技术团队

Framework MASA Framewrok MASA

Zebec流支付生态,开启多链布局的“两手准备”

股市老人

C++---类型萃取---std::remove_cv/std::remove_cv

桑榆

C++ STL 11月月更

带你实现react源码的核心功能

goClient1992

React

react源码分析:组件的创建和更新

flyzz177

React

【个人成长】《代码的艺术》视频分享合集

非晓为骁

职业规划 开发 软件工程能力 代码的艺术

深入React源码揭开渲染更新流程的面纱

goClient1992

React

一个漏测Bug能让你想到多少?

得物技术

测试 测试框架 bug修复 漏洞检测 测试技术

  • 扫码添加小助手
    领取最新资料包
在敏捷中应用测试驱动开发_研发效能_Johan Moens_InfoQ精选文章