iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Nodejs学习笔记之测试驱动
  • 778
分享到

Nodejs学习笔记之测试驱动

学习笔记测试Nodejs 2022-06-04 17:06:01 778人浏览 薄情痞子
摘要

分享第二章,关于测试驱动。这里的测试主要针对WEB后端的测试 —— 你为什么要写测试用例(即测试用例的完善是否是浪费时间),如何完善你的测试用例,代码设计如何简化测试用例的书写,以及一些后期的构想。 1.

分享第二章,关于测试驱动。这里的测试主要针对WEB后端的测试 —— 你为什么要写测试用例(即测试用例的完善是否是浪费时间),如何完善你的测试用例,代码设计如何简化测试用例的书写,以及一些后期的构想。

1. 你为什么要写测试用例

这个习惯通常会被认为是一种耽误开发进度的行为,你需要花费几乎和开发代码相同的时间来逐步完善你的测试用例。但是在开发过程中,在开发完成一段代码后如果负责任而不是说完全把问题交给测试人员去发现的话,这个时候通常都会去做一些手动的测试。例如:

在代码中执行某些方法,查看输出的值是否符合预期。
修改数据库/缓存,然后执行某些方法,看数据库的变化是否符合预期。
使用工具模拟请求某些接口,查看接口的返回值/数据库的变化值是否会符合预期。
如果有前端页面的话,还会涉及到前后端联调,即要在前端页面上通过前端交互,查看前端的反馈是否符合预期,来间接验证后端代码的正确性。
现代化的测试工具都在尽可能的将这些人工的手动测试行为抽象成代码块,当你有意识去进行手动测试的时候,其实已经开始在尝试测试用例的行为了。既然可以通过手动的方式进行测试,那为什么还需要用代码来实现测试?

代码是可以复用或者在简单重构后可以实现更多的功能的,但是当你选择手动的时候,每次你都需要重头开始。
成熟的工作流中应当包括代码审核流程,代码审核的方式有很多,逐句阅读你的代码,或者检查你测试代码的完善性以及正确性,然后运行你的测试用例。后者更加简单。
当代码改动,例如修复 Bug 时候,很难保证你的改动是否会影响其他依赖你代码的部分。在人工测试的时代有一个叫做回归测试,即在你修复 Bug 将你的系统重新测试一遍。但是如果你已经有了完善的测试用例了呢,直接执行命令搞定。
当你重构代码的时候,同上。

2. 如何完善你的测试用例

在进入完善阶段前,先说说你将如何实现测试用例。


describe Meme do

 before do
  @meme = Meme.new
 end

 describe "when asked about cheeseburgers" do
  it "must respond positively" do
   @meme.i_can_has_cheezburger?.must_equal "OHai!"
  end
 end

 describe "when asked about blending possibilities" do
  it "won't say no" do
   @meme.will_it_blend?.wont_match /^no/i
  end
 end
end

上面的代码来自于 Ruby 的 minitest。before 包含的代码块是在执行下面的测试用例前要做的事情,通常还会支持一个相对应的方法,在测试用例执行完执行。每个用例里面都进行一些很小的判断。

第一段中提到了一些手动测试里面经常会涉及到的测试内容,这里拿其中的 2 和 3 进行说明。在进行数据库相关的测试时,需要在 before 中插入一条测试数据,并且在 after 中删除测试数据。中间的测试用例中,通过执行相应的方法,执行完毕后:检查数据变化情况/检查是否有预期的异常/是否返回预期结果 来确认代码的正确性。如果是接口的话,就是通过代码发起对应的请求,然后检查返回的内容是否返回预期,有需要的话再去查看数据库里面的数据是否符合预期变化。

现在已经有了测试用例,但是任然需要考虑一种特殊情况。我现在为一个函数写了相对完善的测试用例了,跑完都 PASS 了,结果发现线上的日志里面还是有那个函数的报错。检查下发现函数的某个分支之前在测试的时候没有测试到,刚好线上的某种情况运行到了这个分支,结果有一个很不明显的语法错误报错了,有没有办法能确保所有的代码都测试过了?这里需要引入的是一个叫做 测试用例覆盖率 的概念,基本上每个语言都会有响应的实现。通过测试用例覆盖率,量化的告诉你你的测试用例有没有跑完某某文件里的所有代码,而你需要做的,就是尽可能保证你的覆盖率保持在 100%。

某种意义上来说,测试用例和测试覆盖率是用来提高开发者对自己代码自信心的工具。但是,他们也不是万能的。测试用例里面总可能会漏掉一些参数的可能性,当然你的代码里面也没有为这种可能性进行代码的编写,最终测试用例覆盖率只能告诉你你写的代码我们都帮你检测过了测试过了,对于你没有考虑到的可能性,表示无能为力。所以尽可能编写严格的代码,例如 javascript 里面尽可能都用 === 而不是 ==,使用强类型的编程规范等等,这些来降低这种因为接受的参数范围过大带来的潜在风险。

