写点什么

工具能帮助我们减少测试驱动开发的工作量吗?

  • 2008-01-30
  • 本文字数:1076 字

    阅读完需:约 4 分钟

随着像 Agitar One Parasoft’s JTest 这样高质量测试代码生成工具的出现,很多人开始质疑,是否还有必要手动编写测试代码? Bob(Martin)大叔深入剖析了这种想法的弱点,给了它重重一击。

这些工具是被设计用于检查已有代码块的,它将以分支、循环等为基础,综合生成一套针对代码的观测报告,开发者可以通过审查这些报告,选择为自己关心的部分 生成整套的测试用例。对于遗留代码,这种方式是了解已有行为的一种非常有效的方式,让开发者可以在进行改变之前,先创建一张安全网。

然而,任何技术都是有限制的:这些工具只是针对代码生成一套观察报告,它们并不能理解算法或是开发者的意图。下面是来自 Bob 的说明:

作为一个简单的示例,我试着使用两款知名的测试生成工具来为保龄球游戏程序生成测试代码。保龄球游戏的接口看上去是这样的:

public class BowlingGame {<br></br> public void roll(int pins) {...}<br></br> public int score() {...}<br></br> } 设计思想是:在每次投球后调用 roll 方法,在游戏结束后调用 score 方法得到本次游戏的得分。 显而易见,测试生成器并不能随机生成有效的游戏。一次有效的游戏应该是一个有 12 到 21 次投球的序列,每次投球得分应该在 0 到 10 之间,还有什么?那就是 在每一格内,投球的得分总数不能超过 10,对于处在目前阶段的随机生成器来说,要实现这些约束条件确实太困难了。

另一个方面,测试驱动开发(TDD)要求先写测试、再写产品代码的工作方法与众不同。TDD 能起到作用,那是因为它会对开发 人员编写的代码进行即时的反馈。在做出任何小修改后,只要运行测试,开发者就可以知道这些改变是否正确;TDD 确保了代码与我们通过测试代码表达的意图是 相匹配的;TDD 让我们以一个消费者、而不仅仅是创造者的角度来思考如何设计代码,它让我们针对每一个条件和回路进行思考;而且,就像 James Carr 提到的那样, TDD 迫使我们去考虑代码耦合的程度,看看 Bob 对此又是怎么说的:

使用测试生成器破坏了这个原则,因为生成器是以产品代码作为输入来生成测试的,而且因为它是全自动转换的,所以其生成的测试代码也不便于阅读。人类的意图 只是通过产品代码进行了体现,而无法通过阅读所生成的测试代码来获得验证,更无法通过它来确认产品代码是否已经实现了人类的意图。虽然人类会去检查自动生 成的报告,但相比 TTD 而言,这只是一个很被动的行为,远不及 TTD 对于缺陷、设计和意图体现上的洞察力。

……这并不是在说测试代码生成器没有用……我想它们有助于部分标识出大量遗留代码的特性。

查看英文原文 Can Tools Reduce the Effort Involved in Test Driven Development?

2008-01-30 05:501321
用户头像

发布了 90 篇内容, 共 17.1 次阅读, 收获喜欢 11 次。

关注

评论

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

JavaWeb核心之ServletContext

楠羽

Servlet 笔记 9月月更

2022-09-23:整数数组 stations 表示 水平数轴 上各个加油站的位置。给你一个整数 k 。 请你在数轴上增设 k 个加油站, 新增加油站可以位于 水平数轴 上的任意位置,而不必放在整数

福大大架构师每日一题

算法 rust 福大大

数据库系统是什么?它由哪几部分组成?

乌龟哥哥

9月月更

INFINI 产品更新啦 20220923

极限实验室

elasticsearch console Gateway infini 极限实验室

VUE v-bind 数据绑定

HoneyMoose

这些react面试题你会吗,反正我回答的不好

beifeng1996

前端 React

Struts实现登录

Struts2 9月月更

NFTScan 与 ET.XYZ 在 NFT API 数据层面进行深度合作

NFT Research

区块链 NFT web3

[SpringBoot]配置文件格式、yaml配置及读取

十八岁讨厌编程

Java 9月月更

TCP协议和UDP协议详细介绍

阿柠xn

TCP 计算机网络 协议族 UDP协议 9月月更

js高频手写题总结

helloworld1024fd

JavaScript 前端

Http轮询分为长查询和短查询总结

知识浅谈

HTTP 9月月更

跟我学Python图像处理丨带你掌握傅里叶变换原理及实现

华为云开发者联盟

Python 人工智能 企业号九月金秋榜

关于 Angular 应用 tsconfig.json 中的 lib 属性

汪子熙

typescript 前端开发 angular web开发 9月月更

SpringBoot初识

十八岁讨厌编程

Java 后端开发 9月月更

【云原生 | 从零开始学Kubernetes】五、Kubernetes核心技术Pod

泡泡

Docker 云计算 云原生 k8s 9月月更

【云原生 | 从零开始学Kubernetes】六、Pod的镜像拉取策略与各种机制

泡泡

Docker 云计算 云原生 k8s 9月月更

Docker多阶段构建实战(multi-stage builds)

程序员欣宸

Docker 9月月更

react20道高频面试题答案总结

beifeng1996

前端 React

大数据调度平台Airflow(七):Airflow分布式集群搭建原因及其他扩展

Lansonli

airflow 9月月更

物联网实践分享

彭发红

自动化测试神器playwright的安装及常见问题解决

迷彩

playwright 学习记录 9月月更

深度剖析Istio共享代理新模式Ambient Mesh

华为云开发者联盟

云计算 云原生 后端 企业号九月金秋榜

Serverless遇到 FinOps: Economical Serverless

华为云开发者联盟

云原生 后端 企业号九月金秋榜

开发者有话说|如何写出更加优雅的代码

闫同学

个人成长

前端面试经常被问的题目,自己总结了一下

loveX001

JavaScript 前端

19道高频vue面试题,顺便写一下自己的答案

bb_xiaxia1998

Vue 前端

js常见手写题总结

helloworld1024fd

JavaScript 前端

融云员工服务台,跟“干不完”说再见

融云 RongCloud

IT职场

Code For Better 谷歌开发者之声——Google Cloud谷歌云

Fire_Shield

云原生 Google Cloud 9月月更

[SpringBoot]多环境配置,配置文件分类

十八岁讨厌编程

Java 后端开发 9月月更

工具能帮助我们减少测试驱动开发的工作量吗?_研发效能_Mark Levison_InfoQ精选文章