测试驱动javascript开发 -- 3.测试驱动开发过程(上)

简介:   通过之前文件关于单元测试的介绍,我们学会了如何减少代码的缺陷,通过回归测试抓取bug,减少对公共测试的依赖提高开发效率。本章我们的关注点将会放在测试驱动开发(TDD)上,他是测试先行、开发置后的开发模式。

  通过之前文件关于单元测试的介绍,我们学会了如何减少代码的缺陷,通过回归测试抓取bug,减少对公共测试的依赖提高开发效率。本章我们的关注点将会放在测试驱动开发(TDD)上,他是测试先行、开发置后的开发模式。他有很多的好处,例如:更好的可测试代码、更简洁的接口和可以提高开发者信心的代码质量。

 

  测试驱动开发的目标和目的

  测试驱动开发的目标是简洁的代码。TDD是一种迭代的开发过程,每个迭代式以写单元测试开始,单元测试可以作为将要开发功能的规范文档。短期迭代对代码的反馈是及时的,这样可以更容易发现我们不好的设计。编写开发代码之前,先写单元测试还可以提高单元测试覆盖率。

  1.开发置后

  传统的开发模式中,问题知道代码全部编写完才得以解决。理想情况下,代码会有整体的架构考虑,但是很多情况下,特别是JavaScript开发的过程中,情况往往不是这样。这种解决方案,通过去猜什么样的代码能解决问题,导致的结果是代码肿胀和紧耦合。如果没有单元测试,产品代码中可能会包含一些没有运行的代码,例如异常处理逻辑。还有就是边界值可能没有被测试到。

  TDD把开发顺序颠倒了,首先做的不是编写功能实现代码,而是考虑目标的制定,要实现什么功能和如何实现。单元测试在这里起到规范和文档的作用。TDD的目标不是测试,所以他不能保证在边界值的处理上做的更好。TDD虽然产生了额外的单元测试代码,但是他提高了系统的健壮性,而且保证系统不包含不执行的代码。

  2.在TDD中做设计

  TDD的特点是“没有大的预先设计”,并不是“没有预先设计”。为了写出整洁的代码,我们需要衡量整个项目的持续时间和考虑开发的生命周期,所以我们需要制定计划。TDD不会无中生有的自动生成好的设计,但是他会帮助我们进化我们的设计。通过对单元测试的依赖,TDD更多的把关注点放在了相互独立的、隔离的组件上。这种方式可以帮我们我们写出接偶的代码,代码遵循单一职责和避免不必要的膨胀。TDD提供了严格控制,可以将很多设计的决定时间延迟到直到真正需要的时候。他可以很好的应对需求的变化,因为我们很少设计不需要的功能,或者不需要按照预先期望开发。

  TDD驱使我们去处理设计,当有了新功能的时候,我们需要以单元测试的形式制定合理的用例。写单元测试时需要思考的,我们需要描述我们在解决什么样的问题。只有完成这个工作,才能开始编码。换句话说,TDD要求我们在提供解决方案之前,要先想想结果。

 

  促进测试驱动开发

  测试驱动开发最关键的是运行测试,测试需要能快速而容易的运行。如果不是这样的话,开发人员就会忽略测试,当开发了新功能之后也不会运行测试。这样会让开发变得一团糟。最糟糕的是,我们花费额外的时候使用TDD的开发模式,却没有起到我们期望的作用,我们开发的代码还是一团糟。所以,顺利的运行测试是相当重要的。

  推荐的方案是使用自动测试(autotest),每个测试保存在独立的文件中,可以单独运行。他能在屏幕上显示测试结果,告诉我们哪些测试通过了(显示绿色),哪些测试正在运行,和哪些测试失败了(显示红色)。这样可以提高我们开发的效率,帮助我们重构代码,我们只需要关注测试失败的情况。

 

  测试驱动开发的好处

  1.能够工作的代码

  TDD最大的好处就是生产可以工作的代码。一个基本的单元测试可以确保一段代码的稳定。可再生的单元测试在JavaScript中特别有用,我们需要在很多浏览器平台上进行测试。测试代码只需要写一次,通过测试可以很快找到不能工作的代码,发现bug。

  2.遵循单一职责原则

  在隔离的条件下描述和开发组件,能更容易的写出解耦和符合单一职责原则的代码。TDD的单元测试不需要测试组件的依赖,他们需要能用mock或stub的方式替换。另外,单元测试也可以帮助我们找到程序中紧耦合的代码。

  3.迫使有意识的开发

  因为在每次迭代之前,我们都是先写描述特定功能的测试,TDD就迫使我们在编写代码之前先进行思考。在解决问题之前先进行思考,有助于我们找到一个更可靠的解决方案。通过用例对功能进行描述,也有助于我们开发出更简明的代码。这样也会避免我们引入不必要的功能。

  4.提高生产效率

  如果你是第一次接触TDD,你会觉得所有的测试和步骤都需要你花费更多的时间。使用TDD从一开始也不是那么简单的事情,写出好的单元测试需要不断的练习,本系列课程会通过很多例子教会你如何完成这个工作。当你养成了好的TDD开发习惯的时候,他确实能提高你的开发效率。他可能需要你多花点时间去完成功能代码和测试代码的编写,但是他能减少你手工测试的时间,取而代之的是运行单元测试。最重要的是,你开发出了有单元测试保障的、能工作的代码,代码重构的工作将不会变得那么荆棘。你的工作会变得更快速、压力更少和更快乐。

 