3. 代码设计如何简化测试用例的书写

整个 Web (也不局限于 web)通常包括三个层面的代码 —— 单纯数据处理与运算、涉及到数据库、涉及到具体的网络协议。其中单纯的数据运算于处理主要为普通的运算的函数或者是其他代码,涉及到数据库就是传统意义上 mvc 里面的 M,涉及到具体的网络协议就是对应的 C。这三块的测试分别对应着第一节中常规的测试内容的前三条。

因为 C层面通常还可能涉及到页面的渲染以及相应协议的模拟,所以通常把测试的重心放在函数以及数据库相关的代码里面可以减少测试用例代码的复杂度,这个就要求 Controller 的代码要尽可能少。对于复杂度较高的应用的一些目前的一些建议:

将数据的基础校验都放在 M层,如果使用 Ruby 开发的话,ActiveRecord以及MonGoid都提供了很方便使用的 validation 功能。
尝试在代码中使用 Pub/Sub 模式配合一些 ORM中提供的钩子(hook) 来实现 Model 之间的通信。 例如在 A 创建的时候发布某个消息,B监听到消息之后修改他自己的某个属性值。
使用 Command 模式将一些业务无关的功能从系统中抽离出来,例如邮件发送。
以上建议参考:Laravel wisper resque

4. 构想

以上的内容都避开了前后端需要联调的测试用例,下面的内容主要是针对这块。Ruby 在这个方向已经有一些比较优雅的实现,感兴趣的可以直接先去欣赏一下 Capybara。

随着包括 selenium Phantomjs 以及基于前者的 Watir 等一系列浏览器驱动的普及,使用代码控制浏览器已经不再是一件很复杂的事情。在这个能力的基础上,可以尝试把基于前端的测试分为四步:

等待某标志性元素出现(例如等待页面载入玩,或者某个内容异步加载出现)
模拟用户操作,这里的操作包括且不局限于用户点击、用户输入
等待反馈中标志性元素出现(例如某某输入框出现)
判断内容,是否符合预期
基于这个流程,可以解决绝大多数的前端测试。但是单纯依靠这个流程任然不够,因为页面中可能出现例如验证码这样的阻碍元素,在不修改代码的前提下,可以尝试通过数据库/缓存来取到这些内容。同样,和测试接口相同,这里也涉及到在测试前数据库中插入测试数据,测试用例执行后严重数据库里面数据变化,以及全部测试完毕后删除测试数据的内容。最终导致这块测试用例代码的实现需要同时对前端后端有一定的了解。目前还在考虑在借鉴 Capybara 的基础上,设计出更加通用的方案。

最后贴一段 Capybara 的代码结束这段内容:


feature "Signing in" do
 background do
  User.make(:email => 'user@example.com', :passWord => 'caplin')
 end

 scenario "Signing in with correct credentials" do
  visit '/sessions/new'
  within("#session") do
   fill_in 'Email', :with => 'user@example.com'
   fill_in 'Password', :with => 'caplin'
  end
  click_button 'Sign in'
  expect(page).to have_content 'Success'
 end

 given(:other_user) { User.make(:email => 'other@example.com', :password => 'rous') }

 scenario "Signing in as another user" do
  visit '/sessions/new'
  within("#session") do
   fill_in 'Email', :with => other_user.email
   fill_in 'Password', :with => other_user.password
  end
  click_button 'Sign in'
  expect(page).to have_content 'Invalid email or password'
 end
end

--结束END--

本文标题: Nodejs学习笔记之测试驱动

