首页 > 其他分享 >测试驱动开发(TDD)三大定律

测试驱动开发(TDD)三大定律

时间:2024-07-17 17:55:07浏览次数:12  
标签:定律 代码 单元测试 TDD 确保 测试 编写 三大

定律一:在编写不能通过的单元测试前,不可编写生产代码。
解释:
这条定律的意思是,你不能直接编写实现功能的生产代码,而是在开始之前需要先编写一个单元测试来验证这个功能。这个单元测试应该是你期望生产代码通过的测试。只有在有了这个测试之后,你才能开始编写生产代码。

目的:

  1. 确保每一段生产代码都有明确的测试用例。
  2. 强制开发者先考虑需求和设计。
  3. 避免无测试的代码积累,确保代码可测试性。

定律二:只可编写刚好无法通过的单元测试,不能编译也算不过。
解释:
这条定律的意思是,你在编写单元测试时,只能编写那些因为生产代码尚未实现或部分实现而无法通过的测试。这里“无法通过”包括编译错误的情况。这意味着测试应该是为了验证当前还没有实现的功能或行为。

目的:

  1. 保持测试的专注性,只测试当前未实现或部分实现的功能。
  2. 避免编写过多或过于复杂的测试,确保测试覆盖率和测试代码的质量。
  3. 确保测试和实现同步进行,不会过早地编写多余的测试。

定律三:只可编写刚好足以通过当前失败测试的生产代码。
解释:
这条定律的意思是,你应该只编写刚好能让当前失败的测试通过的生产代码,不要超出这个范围。生产代码应仅满足测试的需求,而不是实现更多的功能。

目的:

  1. 保持生产代码的简洁和专注,只实现当前需求。
  2. 避免过度设计和提前优化。
  3. 逐步迭代开发,通过小步快跑的方式保证代码质量和稳定性。

实践中的应用
在实际开发中,这些定律的应用可以归纳为一个循环过程:

编写一个失败的单元测试(红):
根据需求编写一个新的单元测试,此时因为没有实现相关功能,测试会失败。
编写生产代码让测试通过(绿):
编写最小量的生产代码,刚好让这个测试通过,不要做额外的实现。
重构(重构):
清理和优化代码,确保代码质量,同时保证所有测试仍然通过。

通过遵循这些定律,开发者可以逐步实现功能,确保每一段代码都有对应的测试覆盖,从而提高代码质量和可维护性。

构造-操作-检验(BUILD-OPERATE-CHECK)模式

构造-操作-检验(BUILD-OPERATE-CHECK)模式是编写测试用例的一个经典模式,它分为三个主要环节:

  1. 构建测试数据(Build)

    • 设置初始状态或准备输入数据。确保测试有一个清晰和可预见的起点。
  2. 操作或处理测试数据(Operate)

    • 调用被测试的代码,用构建的数据进行操作。执行你想测试的方法或功能。
  3. 校验真实代码的输出结果(Check)

    • 验证操作的结果,检查输出是否符合预期。断言测试结果以确保功能正确。

测试的5条(FIRST)准则

为了确保测试用例的质量和有效性,可以遵循以下5条准则,简称FIRST:

  1. 快速(Fast)

    • 测试应该快速运行,能够及时反馈出业务代码的问题。快速的测试可以频繁运行,确保及时发现问题。
    • 例如,单元测试通常应该在几秒内完成。
  2. 独立(Independent)

    • 每个测试应该是独立的,彼此之间不应该有依赖关系。这样可以避免因为一个测试的失败影响到其他测试。
    • 例如,测试A不应该依赖测试B的运行结果。
  3. 可重复(Repeatable)

    • 测试应该能够在任何环境上重复运行并获得相同的结果。不应该受到环境、网络、时间等外部因素的影响。
    • 例如,在本地开发环境和CI/CD环境中都能通过。
  4. 自我验证(Self-Validating)

    • 测试应该有明确的bool输出(通过或失败)。测试结果应该是明确的,而不是模糊的或需要人工检查。
    • 例如,使用断言来验证测试结果是否符合预期。
  5. 及时(Timely)

    • 测试应该在编写代码的过程中或之后及时编写,而不是事后补充。这有助于捕获早期的错误并引导设计。
    • 例如,在开发新功能时同时编写对应的单元测试。

