• 0
  • 0
分享
  • 程序员有必要掌握 TDD 吗?——软件测试圈
  • quinn 2022-09-23 16:07:25 字数 2233 阅读 1439 收藏 0

TDD 是什么 ?

TDD 是来自极限编程,百度百科的解释如下:

TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前, 先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法

的核心实践,但不只适用于XP(Extreme Programming),同样可以适用于其他 开发方法和过程。

这个解释是比较片面的,其实TDD 包含两大部分:ATDD 和 UTDD

ATDD

Acceptance Test Driven Development,验收驱动开发。比如,QA(质量保障)会编写测试用例,然后和PM(产品经理),RD(技术开发)一起评审,这个过程可以帮助RD更好的理解业务需求和验收条件,以至于在后面的代码编写中带着验收目标直到验收测试用例通过。

测试的方式有很多,比如BDD(功能测试),白盒测试,集成测试等等,根据不同的场景采用不同的测试手段,以便达到验收通过。

UTDD

Unit Test Driven Development,单元测试驱动开发,RD先编写单元测试用例,然后再编写实现代码直到单元测试通过。

关于ATDD和UTDD 在Thoughtworks官网,有一张抽象图,大家可以参考下:

1.png

下面整理了一个xmind图

2.png

如何做好 TDD?

在分析TDD方案之前,我们先来解决一个问题:测试驱动开发,整个过程从哪里开始?

答案:测试

那么,测试又从哪里开始呢?

答案:需求。

如果没有需求,测试的目标是什么?因此需求是测试的源头;面对庞大的需求,要如何测试?方法是将需求分解成一个一个可实施测试的小任务。

所以 测试驱动开发要从任务分解开始。

下面摘取了 Thoughtworks 官网的2张图片,来表达TDD的整个过程。

TDD实施-步骤示意图:

3.png

TDD实施-协作示意图:

4.png

个人觉得TDD 可以和 DDD 一样,从战略和战术两个角度来实施。

战略角度

战略角度,更多是一个思想层面的方法论,它可以指导我们以一种更优的方式去实施TDD。

下面先描述一个需求从提出到上线的整个生命周期:

当接到一个新需求时,

  • 首先,PM会有需求评审,评审会阐述业务背景,讲解需求解决的问题以及要达到什么目标;

  • 然后,RD会根据需求评审,做业务分解、上下游沟通、接着做技术详设,技术串讲;

  • 接着,QA会结合需求评审和RD的技术串讲编写测试用例以及用例评审,多方拉齐验收目标和上线时间;

  • 再接着,RD会做架构设计,代码设计以及代码编写,代码测试;QA会做测试相关的工作,比如:用例设计,测试脚本等;

  • 最后,RD开发完成&提测,QA进行测试直到准出,PM进行最后的验收直到代码上线;

整个流程体现了TDD的战略思想,整个生命周期为ATDD和UTDD提供了一定的流程规范。

战术角度

战术角度,更多是从技术层面来阐述。在战略角度我们提出了方法论,针对流程里面的每个步骤要怎么落地,这个就是战术角度。

  • 比如:需求分解,需要按照什么维度分解,是按照领域划分还是按照过程划分,任务分解成多大才算合理。

  • 比如:架构设计,要用什么架构思想,是六边形架构还是洋葱架构。

  • 比如:代码设计,需要用到什么设计模式,适配器模式还是工厂模式。

  • 比如:代码编写,需要用到什么数据结构,算法,怎么让代码更具有复用性。

  • 比如:测试,如何设计测试用例,选用什么测试框架,怎么让测试变得自动化

TDD的实施有一个经典三步曲:红 - 绿 - 重构,不论是ATDD还是UTDD都可以按照这个三步来实施,三部曲示意图如下:

5.png

在很多测试框架中 红代表测试没有通过,绿代表测试通过,而要想让红变成绿就需要经过不断的重构。

因此,我们可以理解:为了写测试,首先“驱动”着我们理解业务,把需求分解成一个个的任务,然后会“驱动”着我们给出一个可测试的设计,而在具体的写代码阶段,又会“驱动”着我们不断改进写出来的代码。把这些内容结合起来看,我们真的是在用测试“驱动”着开发。

有了战略和战术的指导,最主要的就是需要修炼支撑这些策略的能力。实施 TDD 最好需要具备以下能力:

  • 测试前移(左移)的思维能力

  • 业务和技术需求的分析和任务拆分能力

  • 测试用例设计能力

  • 自动化测试开发

  • 能力代码重构

  • 能力持续改进的能力

误区

误区1

在很多程序员的理解中,UTDD就是TDD,TDD就是UTDD,以至于我们把面向业务或测试的ATDD给忽略了,因此,无形中把TDD的范围给缩小了。下面给了一个ATDD和UTDD的对标表

误区2

TDD 就是先写测试后写代码,原因已经在TDD 战术部分中分析过。

