前端单元测试开发
什么是单元测试?
打个比方,单元测试就像一把尺子,当测量的对象是一个曲面时,也许可以花费大力气去将它抽象成平面,但我更提倡量身定做一把弯曲的尺子去适应这个曲面。无论怎样,单元测试是为了生产代码而写,它应当足够的自由奔放,去适应各种各样的生产代码。
单元测试的目的显而易见,控制数据使用和操作的过程,检验模块和接口能否达到预期的效果
为什么要单元测试
随着项目规模越来越大,逻辑和数据将会变的更复杂;模块负责人的变更,新员工的入职,由于对逻辑和数据结构的不熟悉,为了避免牵一发而动全的风险,导致重复代码堆积。而单元测试更像一个框架、脚手架,让开发更顺畅,代码质量更健壮。
单元测试开发驱动
TDD 测试驱动开发(Test Driven Development)
测试驱动开发(Test Driven Development,英文缩写TDD)是极限编程的一个重要组成部分,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完成全部功能的开发。代码整洁可用(clean code that works) 是测试驱动开发所追求的目的
BDD 行为驱动开发(Behaviour Driven Development)
行为驱动开发是测试驱动开发的进化,但关注的核心是设计。行为驱动开发中,定义系统的行为是主要工作,而对系统行为的描述则变成了测试标准。在行为驱动开发中,我们需要使用通用语言来定义系统行为。而通用语言,实际上是一个最小化的词汇表。我们使用这些词汇来书写故事。选入词汇表的词汇必须具有准确无误的表达能力和一致的含义。
单元测试框架
Jasmine
Jasmine不依赖于任何框架,所以适用于所有的Javascript代码。使用一个全局函数 describe 来描述每个测试,并且可以嵌套。describe函数有2个参数,一个是字符串用于描述,一个是函数用于测试。在该函数中可以使用全局函数 it 来定义Specs,也就是单元测试的主要内容, 使用 expect 函数来测试:
describe('A suite', function () { it('is a spec', function () { var a = true; expect(a).toBe(true); }); });
Mocha
它的作者就是在Github上粉丝6K的超级Jser TJ Holowaychuk ,可以在他的页面上看到过去一年的提交量是5700多,拥有300多个项目,无论是谁都难以想象他是如何进行coding的。 不仅仅是这样,Mocha非常得自由。Mocha将更多的方法集中在了describe和it中,比如异步的测试就非常棒,在it的回调函数中会获取一个参数 done ,类型是function,用于异步回调,当执行这个函数时就会继续测试。还可以使用 only 和 skip 去选择测试时需要的部分。Mocha的接口也一样自由,除了 BDD 风格和Jasmine类似的接口,还有 TDD 风格的 (suite test setup teardown suiteSetup suiteTeardown),还有AMD风格的 exports ,Qunit风格等。同时测试报告也可以任意组织,无论是列表、进度条、还是飞机跑道这样奇特的样式都可以在bash中显示。
前端测试工具 Karma
它使用Nodejs构建,因此跨平台,还支持PhantomJS浏览器,还支持多种框架,包括以上介绍的Jasmine、Qunit和Mocha。一次可以在多个浏览器及设备中进行测试,并控制浏览器行为和测试报告。虽然它不支持Nodejs的测试,不过没什么影响,因为Nodejs并不依赖于浏览器。