前端测试预研报告

334 阅读8分钟

1.前端测试框架研究 测试,英文中叫做Test。顾名思义,在程序界中,测试的作用就是在开发过程中发现bug并进行解决,尽量避免把项目发到线上的时候出现bug对用户造成困扰。测试,可以说在程序界非常的普及,比如常见的接口测试,压力测试,集成测试等。但是这些测试大部分都是针对后端 和 运维等, 关于前端测试,却很少看见相关报告.

     前端团队将利用目前市场上主流的测试模式和测试框架,进行研究和评估, 希望我们的研究对前端团队 技术选型方面的判断具有一定的参考价值,也能对那些不是很清楚自动化测试的前端从业者起个介绍和入门的作用。

2.测试开发设计模式 在介绍具体框架和具体测试种类之前,我首先先简要介绍两个知名度很高的测试开发设计模式. 测试开发设计模式好比房子的地基,地基打好才能添砖加瓦.

2.1 TDD(Test Driven Development) - 测试驱动开发 测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。

测试驱动开发的基本过程如下: ① 快速新增一个测试 ② 运行所有的测试(有时候只需要运行一个或一部分),发现新增的测试不能通过 ③ 编写业务代码,尽快地让测试程序可运行,为此可以在程序中使用一些不合情理的方法 ④ 运行所有的测试,并且全部通过 ⑤ 重构代码,以消除重复设计,优化设计结构

2.2 BDD(Behavior-Driven Development)- 行为驱动开发 行为驱动开发,英文全称Behavior-Driven Development,简称BDD, 是一种敏捷软件开发的技术。 它要求先编写某个功能的代码,然后在用测试代码模拟用户操作UI的场景, 来进行功能性测试.

行为驱动开发的基本过程如下:

 ① 编写功能代码
 ② 功能代码编写完成后,用测试代码模拟用户操作UI的行为进行测试
 ③ 如果代码输出达到预期行为,则测试通过
 ④ 如果不通过,优化功能代码

3.测试种类介绍 程序界中测试种类繁多,比如 单元测试 集成测试 端到端测试 回归测试 性能测试 压力测试等. 基于篇幅和时间的原因,本文重点介绍单元测试 和集成测试 。

3.1 单元测试 ( unit testing ) 单元测试,英文全称unit testing,是指对程序中的最小可测试单元进行检查和验证。 一般结合TDD进行使用,是一种白盒测试.

为了便于大家理解,以下使用具体实例来进行参考。 程序员李健现在有一个需求 - 实现一个2数相加 一个2数相减 的函数 那它如何来用TDD的方式进行单元测试呢 。

1. 编写单元测试代码    

2. 运行所有测试, 发现测试不能通过,因为它还没有编写功能代码。

3. 编写功能代码 

4. 运行所有测试,发现测试不能通过,因为2数相减函数实现错误 。 

5. 修改功能代码,测试通过.

总结 - 单元测试,就是对一个单元或者组件进行测试. 针对组件代码进行测试,需要知道组件的内部实现代码,所以也是白盒测试.

3.2 单元测试 ( unit testing ) 如何和 React框架相结合 Zenlayer前端团队对市面上对前端测试框架进行调研, 从 1. 社区生态环境 2. 测试工具框架在github上点赞排行 3. 测试框架API友好程度 4. 测试框架开发 是否有专业团队成员进行维护和更新 这4点进行调研和考查.

最终选用 基于Jest+Enzyme的React单元测试 :
Jest是Facebook发布的一个开源的、基于Jasmine框架的JavaScript单元测试工具,支持断言、仿真、快照测试、测试覆盖率报告等。 github.com/facebook/je…

Enzyme获得React 官方的推荐,Airbnb开源的React测试类库Enzyme提供了一套简介强大的API,并通过jQuery风格的方式进行DOM处理,开发体检十分友好。 github.com/enzymejs/en…

3.2.1 Jest能干什么,为什么使用Jest。 Jest的作用有点像lodash这样的函数库,里面封装了测试工具函数库,运用这个函数库能大大减少我们测试代码量.

具体实例比较 -
用原先js实现的测试代码 用jest 里面expected函数实现的测试代码,代码量大大精简

3.2.1 Enzyme能干什么,为什么使用 Enzyme。 Enzyme 它提供像jquery风格的API, 能让你进行dom操作, 对dom里面元素节点进行测试, 同时它的功能比jquery强大, 因为它还支持对dom 元素内部对 state 和 props 状态数据进行测试 。

关于Jest和Enzyme环境搭建,及API介绍和使用说明, 大家有兴趣可以去查看官方网站 , 如果要详细讲这2种框架 , 其文字数和篇幅量 远多于本文。

3.3 集成测试 ( integration testing ) 集成测试,英文全称 integration testing,在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。 一般结合BDD进行使用,是一种黑盒测试.

为了便于大家理解,以下使用具体实例来进行参考。 程序员俊杰现在有一个需求 - 实现一个TodoList网站 那它如何来用BDD的方式进行集成测试呢 。

具体实例比较 -
TodoList组件 用测试代码模拟用户操作TodoList组件进行测试

3.4 集成测试 ( unit testing ) 如何和 React框架相结合 集成测试同样也可以用Jest和Enzyme进行实现, Enzyme操作dom元素来模拟用户行为, jest工具库函数来验证行为结果是否正确.

总结 - 集成测试,就是对所有组件的集合进行测试. 针对组件的集合和行为进行测试,并不需要知道组件的内部实现代码,所以也是黑盒测试. 4. 后记:前端自动化测试,值不值得? 近几年前端工程化的发展风起云涌,但是前端自动化测试这块内容大家却似乎不太重视。虽然项目迭代过程中会有专门的测试人员进行测试,但等他们来进行测试时,代码已经开发完成的状态。与之相比,如果我们在开发过程中就进行了测试(直接采用 TDD 和BDD 开发模式、或者针对既有的模块写用例),会有如下的好处:

1.保障代码质量和功能的实现的完整度 2.提升开发效率,在开发过程中进行测试能让我们提前发现 bug ,此时进行问题定位和修复的速度自然比开发完再被叫去修 bug 要快许多 3. 便于项目维护,后续任何代码更新也必须跑通测试用例,即使进行重构或开发人员发生变化也能保障预期功能的实现

当然,凡事都有两面性,好处虽然明显,却并不是所有的项目都值得引入测试框架,毕竟维护测试用例也是需要成本的。

根据本人在实际上在demo测试项目上操作的反馈来看,写测试代码和维护所花费的时间比写业务代码的时间还要多出许多.

对于一些需求频繁变更、复用性较低的内容,比如活动页面,让开发专门抽出人力来写测试用例确实得不偿失。

而那些适合引入测试场景大概有这么几个:

需要长期维护的项目。它们需要测试来保障代码可维护性、功能的稳定性 较为稳定的项目、或项目中较为稳定的部分。给它们写测试用例,维护成本低 被多次复用的部分,比如一些通用组件和库函数。因为多处复用,更要保障质量

以上就是我对前端测试的一点浅见,欢迎斧正。