adpics.aspx?source=kbh1983&sourcesuninfo
目录
相关文章
|
30天前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它采用中间件系统增强功能,如日志和错误处理,集成多种模板引擎(EJS、Jade、Pug)用于HTML渲染,并提供安全中间件提升应用安全性。其可扩展性允许选用合适插件扩展功能,加速开发进程。
|
1月前
|
缓存 JavaScript 前端开发
js开发:请解释什么是Webpack,以及它在项目中的作用。
Webpack是开源的JavaScript模块打包器,用于前端项目构建,整合并优化JavaScript、CSS、图片等资源。它实现模块打包、代码分割以提升加载速度,同时进行资源优化和缓存。借助插件机制扩展功能,并支持热更新,加速开发流程。
20 4
|
1月前
|
缓存 JavaScript 数据安全/隐私保护
js开发:请解释什么是ES6的Proxy,以及它的用途。
`ES6`的`Proxy`对象用于创建一个代理,能拦截并自定义目标对象的访问和操作,应用于数据绑定、访问控制、函数调用的拦截与修改以及异步操作处理。
17 3
|
1天前
|
JavaScript 前端开发
js开发:请解释事件冒泡和事件捕获。
JavaScript中的事件处理有冒泡和捕获两种方式。事件冒泡是从子元素向上级元素传递,而事件捕获则从外层元素向内层传递。`addEventListener`的第三个参数可设定事件模式,`false`或不设为冒泡,`true`为捕获。示例代码展示了如何设置。
13 2
|
9天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
1月前
|
Web App开发 JavaScript 前端开发
js开发:请解释什么是Node.js,以及它的应用场景。
Node.js是基于V8的JavaScript运行时,用于服务器端编程。它的事件驱动、非阻塞I/O模型使其在高并发实时应用中表现出色,如Web服务器、实时聊天、API服务、微服务、工具和跨平台桌面应用(使用Electron)。适用于高性能和实时需求场景。
18 4
|
1月前
|
JavaScript 前端开发 编译器
js开发: 请解释什么是Babel,以及它在项目中的作用。
**Babel是JavaScript编译器,将ES6+代码转为向后兼容版本,确保在旧环境运行。它在前端构建中不可或缺,提供语法转换、插件机制、灵活配置及丰富的生态系统,支持代码兼容性和自定义编译任务。**
17 6
|
1月前
|
JavaScript 前端开发
js开发:请解释什么是ES6的async/await,以及它如何解决回调地狱问题。
ES6的`async/await`是基于Promise的异步编程工具,能以同步风格编写异步代码,提高代码可读性。它缓解了回调地狱问题,通过将异步操作封装为Promise,避免回调嵌套。错误处理更直观,类似同步的try...catch。
|
1月前
|
JavaScript
js开发:请解释什么是ES6的Generator函数,以及它的用途。
ES6的Generator函数是暂停恢复的特殊函数,用yield返回多个值,适用于异步编程和流处理,解决了回调地狱问题。
16 6
|
1月前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可为任意类型,有序且支持get、set、has、delete操作;Set存储唯一值,提供add、delete、has方法。两者皆可迭代。示例展示了Map和Set的基本用法,如添加、查询、删除元素。
15 2