探秘前端单元测试的秘密:让代码快速稳定的最佳实践!

这篇具有很好参考价值的文章主要介绍了探秘前端单元测试的秘密:让代码快速稳定的最佳实践!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一说到单元测试,可能对于业务一线同学来说,心理立马就会无形中有一种压迫感,心想 “业务都做不完了,写个球的单元测试,先保证功能完备,赶紧上线才是王道”,这句话的核心是以业务为重,没任何问题,但是,业务在任何时候都是重要的,除了业务,其实还有效率。

没有效率,就没有生产力,没有生产力就没法给业务铺垫更广阔的道路,效率如此重要,那我们该从哪些维度来提升效率呢?从笔者的个人经验来看,不管是在什么领域,我们在提效道路上一定会经历以下几个阶段:

  • 规范标准化
  • 机器自动化
  • 系统平台化
  • 人工智能化

要经历以上过程,必须要有代码质量的保证,如果我们不关注代码质量,我们的研发效率是没法做到质的飞越的,原因很简单,就是人类在解决各种问题的过程中,总会不由自主的引入其他问题,从而导致系统稳定性降低,如何在漫长的系统维护过程中,保证每次发布的代码质量则是我们一直在持续探索的方向。所以现在软件测试在高校里都有专门的学科,同时软件测试岗位在互联网公司里也是非常常见的,可见,企业对系统稳定性的要求是非常非常高的。说了那么多,下面直接进入正题。

什么是单元测试?

单元测试,是指对软件中的最小可测试单元进行检查和验证,也就是说一个测试单元往往是一个原子型函数,同时,单元测试的编写者必须是作者本人,拥有单元测试的程序有以下几个好处:

1、它是一种验证行为

程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支援。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。

2、它是一种设计行为

编写单元测试将使我们从调用者观察、思考。特别是先写测试(Test First),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。

3、它是一种编写文档的行为

单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。

4、它具有回归性

自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:310357728【暗号:csdn999】

探秘前端单元测试的秘密:让代码快速稳定的最佳实践!,经验分享,自动化测试,软件测试,前端,单元测试,压力测试,jmeter,自动化测试,测试工程师

单元测试用例设计

任何一个单元测试都应该包含:

  • 正常输入
    • 离散覆盖参数值域
  • 边界输入
    • 空值验证
    • 零值验证
    • 最大值验证
  • 非法输入
    • 入参数据类型非法
    • 内存溢出验证

幂等

对于单元测试来说,保证其幂等性非常重要,幂等就是在相同输入的前提下,其输出结果不随时间而改变。

所以,我们可以看到,对于函数式编程语言来说,写单元测试则是非常容易的事情,因为在函数式范式中,我们的函数都是纯函数,在范式层面上就已经约束了开发者写出幂等的程序,那么,在javascript领域,我们想要写出质量更高,对测试友好的代码的话,则需要尽可能的写出各种纯函数,从而保证幂等性。

对于前端而言,其实还包含UI界面的幂等,如何更加高效的保证界面幂等,我们是可以借助jest的快照能力实现html结构级别的幂等验证或者通过gemini的离线截图能力来实现像素级的幂等验证。

Mock

  • Mock数据,在编写单元测试用例的过程中,构造Mock数据是非常重要的实现手段,因为构造数据就是我们在构造输入的过程,比如正常输入/边界输入/非法输入
  • Mock环境,对于前端自动化测试而言,我们的环境Mock,往往是通过jsdom之类的库实现环境mock,保证离线场景下可以验证依赖浏览器API的程序逻辑
  • Mock事件,对于离线场景来说人机交互事件是不会有真实人类参与的,所以,我们需要Mock人机交互事件,帮助程序逻辑实现UI界面的交互功能性测试,在React中,是可以通过enzyme来实现Mock事件
  • Mock模块/第三方包,有些场景我们的程序依赖了某些第三方包,但是第三方包会引入副作用,比如axios,如果被测试的程序使用了该模块,它会走真实的发请求逻辑,这样还需要开一个mock请求服务,如果有一个模块拦截Mock能力,我们就不需要再开一个mock请求服务了,恰好jest提供了模块mock的能力,对于这类问题便可以轻松解决。
  • Mock函数/类,在Javascript语言中,函数的入参同样也可以是函数(匿名函数),这恰好是Js最灵活的地方,但是如果参数是函数,则会使得测试用例的编写难度大大提升,我们很难知道入参函数的调用情况,所以,如果我们可以跟踪入参函数调用情况,就能很轻松的验证函数式编程范式下的程序逻辑,恰好jest提供了一个函数Mock能力,可以帮助用户快速Mock一个可以跟踪其调用情况的匿名函数。同样,对于类也是,jest提供了mock类的能力,帮助用户跟踪一个类实例的使用过程。