标签:定律,代码,单元测试,TDD,确保,测试,编写,三大
From: https://www.cnblogs.com/zhao-zong-yu-hai/p/18307939

相关文章

  • 三大图生图模型sd-refiner,sd-variations,pix2pix部署
    三大图生图模型sd-refiner,sd-variations,pix2pix部署模型下载地址及前后端代码地址:pylzzz.online效果图:相似图(sd-variations模型)细化图(sd-refiner):衍生图(pix2pix)......
  • 三大知名向量化模型比较分析——m3e,bge,bce
    先聊聊出处。M3E是MokaMassiveMixedEmbedding的缩写,Moka,此模型由MokaAI训练,开源和评测,训练脚本使用uniem,评测BenchMark使用MTEB-zhMassive,此模型通过千万级(2200w+)的中文句对数据集进行训练Mixed,此模型支持中英双语的同质文本相似度计算,异质文本检索等功......
  • 三大范式 反例 并改正
    第一范式(1NF):数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。不满足第一范式(1NF)的数据库就不是关系数据库。反例:假设有一个学生课程表,其中一列课程,写着数学,英语,地理,这就违反了第一范式,因为课程列包含了......
  • 测试驱动开发的艺术:Xcode中实现TDD的全面指南
    测试驱动开发的艺术:Xcode中实现TDD的全面指南在软件开发过程中,测试驱动开发(Test-DrivenDevelopment,TDD)是一种以测试为先导的开发模式,它强调先编写测试用例,再编写功能代码,从而确保代码的质量和可维护性。Xcode作为苹果官方的集成开发环境(IDE),提供了强大的工具和框架来支持TD......
  • 亚马逊ERP常用的三大功能 设置最大订单数 定时上下架 无库存采集
    亚马逊全功能ERP最常用的三大功能:批量设置最大订单数量、批量定时上下架、不限店铺、不限子账号、无库存采集。今天我将为大家详细介绍亚马逊卖家最常使用的三大功能:批量设置最大订单数量、批量定时上下架以及无库存采集。·首先来探讨批量设置最大订单数量这一功能,这个功能......
  • Java基础,面向对象,类与对象,全局和局部变量,三大特征--封装,构造方法,JavaBean的编写---入
    一.面向对象面向过程和面向对象的区别     面向过程:强调步骤    面向对象:强调对象,对象洗衣机帮我们完成举例:洗衣服面向过程:面向对象:脱衣服->打开洗衣机->按钮->晾衣服面向对象的三大特征-----封装,继承,多态对象:万物皆可对象类:一组相关属性和行为的集......
  • 熵增定律
    目录前言现象原理关系案例方法本人化概念:金句前言现象物理现象:把烧开的水倒入玻璃杯里,杯顶白雾多久散去?热水要经过多长时间?人的现象:听了激动人心的讲座后,决定改变习惯,要早起,你会坚持多久?原理熵:反映一个系统的混乱程度,系统越混乱,熵值越大,系统越有序,熵值越小。熵增定律:在孤......
  • Redis三大缓存问题:缓存穿透、缓存击穿、缓存雪崩的场景以及解决方法
    文章目录都是缓存惹的祸缓存穿透场景描述解决方法缓存键同时失效1.过期时间随机化2.使用多级缓存3.缓存预热4.加互斥锁缓存中间件故障1.服务熔断-Java示例2.构建Redis集群注意事项缓存击穿场景描述解决方法1.加互斥锁(MutexLock)2.永久缓存热点数据注意事......
  • Android面试题自定义View之Window、ViewRootImpl和View的三大流程
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点View的三大流程指的是measure(测量)、layout(布局)、draw(绘制)。下面我们来分别看看这三大流程View的measure(测量)MeasureSpecMeasureSpec是View的一个内部静......
  • 三大常用集合
    1.Set集合在Java中,Set是一种集合类型,它是一种不允许包含重复元素的集合,每个元素在Set中是唯一的。Set接口的常用实现类有HashSet、TreeSet和LinkedHashSet。以下是关于Set集合的一些重要特点和用法:特点:不允许重复元素:Set中每个元素都是唯一的,如果尝试向Set中添加重复元素,则......