• 12
  • 12
分享
  • 测试驱动开发与V模型——软件测试圈
  • 饭团🍙 2021-04-13 10:48:08 字数 2952 阅读 1349 收藏 12

测试驱动开发

测试驱动其实跟自动化测试并没有什么直接的关系,或者说直接关系很小。因为测试驱动是单元测试的范畴,如果非要扯上一点关系,那就是其中编写的测试代码,可以放到自动化测试工具里运行。

1、何为测试驱动?

测试驱动开发(注意不是设计,是开发),英文全称Test-DrivenDevelopment,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。

2、测试驱动的好处

相对于传统的结构化开发过程方法,它具有以下优势:

1、促使设计更符合开发的需求,也可以更快地适应变化。

TDD根据客户需求编写测试用例,对功能的过程和接口都进行了设计,而且这种从使用者角度对代码进行的设计通常更符合后期开发的需求。因为关注用户反馈,可以及时响应需求变更,同时因为从使用者角度出发的简单设计,也可以更快地适应变化。

2、使设计松耦合,提高系统的扩展性和抗变性,容易获得反馈。

出于易测试和测试独立性的要求,将促使我们实现松耦合的设计,并更多地依赖于接口而非具体的类,提高系统的可扩展性和抗变性。而且TDD明显地缩短了设计决策的反馈循环,使我们几秒或几分钟之内就能获得反馈。

3、尽早发现错误,极大降低测试及修复成本,提高产品质量

将测试工作提到编码之前,并频繁地运行所有测试,可以尽量地避免和尽早地发现错误,极大地降低了后续测试及修复的成本,提高了代码的质量。在测试的保护下,不断重构代码,以消除重复设计,优化设计结构,提高了代码的重用性,从而提高了软件产品的质量。

4、利于重构

TDD提供了持续的回归测试,使我们拥有重构的勇气,因为代码的改动导致系统其他部分产生任何异常,测试都会立刻通知我们。完整的测试会帮助我们持续地跟踪整个系统的状态,因此我们就不需要担心会产生什么不可预知的副作用了。

5、提供了开发者文档

TDD所产生的单元测试代码就是最比较好的开发者文档,它们展示了所有的API该如何使用以及是如何运作的,而且它们与工作代码保持同步,永远是最新的。

6、TDD可以减轻压力

降低忧虑、提高我们对代码的信心、使我们拥有重构的勇气,这些都是快乐工作的重要前提。

7、快速的提高了开发效率?

总的来说,长期使用TDD实践能够改变一个人的编程习惯和思维方式。由于TDD追求的是在编写任何实现代码之前,先编写测试用例。从接口使用者的角度思考,帮助驱动出良好设计的接口。当编写代码的人脑子里面想的是「我要什么」,而不再是具体细节的「我要怎么做」的时候,TDD的目的也就达到了。

3、测试驱动适用场景

测试驱动是敏捷开发方法之一的极限编程(XP)中的一项最佳实践。理论上说,凡适合应用敏捷开发方法的项目,都适用测试驱动开发。敏捷开发比较适合应用在中小型项目,但是,大型项目又可以先拆成若干个小项目,因此,敏捷开发可以应对任何项目,所以,TDD也就无所不能。。。

4、相关讨论

对于TDD,存在正负两面的评价。

正面评价

可以有效的避免过度设计带来的浪费。但是也有人强调在开发前需要有完整的设计再实施可以有效的避免重构带来的浪费。

可以让开发者在开发中拥有更全面的视角。

负面评价

开发者可能只完成满足了测试的代码,而忽略了对实际需求的实现。有实践者认为用结对编程的方式可以有效的避免这个问题。

会放慢开发实际代码的速度,特别对于要求开发速度的原型开发造成不利。这里需要考虑开发速度需要包含功能和品质两个方面,单纯的代码速度可能不能完全代表开发速度。

对于GUI,资料库和Web应用而言。构造单元测试比较困难,如果强行构造单元测试,反而给维护带来额外的工作量。有开发者认为这个是由于设计方法,而不是开发方法造成的困难。比如可以使用MVC、MVP架构,将UI与逻辑分离,利于测试。

使得开发更为关注用例和测试案例,而不是设计本身。当前对于这个观点有较多的争议。

测试驱动开发会导致单元测试的覆盖度不够,比如可能缺乏边界测试。在实际的操作中,和非测试驱动开发一样,当代码完成以后还是需要补充单元测试,提高测试的覆盖度。

个人总结

功能未实现,先写测试,这种做法,是我们平时一般的开发模式是相反的,但也不是绝对没有。在接口设计,制订集成规范的时候,就是先定好接口,包括API地址,参数,访问方式,返回结果等等,然后实现接口时,就要紧扣这个规范。而平时开发的话,多半是边开发边想,随时调整。TDD,就是先想好要实现什么样的结果,然后再进行开发。然后开发完成后,还可以立即进行验证,无疑代码的严谨和质量都会有所提升。不过,这也对开发者,设计者提出了比较高的要求。有些东西,一开始并不是那么容易看清楚,边做边想可能效率更高一些。面向对象开发方法区别于结构化开发方法的自顶向下,是自底向上的,先构造一个最基本的雏形,然后再慢慢丰满,增量、迭代、原型倾向,更利于体现敏捷的思路。你功能都没确定,吭哧吭哧地,一本正经地写测试用例,很可能是一种浪费。所以我认为,一般情况下,用不上这个TDD,只有在SOA架构,实现服务接口时,或者需求非常明确的情况系啊,才适用这种所谓的TDD。