白盒覆盖

白盒覆盖就是测试用例要尽可能的覆盖程序内部的所有分支语句,从而整体性的保证代码质量。

我们都知道,覆盖率是衡量单元测试质量的核心指标,但是,对于TDD而言,我们肯定不可能做到一开始就达到100%的覆盖率,所以,正常的单元测试用例,往往是先从黑盒用例来写,也就是程序对外暴露的API层面的测试,前期先将这部分的单测覆盖全,后期,我们在bugfix或者feature addtion的过程中可以逐步增加测试用例,最终逐步达到80%以上的覆盖率即可满足白盒覆盖的效果。

单测定级

根据我们前面所述的白盒覆盖,覆盖率是一个非常客观的指标,但是覆盖率对于开发者的认知模型而言是不够清晰结构化的,所以,我们还需要对覆盖率再做一次结构化定级,方便开发者一步步完善单元测试,下面让我们来枚举一下所有的单测级别:

  • Level1:正常流程可用,即一个函数在输入正确的参数时,会有正确的输出
  • Level2:异常流程可抛出逻辑异常,即输入参数有误时,不能抛出系统异常,而是用自己定义的逻辑异常通知上层调用代码其错误之处
  • Level3:极端情况和边界数据可用,对输入参数的边界情况也要单独测试,确保输出是正确有效的
  • Level4:所有分支、循环的逻辑走通,不能有任何流程是测试不到的
  • Level5:输出数据的所有字段验证,对有复杂数据结构的输出,确保每个字段都是正确的

自动化单元测试

其实前面已经提到过了,Jest,就是一款自动化单元测试解决方案,它基本上满足了前端单元测试的所有测试需求,而且它还是一款零配置解决方案,顾名思义,就是最简单场景下是无需任何配置即可快速编写测试用例。所以使用Jest,前端写测试用例就变得十分容易了。本文不会介绍具体jest该如何使用,它有哪些API,因为此类文章到处都能找到,本文更多的是从测试方法论出发探讨单元测试的实施方案。

提高测试用例编写效率

有了Jest,我们在写单元测试用例的配置成本已经很低了,所以,单元测试的成本,更多的是编写测试用例上,

要提高测试用例编写效率,我们主要从几个方向来提高:

  • 定制标准用例模板,让开发者做填空题,而非选择题
  • 制定单元测试开发规范,帮助开发者写出统一一致的单元测试用例,也方便后续协同开发维护
  • 渐进式编写测试用例,借助bugfix/feature addtion过程逐步完善测试用例,最大化减轻前期时间压力

React组件单元测试规范


1. 测试文件统一在src/__tests__目录中维护

主要是Follow Facebook的目录命名规范


2. 测试文件命名与React组件命名保持一致,后面以.spec.js结尾

主要是Follow Facebook的测试文件命名规范,比如:Form.spec.js


3. 测试用例使用test("功能描述",()=>{})函数描述用例单元

针对最小功能单元的测试用例主要集中在该函数内


4. 一组功能集合测试使用describe("功能集合描述",()=>{})函数描述功能集合

一个测试文件只能描述一个功能集合,这个功能集合可以是一个React组件,也可以是一个cjs模块


5. UI测试套件统一使用enzyme

使用enzyme可以借助jquery like的选择器方便的对DOM渲染结果做校验


6. React组件测试用例必须包含

  • API属性覆盖性测试用例
  • DOM快照比对,幂等校验
  • 私有Utils函数测试用例,千万不能忽略Utils函数的测试用例,很多时候,bug就出在这上面


7. 对DOM结构做用例校验

一个标准的React组件测试用例的输入往往是组件配置或交互事件,输出则是具体的DOM结构,我们的用例校验也都是对DOM结构做用例校验


8. bugfix/feature addtion必须要有对应的单元测试用例才能发布


9. 团队协作,MR/PR必须要有对应的单元测试用例才能发布

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

探秘前端单元测试的秘密:让代码快速稳定的最佳实践!,经验分享,自动化测试,软件测试,前端,单元测试,压力测试,jmeter,自动化测试,测试工程师

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

探秘前端单元测试的秘密:让代码快速稳定的最佳实践!,经验分享,自动化测试,软件测试,前端,单元测试,压力测试,jmeter,自动化测试,测试工程师

探秘前端单元测试的秘密:让代码快速稳定的最佳实践!,经验分享,自动化测试,软件测试,前端,单元测试,压力测试,jmeter,自动化测试,测试工程师

 文章来源地址https://www.toymoban.com/news/detail-755476.html

