徐昊 · TDD 项目实战 70 讲
徐昊
Thoughtworks 中国区 CTO
18159 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已完结/共 88 讲
实战项目二|RESTful开发框架:依赖注入容器 (24讲)
实战项目三|RESTful Web Services (44讲)
徐昊 · TDD 项目实战 70 讲
15
15
1.0x
00:00/00:00
登录|注册

05|TDD中的测试(1):状态验证为什么是主要的使用方式?

你好,我是徐昊。从这节课开始我们来正式学习测试驱动开发(Test-Driven Development,TDD)。
通过前面四节课的演示,相信你对测试驱动开发已经有了一定的感性认识。测试作为整个流程的驱动力,无论是在开发还是重构过程中都起到了重要作用。我想你对这一点一定有了比较深刻的印象。那么从今天开始,我们就来学习如何编写测试。

测试的基本结构

无论使用什么样的测试框架,每个测试都由四个依次执行的阶段组成:初始化(SetUp)、执行测试(Exercise)、验证结果(Verify)和复原(Teardown)。如下图所示:
需要说明一下的是,测试上下文(Test Context)在很多文献中被称作测试夹具(Test Fixture)。
夹具是个隐喻,是木工或者其他制造过程中,用以固定待加工工件的器具(上图中,棕色部分看起来是不是“夹”住了待测系统)。当然,这种拿一个生僻概念来隐喻另一个生僻概念的操作,也是很迷了。我要不是因为做吉他学习了木工,也不明白为什么要叫 Fixture。抛开这个隐喻,直接称作测试上下文其实就简单易懂多了。
再多说一句,如果使用Fit系自动化测试工具(Fit、Fitness,甚至 concordion、selenium),Fixture 则表示驱动待测系统的交互接口,也叫 Driver。这也是为啥,Selenium 后来改叫 WebDriver 的原因。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

TDD中的测试(1):状态验证为什么是主要的使用方式? 徐昊在本文中介绍了测试驱动开发(TDD)中的测试基本结构,即四个阶段:初始化、执行测试、验证结果和复原。他强调了验证结果阶段的重要性,特别是状态验证和行为验证两种方式。在本文中,主要讨论了状态验证的重要性和使用方式。状态验证是通过比对测试上下文与待测系统的状态变化来判断待测系统是否满足需求的验证方式。徐昊指出,状态验证是TDD中最重要的验证方法,因为它需要大量使用断言方法来判断状态。虽然状态验证是TDD中主要使用的验证方式,但在某些情况下,也需要使用另一种验证方式——行为验证。 徐昊还提到了测试的四个步骤中,验证结果是最核心的一步,也是最核心的技术。他强调了验证结果阶段的重要性,并介绍了状态验证和行为验证两种方式。在状态验证中,他还提到了增量状态验证是一种有效的手段,可以降低状态累积的影响。 总的来说,本文通过介绍TDD中的测试基本结构和状态验证的重要性,为读者提供了对TDD测试方式的深入理解。文章内容简洁明了,为读者提供了对TDD测试方式的深入理解,同时也引发了读者对TDD测试方式的思考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《徐昊 · TDD 项目实战 70 讲》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • humor
    如果SUT使用了外部系统,并且外部系统比较慢,会不会拖慢测试执行的速度,进一步拖慢编码的速度呢

    作者回复: 那为什不改进

    2022-04-10
    2
    1
  • jimson
    为什么 TDD 中主要使用状态验证来验证测试的结果? 因为我们使用的是OOP, 操作的大多数是数据的改变。

    作者回复: 是一个方面 另一方面状态好测

    2022-04-22
  • humor
    因为在TDD刚开始的时候还没有代码实现呢,只能验证最终的结果(状态)

    作者回复: 看下一节

    2022-04-10
  • asusual
    为什么 TDD 中主要使用状态验证来验证测试的结果? TDD的主要核心在于tasking, tasking后的任务列表一定是一个具体且可验证的的行为。 e.g 用户可以使用 用户名: some-user 用户密码:some-password 成功登录系统 输入确定,输出必然确定 我们只需要关心测试输入与输出(黑盒测试),也就是说不需要关心如何实现 一旦我们切换到行为验证(相当于白盒测试),关注点从验证输入和输出结果转换到验证具体实现行为 假设我们需要切换到另外一种实现行为,单元测试也需要重新修改, 有点像“实现驱动测试”,最终导致变更成本提高
    2022-04-03
    5
  • 汗香
    为什么 TDD 中主要使用状态验证来验证测试的结果? 如asuaual所说,状态验证更像黑盒,不用关心软件的内部结构,内部结构的改变对外部验证来说是透明的,更利于重构
    2022-04-08
    3
  • 常文龙
    在看第一遍的时候比较难理解为什么是状态验证是“黑盒验证”,毕竟示例里都把数据库的数据挖出来看了,还不叫白盒? 但仔细品味,把数据库数据挖出来看,是为了看“没有直接输出的输出”,而不是看内部状态,从这个角度看,的确是黑盒验证。
    2022-09-23归属地:广东
    1
    1
  • 努力努力再努力
    问题:为什么 TDD 中主要使用状态验证来验证测试的结果? 回答:我觉得是,任何事情的执行,注重的都是最终的结果,状态验证也是如此,忽略测试执行(exercise)的过程,专注于最终测试的结果是否与设想的一致。
    2022-09-14归属地:广东
  • Geek
    请问老师,查询数据库算是状态验证么,我理解也可以说是一个行为。因为数据库也是一种实现,以后可能重构成别的库或者别的表。这样这个case还是会失效
    2022-08-30归属地:北京
  • escray
    终于追到了第五讲,之前用 RSpec 写过 Ruby 的单元测试,但是没有感觉的状态验证和行为验证的具体差别,估计还是代码写的太少的缘故。 这一讲其实是前面几讲中相对轻松的一篇,前面课程的视频里面有不少代码示例,我努力完成了一部分,主要是因为自己对于 Java 实在是不够熟练,练习 TDD 的过程中顺便学习了一个 Java 编程。 同样把提供代码,希望能有帮助 https://github.com/escray/TDDCourse/tree/ch05 有点好奇的是,Java 的这些新特性在日常开发中使用的多么?似乎很多项目还是建立在 Java 1.8 的基础上的,虽然现在已经是 Java 18 了。
    2022-04-02
    1
  • aoe
    来自学习群的分享 有哪些状态验证技术推荐吗? - 做各种fake mountainbike,mock,in men do, test container - 目的就是尽量少做行为验证 - **所谓测试策略 就是在保证有效性的同时 尽可能降低测试成本** - 维持测试有效性 有个最小成本 - 小过这个 测试就无效了 或者不足以支撑长期演化(重构) - 所以你没办法一直缩短测试时间 - 这也是我们讲的 始终使用状态验证 防止测试失效 - 在状态验证里 通过stub 偷换fake 降低成本
    2022-03-27
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部