TDD真的"死了"吗?

如文章开头 Is TDD Dead?

答案是:NO, 而且目前TDD活的还是不错的,很多公司一直在践行它,只是没有特别去强调它是TDD的范畴。 同时,TDD不是银弹,不可能解决实际工作中的任何问题,我们要做的是不断的学习,比较和总结,根据实际的业务需求去实施,毕竟合适才是最好的。

程序员真的有必要掌握TDD吗?

很有必要,我们不一定要特别强调TDD这个概念,但是TDD根本就是保证程序员的代码质量,而代码质量是程序员的底线

UTDD可以帮助程序员更好,更系统的去写单测;ATDD,可以让程序员更好的了解业务,通过更深度的了解业务来保证代码对业务的健壮性。


作者:猿 java

原文链接:https://blog.csdn.net/m0_54369189/article/details/126157646

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   探索自动化集成测试以实现无缝软件开发的有效技术和技巧。立即升级您的策略!  当软件组件的单元测试完美运行时会发生什么?您是否曾想过,为什么单元测试 100% 通过的报告对于作为一个单元进行集成和验证时的组件没有好处?发生自发故障的集成测试并不反映故障点位于单元内部,而是反映单元交互的地方。  测试团队非常重视如何有效地依靠自动化、集成测试来确保在当今要求苛刻的世界中生成的软件的质量,在这个世界中,以结果为中心的方法寻求工作软件的持续交付。  什么是集成测试?  集成测试包括围绕接口进行测试,以检查多个软件模块之间的数据流,而不干扰模块的功能。  为了构建系统的“工作”版本,由各个开发人员成...
            0 0 279
            分享
          •   对很多没有如何经验或者面试次数不多的小伙伴来说感觉每次跳槽或者首次面试的时候都会感觉特别紧张,然后不知道自己该准备些什么,或者不知道面试的流程是什么样子,那么就给大家分享一下我个人面试的经验。  1、穿着问题  很多人认为我们it人员去面试就应该这样穿正装,但是其实那只存在于微信头像上,我们面试的时候其实穿平常的衣服就可以了,那什么是平常的衣服?男生就是格子衬衫或者T恤、牛仔裤、运动鞋、双肩背包,女生也是化个淡妆然后平时休闲的衣服就可以了,所以第一印象是比较重要的。  2、简历  一份好的简历是非常重要的(这里不是讲简历的制作所以不过多概述),面试的时候一般面试官都会拿着笔记本直接看电子档...
            0 0 843
            分享
          •   通过“测试左移”,提前与开发人员一起制定测试计划。推动代码评审、代码审计、单元测试、自动化冒烟测试、测试精准化分析以及研发自测等来保证研发阶段的质量;另外,参与配置部署,将自动化测试用例配置到持续交付链中,并通过“测试右移”,全流程监控发布后的应用质量。  具体提升为:  一、熟悉基层的测试业务  对于功能测试工程师来讲,提前了解开发的框架、开发的业务设计流程以及数据库的底层结构,对熟悉业务和在测试过程中遇到问题进行问题定位,都能给予很大的帮助。所以建议大家都尽量积极的去参加开发设计评审、数据库评审,而且在参加开发设计评审和数据库评审时还能提前发现问题(BUG)。举个很简单的例子,假如开...
            0 0 751
            分享
          • 环境首先环境是非常重要的,需要尽可能跟生产环境靠近。比方说,使用同样的nginx版本,php的话需要启用fpm,zend-optimizer等等,参数配置也最好跟生产环境保持一致。当然,php的版本更加需要保持一致,不能说线上是跑5.3,而测试环境却是php 7;除非是要测试不同php版本的性能。网络也需要注意,测试机跟服务器之间是什么网络连接?100M还是千兆的网线?也同样需要跟生产环境尽可能保持一致。我曾经看过有人直接在自己的笔记本上跑压测的客户端,然后笔记本使用的wifi;这直接就变成是在测试wifi的性能了。当然,也可以考虑直接在服务器本机上面跑压测程序,这样就可以规避掉网络层的,更有...
            0 0 872
            分享
          • 软件测试有多种多样的方法和技术,可以从不同角度对它们进行分类。其中,根据软件生命周期,针对不同的测试对象与目标,可将测试过程分为4个阶段:单元测试、集成测试、系统测试和验收测试。本文着重介绍了如何借用pytest与httprunner进行接口自动化测试。一、 什么是接口测试根据wiki中的定义,接口是一个共享的边界,计算机系统的多个独立组件通过它交换信息。这些信息的交换可以基于软件、硬件、外部设备、人和它们之间的组合。根据上述定义,可以面向软件、硬件、交互设备等展开接口测试。软件的接口测试是面向独立组件之间接口的一种测试,主要用于检测内外部系统及内部各子系统之间的交互点。测试的重点在于检查逻辑...
            12 13 2752
            分享
      • 51testing软件测试圈微信