到了这里,关于探秘前端单元测试的秘密:让代码快速稳定的最佳实践!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单元测试的最佳实践

    本文 1-2章 是单测的介绍,如果需要直接看整合教程,直接跳至 第3章 看干货; 在复杂系统的开发中,我们经常需要做单元测试。但又由于单元测试没有形成标准,而经常遇到这样的问题: 直接写一个main函数对需要的方法进行测试 单元测试过于复杂,有时候又懒得做单元测

    2024年02月04日
    浏览(27)
  • “六梦探秘:H123456标签的秘密”

    一个叫做“六梦”的神秘天才。 他拥有着超凡的修为和神秘的能力,能够驾驭天地元气,操纵风云变幻。 有一天,六梦来到一座神秘的山洞里,里面有无数宝藏和秘密。 他看到洞里布满了迷雾,无法辨认出前方的路。 这时,他想到了 网页设计中的h1到h6标签 。 六梦决定使

    2023年04月23日
    浏览(17)
  • 单元测试编写最佳实践(ChatGPT+Mockito+JUnit)

    基于 springboot 微服务架构给单元测试带来的问题: springboot 单元测试启动家长过程非常缓慢,后期服务启动达到分钟级,非常影响效率 服务之间相互依赖非常严重,单元测试的运行非常依赖其它服务稳定性 第三方服务和中间件,测试过程产生大量垃圾数据,污染环境,非常

    2024年02月09日
    浏览(36)
  • 前端开发者必备:Nginx部署前端项目,让你的Web应用快速、稳定、安全地运行

    Nginx是一个高性能的HTTP和反向代理服务器,它可以用来部署前端项目,提供静态文件服务、负载均衡、缓存等功能。本文将介绍如何使用Nginx部署前端项目。 1. 安装Nginx 首先需要安装Nginx,可以通过源码编译安装,也可以通过包管理器安装,例如Ubuntu下可以使用以下命令安装

    2024年02月13日
    浏览(37)
  • 探秘Awesome-Android-Architecture:构建高效安卓应用的秘密武器

    项目地址:https://gitcode.com/JsonChao/Awesome-Android-Architecture 在快速发展的移动应用领域,高效的安卓应用开发至关重要。为了帮助开发者们更好地理解和实践先进的架构模式,我们向您推荐一个开源项目——Awesome-Android-Architecture。该项目由 JsonChao 创建并维护,它是一个集合了各种

    2024年04月16日
    浏览(42)
  • 【稳定性】秘密武器--功能开关技术

    继上篇【稳定性:关于缩短MTTR的探索】后,看到一些线上问题应急预案采用的是回滚方案, 但是在大部分牵扯代码场景下,开关技术才是线上问题快速止血的最佳方式 。比如履约平台组的Promise作为下单黄金链路,如遇线上问题的话, 采用通用的回滚方式需要5-10+分钟(500+台

    2024年02月08日
    浏览(41)
  • 探秘C#中的秘密通道:五种引人注目的方法调用内部或私有方法

    在 C# 中,可以使用不同的方法调用内部或私有方法。下面分别介绍通过反射、MethodInfo.CreateDelegate、表达式(树)、动态方法(call)、动态方法(calli)这五种方法。 使用反射可以访问和调用内部或私有方法。 通过 MethodInfo.CreateDelegate 方法可以创建委托,然后调用私有方法

    2024年02月05日
    浏览(43)
  • 前端测试:单元测试

    你是否有以下烦恼: 当你加班加点完成一个功能后,提交给测试部,立马返回几个bug 当你修改完bug后,并检查了好几遍,确保无误后,提交给测试部,有返回几个bug …… 对于以上情境,你是否有过疑问,为什么检查都没问题了还是出现bug?以上这些都是因为没有做好测试。

    2024年02月11日
    浏览(26)
  • 如何快速做单元测试?

    首先写unit test之前,要确认自己的测试遵循 两个原则 : 1、尽量不要干涉原来的代码。从阅读代码的体验来说,不要让你的测试(哪怕是一小段if..else...的代码)出现在你准备测试的代码中。 2、代码要只是测试某个class里面的一个特定的function。这个function不能太简单,太简

    2024年02月14日
    浏览(19)
  • 快速上手 SpringBoot 单元测试

    ✏️作者:银河罐头 📋系列专栏:JavaEE 🌲 “种一棵树最好的时间是十年前,其次是现在” 单元测试(unit testing),是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 1.可以⾮常简单、直观、快速的测试某⼀个功能是否正确。 2.可以跳过项目里的其他模

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包