本文链接: https://www.lsjlt.com/news/12254.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql学习笔记之基础测试
    10. 基础测试 10.1...
    99+
    2024-04-02
  • PHP学习笔记:代码测试与单元测试
    在软件开发领域,代码质量的保证是至关重要的。为了确保代码的正确性和稳定性,开发人员需要对代码进行测试。而单元测试是一种常用的测试方法,它能够对代码中的最小单元进行验证,以保证其功能的正确性。代码测试代码测试是一种广义上的测试方法,它包括了单...
    99+
    2023-10-21
    PHP学习笔记:代码测试 PHP学习笔记:单元测试 PHP学习笔记:测试
  • android学习笔记之View的滑动
    目录前言1.layout方法2.接下来,我们看看offsetLeftAndRight()与offsetTopAndBottom()方法3.第三个方法:LayoutParam...
    99+
    2023-01-03
    android页面滑动 android view android view的移动滑动
  • Yii2 学习笔记之 GridView DetailView
    Yii2中的GridView和DetailView是两个非常实用的小部件,用于展示数据。GridView用于展示多条数据,而Deta...
    99+
    2023-09-28
    Yii2
  • Python学习笔记之线程
    目录1.自定义进程2.进程与线程3.多线程4.Thread类方法5.多线程与多进程小Case6.Thread 的生命周期7.自定义线程8.线程共享数据与GIL(全局解释器锁)9.GI...
    99+
    2024-04-02
  • Python3学习笔记之is == in
    意义 ==比较的是两个对象的值是否相等,比较常用 a = [1, 2, 3] b = [1, 2, 3] print(a == b) #True is比较的是两个对象是不是同一个实例对象,它们的内存地址是否相同...
    99+
    2023-01-31
    学习笔记
  • Java学习笔记之Maven篇
    目录一、maven能做什么?1.1 两大应用1.2 maven 的核心二、maven结构:2.1 maven工程标准目录结构2.2 配置系统变量2.3 常用命令三、应用:idea集成...
    99+
    2024-04-02
  • 【李沐】动手学深度学习 学习笔记
    目录 【内容介绍】动手学深度学习-基于pytorch版本【脉络梳理】预备知识数据操作数据预处理线性代数矩阵计算自动求导 线性神经网络线性回归深度学习的基础优化算法线性回归的从零开始实现线...
    99+
    2023-08-31
    深度学习 学习 python
  • HTML语法学习笔记:记录您的学习之旅
    HTML 简介 超文本标记语言 (HTML) 是互联网上网页的基础。它是一种标记语言,用于定义网页的结构和内容。学习 HTML 语法对于成为一名成功的网络开发者至关重要。 HTML 元素 HTML 中的基础构建块是元素。它们由一对尖括号...
    99+
    2024-03-09
    HTML、语法、学习、教程、网络开发
  • Matplotlib学习笔记之plt.xticks()用法
    目录前言函数功能函数语法函数参数例子参考总结前言 在学习ML的过程中,遇到plt.xticks()的使用,在网上看别人写的教程,看得有点头晕,最后看官方文档和一个例子才明白了其用法。...
    99+
    2024-04-02
  • XenDesktop学习笔记3之架构
    架构: 1、物理组件: DDC     一台              PVS+XenCenter 一台 AD+DHCP+DNS 一台 XenServer   一台 用户设备 一台 2、软件要求 XenServer 5.5         ...
    99+
    2023-01-31
    架构 学习笔记 XenDesktop
  • PHP Switch 语句之学习笔记
    PHP 中的 Switch 语句用于执行基于多个不同条件的不同动作。 Switch 语句 如果您希望有选择地执行若干代码块之一,请使用 Switch 语句。 使用 Switch 语句...
    99+
    2022-11-15
    PHP Switch
  • PyCharm学习笔记(二) 调试配置
      选择PyCharm编译器 注意工程默认使用的解释器可能是Pycharm自带的,而不是单独安装的。   ...
    99+
    2023-01-30
    学习笔记 PyCharm
  • python学习笔记(九)之语句1
    python学习笔记(九)之语句1printpython2中,print是一个语句,python3中它是一个函数。实例1: print "hello,world!"hello,world!print "hello","world!"h...
    99+
    2023-01-31
    语句 学习笔记 python
  • TypeScript学习笔记之类型缩小
    目录类型缩小什么是类型缩小呢?常见的类型保护有如下几种:typeof平等缩小instanceofin总结类型缩小 什么是类型缩小呢? 类型缩小的英文是 Type Narrowing;...
    99+
    2024-04-02
  • AngularJS学习笔记之TodoMVC的分析
    TodoMVC是一个开源项目,旨在提供使用不同JavaScript框架实现相同任务(即创建、编辑、删除待办事项)的示例代码。在Ang...
    99+
    2023-08-17
    AngularJS
  • Android学习笔记之蓝牙功能
    本文实例为大家分享了Android学习笔记之蓝牙功能的具体代码,供大家参考,具体内容如下 蓝牙:短距离无线通讯技术标准。蓝牙协议分为4层,即核心协议层、电缆替代协议层、电话控制协议层...
    99+
    2024-04-02
  • Python学习笔记6——动态类型
    参考博客:Python进阶09 动态类型  Python深入06 Python的内存管理 都是非常棒的文章 其实这都是我前两天通过手机看的博客,感觉get到了新知识、新技能,今天早上挖的坑,因为上午有课(电子技术课程设计,嵌入式系统实验室...
    99+
    2023-01-30
    学习笔记 类型 动态
  • 想要学习 Go 编程吗?试试这些 Linux 算法学习笔记!
    如果你对 Go 编程感兴趣,那么你需要一些学习笔记来帮助你更好地掌握这门语言。而对于 Linux 算法,你也需要一些学习笔记来更好地掌握它们。本文将介绍一些关于 Linux 算法学习笔记的内容,以帮助你更好地学习 Go 编程。 一、什么是 ...
    99+
    2023-09-23
    编程算法 linux 学习笔记
  • 测试驱动技术系列之怎么用pytest实现测试数据驱动
    本篇内容主要讲解“测试驱动技术系列之怎么用pytest实现测试数据驱动”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“测试驱动技术系列之怎么用pytest实现测试数据驱动”吧!一组参数化数据定义参...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作