V模型

1、什么是V模型

开发模型里面,V模型与测试驱动开发思想有点类似。

即需求分析、概要设计、详细设计、编码都有一个相应的测试阶段。如下图

具体对应关系是这样子的:

单元测试所对应的是详细设计环节,也就是说,单元测试的测试用例是和详细设计一起出现的,在研发人员做详细设计的时候,相应的测试人员也就把测试用例写了出来;

集成测试对应概要设计,在做模块功能分析及模块接口,数据传输方法的时候,就把集成测试用例根据概要设计中模块功能及接口等实现方法编写出来,以备以后作集成测试的时候可以直接引用;

系统测试,就是根据需求分析而来,在系统分析人员作系统分析,编写需求说明书的时候测试人员就根据客户需求说明书,把最后能实现系统功能的各种测试用例写出来,为做最后系统测试作准备。

2、优缺点

V模型仅仅把测试过程作为在需求分析、系统设计及编码之后的一个阶段,忽视了测试对需求分析,系统设计的验证,需求的满足情况一直到后期的验收测试才被验证。也就是说,虽然从需求分析到编码,都有一个相应的测试阶段与之对应,但这只体现在测试用例的编写等准备工作上,只有开发完毕,才进行测试。那么其优缺点也很明显:

优点

  1. 既有底层测试又有高层测试。底层:单元测试。高层:系统测试。

  2. 将开发阶段清楚的表现出来,便于控制开发的过程。当所有阶段都结束时,软件开发就结束了。

缺点

  1. 容易让人误解为测试是在开发完成之后的一个阶段。

  2. 由于它的顺序性,当编码完成之后,正式进入测试时,这时发现的一些bug可能不容易找到其根源,并且代码修改起来很困难。

  3. 实际中,由于需求变更较大,导致要重复变更需求、设计、编码、测试。返工量大。

3、适用场景

V模式是一种传统软件开发模型,一般适用于一些传统信息系统应用的开发,而一些高性能高风险的系统、互联网软件,或一个系统难以被具体模块化的时候,就比较难做成V模式所需的各种构件,需要更强调迭代的开发模型或者敏捷开发模型。


作者:左直拳

原文链接:https://blog.csdn.net/leftfist/article/details/115606974

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1 什么是接口测试?接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系等。1.1 什么是接口?接口是一种用来定义程序的协议,是一组规则的集合。它规定了实现本接口的类,或接口必须拥有的一组规则。1.1.1 为什么需要接口?接口的意义在于抽象,从而使同类事物在同一高度具有通用及可替代性。在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而...
            0 0 1278
            分享
          • 软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终复查,是软件质量保证的关键步骤。定义1:软件测试是为了发现错误而在规定的条件下执行程序的过程。定义2:软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。由软件测试的定义,不难看出测试的目的,是寻找错误,并且是尽最大可能找出最多的错误。著名的Grenford J. Myers在《The Art of Software?Testing》一书中提出以下观点:测试是程序的执行过程,目的在于发现错误;一个好的测试用例在于发现...
            12 12 2146
            分享
          •   操作步骤:  右击:“添加”-"监听器"  察看结果树  查看结果树显示所有取样器的请求信息和响应信息,方便接口调试,问题定位。  聚合报告  聚合报告为测试中的每个取样器创建一行。对于每一个取样器,计算响应信息,并提供请求计数,最小,最大,平均,错误率,近似吞吐量(请求/秒)和千字节每秒的吞吐量。测试完成后,吞吐量就是整个测试期间的实际吞吐量。  · 标签 -样品的标签。如果选择“ 在标签中包括组名? ”,则线程组的名称将作为前缀添加。这样,可以根据需要分别整理来自不同线程组的相同标签。  · #样本 -具有相同标签的样本数  · 平均 -一组结果的平均时间  · 中...
            10 10 2239
            分享
          •       Airtest支持iOS自动化测试,在Mac上为iOS手机部署iOS-Tagent之后,就可以使用AirtestIDE连接设备,像连接安卓设备一样,实时投影、控制手机。iOS测试不仅限于真机测试,iOS模拟器也可以进行。Mac端上部署完成后还可以提供给同一局域网内的windows上远程连接使用。同时支持airtest图像识别和pocoUI检索。      本文介绍iOS自动化测试的部署过程,提供一个简单的测试脚本,列举了iOS测试过程中常见的问题。      功能支持支持A...
            0 0 2346
            分享
          • API 管理这个话题近些年听到的频次越来越多,这本质上是个 web 领域的发展有关,也和开发协作方式有关--前后端分离代替了全栈工程师 hold all 的局面,强调的更多的是 API 复用、分工和协作细化。 API 管理的重要性不言而喻,每家公司随着业务的发展,多多少少都会涉及到;从开源社区的产品到国内各类商业化产品,可以看到大家对于 API 管理是越来越重视的。为什么需要管理 APILittle story结合自身的开发经历,我们先讨论下,为什么需要管理 API1、在实习的时候是在一家小的游戏公司,人不多,一个产品;当时技术经理的安排是一个后端+一个前端的组合开发,大家都在一个办公室,接口...
            0 0 1297
            分享
      • 51testing软件测试圈微信