位置: 编程技术 - 正文

Nodejs学习笔记之测试驱动(nodejs.)

编辑:rootadmin

推荐整理分享Nodejs学习笔记之测试驱动(nodejs.),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs实例教程,nodejs实例教程,nodejs入门,nodejs.,nodejs基础知识,nodejs基础知识,nodejs入门教程,nodejs实战教程,内容如对您有帮助,希望把文章链接给更多的朋友!

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

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

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

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

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

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

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

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

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

Nodejs学习笔记之测试驱动(nodejs.)

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

某种意义上来说,测试用例和测试覆盖率是用来提高开发者对自己代码自信心的工具。但是,他们也不是万能的。测试用例里面总可能会漏掉一些参数的可能性,当然你的代码里面也没有为这种可能性进行代码的编写,最终测试用例覆盖率只能告诉你你写的代码我们都帮你检测过了测试过了,对于你没有考虑到的可能性,表示无能为力。所以尽可能编写严格的代码,例如 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 的代码结束这段内容:

PHP和NodeJs开发的应用如何共用Session 首先了解下session的机制客户端(浏览器中)cookie作为键值,匹配服务器端的一个数据。然后客户端每次在HTTP请求里面带着那个cookie,然后服务器端理所

使用iojs的jsdom库实现同步系统时间 使用iojs的jsdom库与

node.js 使用ejs模板引擎时后缀换成.html 这是一个小技巧,看着.ejs的后缀总觉得不爽,使用如下方法,可以将模板文件的后缀换成我们习惯的.html。1.在app.js的头上定义ejs:varejs=require('ejs');2.注

标签: nodejs.

本文链接地址:https://www.jiuchutong.com/biancheng/377998.html 转载请保留说明!

上一篇:Nodejs学习笔记之入门篇(nodejs实战)

下一篇:PHP和NodeJs开发的应用如何共用Session(php与nodejs)

  • 商品房价格居高不下的原因
  • 关税是直接税还是间接税
  • 孳息和利息的区别
  • 社保按基数交工资按时发怎么做账
  • 信用减值损失可以并入哪个科目
  • 其他综合收益为什么要结转
  • 消费税的征收方式是代收代缴
  • 事业单位退休人员独生子女费如何发放
  • 贸易公司买进卖出
  • 异地承包工程预缴什么税?
  • 发票已入账跨年可以红冲重开吗
  • 增值税优惠的二级明细科目
  • 业务招揽方式
  • 利润表其他综合收益的税后净额怎么算
  • 现金流量净额为负说明什么
  • 福利费提取后未使用能否税前扣除?
  • 以前年度收入调整账务处理怎么做
  • 怎么计算附加税税率
  • 应收账款核销如何做账
  • 辅助核算的内容
  • 以前年度损益调整借贷方向
  • mac怎么airdrop给ipad
  • 设备安装需要预缴吗
  • 工程事故赔偿协议书怎么写
  • 提前退休的一次性补贴收入
  • win7系统配置服务哪些启用
  • 逾期增值税扣税凭证
  • 总包缴税
  • 增值税税收类型有哪些
  • 企业发放年终奖政府有哪些规定?
  • php文件合并
  • 递延所得税资产借贷方向
  • 基于springboot的毕设
  • 工程服务费会计怎么做账
  • php实现留言板功能
  • 分支机构可以不分配所得税吗?
  • php gd
  • 研发和技术服务税率由6%变为3%
  • 为什么生产工人工资不属于固定成本
  • 过来人告诉你:女人最珍贵的三种东西,舍得给你说明爱你
  • php怎么获取post数据
  • vant ui
  • 长期待摊费用账务
  • 独资设立的有限公司
  • 生产成本结转库存商品,怎么算知道数量以及单价
  • php调用第三方接口代码
  • 在mysql中子查询是
  • 预付卡账务处理在注会
  • 进项税通俗易懂
  • sqlserver存储过程写法
  • 非独立核算增值税汇总缴纳吗
  • 劳务费用如何做账
  • 事业单位未取得相关证书不予受理
  • 工程未完工开了发票怎么做账
  • 税控盘上报
  • 股东以私人名义出资
  • 非公益捐赠如何入账
  • 预付账款摊销会计分录
  • 工会经费的计提比例
  • 收购一家公司需要多少股份
  • 对外投资信息忘记填了
  • 会计凭证数字书写模板
  • VMWare linux mysql 5.7.13安装配置教程
  • u盘安装centos7安装详细图解
  • CentOS ip_conntrack: table full, dropping packet 的解决方法
  • 如何避免系统性风险
  • 光纤拨号方式
  • 提示explorer.exe
  • win10系统怎么设置默认打印机
  • bootstrap表格内容模板
  • android新手入门
  • for语句的执行过程图解
  • python3+PyQt5实现使用剪贴板做复制与粘帖示例
  • python获取文件内所有函数
  • 深圳市税务局陈建新
  • 社保ukey怎么使用
  • 开具红字增值税专用发票通知单
  • 公务员考试税局
  • 法治税务演讲稿结尾
  • 杜蕾斯验证真伪扫描
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设