最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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

  • 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:50816
用户头像

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

关注

评论

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

跟着我乔鲁诺学面试(大误)

姬翔

9月日更

被腾讯问蒙的各种Redis复杂问题

hanaper

推荐一个Mac端的截图工具

IT蜗壳-Tango

9月日更

从特岗教师的需求金字塔,重新理解乡村、教育和科技

脑极体

链路压测中如何记录每一个耗时的请求

FunTester

性能测试 接口测试 测试框架 FunTester 链路压测

Vue进阶(幺幺幺):实现浏览器全屏

No Silver Bullet

Vue 9月日更

如何利用极狐GitLab CI/CD 完成 Jenkins 的迁移

极狐GitLab

CI/CD #GitLab

低代码在这些方面充满优势

低代码小观

程序员 低代码 企业管理 开发平台 低代码开发

微前端拆分实践

Teobler

大前端 服务拆分

【Vuex 源码学习】第二篇 - vuex 插件安装 install 逻辑

Brave

源码 vuex 9月日更

☕【JVM 技术指南】「理论总结笔记」Java 虚拟机垃圾回收认知和调优的"思南(司南)"【下部】

洛神灬殇

ZGC JVM G1垃圾回收器 9月日更

阿里菜鸟+腾讯IEG面经(阿里5面,腾讯8面)无限秽土转生

Java 程序员 架构 面试 计算机

使用PaddleNLP打造精准文献检索系统,看万方系统升级放大招!

百度大脑

人工智能 nlp 飞桨

Flutter 多引擎支持 PlatformView 以及线程合并解决方案

字节跳动终端技术

字节跳动 大前端 跨平台 火山引擎

百分点认知智能实验室:智能校对的技术原理和实践

百分点科技技术团队

关于技术团队搭建&管理的一些思考

LigaAI

团队管理

区块链将帮助监管科技突破壁垒,刺激金融市场的监管活力

CECBC

算法裁员,释放出了哪些“恶之花”?

脑极体

多租户的共享与隔离

金蝶天燕云

云计算 多租户

内网渗透攻击技术的利用

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

架构实战训练营|作业|模块3

Frode

架构实战

爬虫初探: 重定向处理与新闻明细页解析

程序员架构进阶

Python 实战问题 9月日更 spider

挑战进阶教程,和MindSpore更近一步!

Geek_6cdeb6

mindspore

JS完美收官之——闭包

法医

9月日更

学生管理系统详细设计

缘分呐

设计 学生管理系统架构

Python——Map-Reduce

在即

9月日更

【架构实战营作业】模块三:学生管理系统架构设计文档

聆息

GaussDB(for MySQL)如何快速创建索引?华为云数据库资深架构师为您揭秘

华为云数据库小助手

华为云 GaussDB 华为云数据库 GaussDB(for MySQL)

影像篡改与识别(三):人工智能时代

腾讯安全云鼎实验室

AI 影像识别

数据湖特点

奔向架构师

数据湖 9月日更

【直播预告】从校园学习到职场实践——淘系技术开学季特别分享系列

阿里巴巴大淘宝技术

程序员 应聘tips

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