node.js 单元测试 Unit Test 及 程序持续集成 CI 工具
文章目录
JavaScript 单元测试、更因其执行环境复杂无比、自动化门槛超高.
目前 JavaScript 越来越复杂庞大,其实更需要单元测试来确保品质.
但是由于 PhantomJS、Travis CI 等工具… 写 JavaScript 单元测试变得轻松许多.
今天来聊一下关于 javascript 单元测试 Unit Test 及 CI 持续集成工具.
Unit Test 单元测试
我们常写一些工具类的 JavaScript Function、甚至包装成组件、以方便未来重复使用.
单元测试 (Unit Test) 是另外一份代码、用来检查这些代码的正确性.
例如过去我们得替自己撰写 trim 的方法、以达成去除头尾的多余空白,你可以替它写以下的 Unit Test 做检查.
// 以下的代码得搭配一些工具才能执行,这边仅用来示意。
TestCases = {
"应该要移除左侧的空白": function () {
var value = " Awoo~", // 输入值
expected = "Awoo~"; // 预期得到的结果
Assert.areEqual(expected, trim(value)); // 经过 trim 后两者必须相同
},
"应该要移除右侧的空白": function () {
var value = "Awoo~ ", // 输入值
expected = "Awoo~"; // 预期得到的结果
Assert.areEqual(expected, trim(value)); // 经过 trim 后两者必须相同
}
};
在软件开发流程中,单元测试相当于规格书、需要在实际的代码撰写前就准备好.
好处是什么?对于开发者来说,省下了手动刻测试接口的时间,只需专注于程序的开发、重复地跑单元测试来做 Input/Output 验证、直到通过所有的 Test Case.
此即为 Test-driven Development (测试驱动开发模式)。
什么是 CI 持续集成工具
CI 的全名是 Continous Integration,中文是“持续整合”.
软件开发常见的问题就是不同的开发人员不断地增加 Code,但却缺乏规范及完整测试,所以经过一段时间的累积程序往往变的难以辨认及维护、其他人也没办法接手;或者由于规模变大必须要对程序做翻新以因应需求.所以我们最常有的想法就是“重头再来”,常常因此这样浪费了许多的时间
CI 的主要思路就是将代码拆解成小且易维护的片段,借由每天开发人员的 Commit,CI 系统会持续自动抓取一份来做项目建设 (Build),并且去跑各式各样的测试与检查、产出报告寄送给相关人.以确保代码的品质、也方便未来持续成长.
市面上常见的 CI 系统有 Hudson、Jenkins 这两套软件,你可以建设在公司内部的服务器上.
若你的项目是 Open Source,则可以使用我们今天要讲的 Travis CI:一个别人已经建设好、可直接使用、免费的 CI 系统
单元测试 + CI = 自动化
其实就是让 CI 系统帮忙自动地做单元测试.这样一来不管开发者是否有乖乖使用 Unit Test 来检验正确性,系统都会忠实地帮你检查,若有测试失败则发信告诉相关人.
JavaScript 做自动化测试的困难点、如何解决?
“让 CI 自动做单元测试”听起来很简单,但 JavaScript (Node.js 除外) 跟其他程序语言不太一样的地方在于:开发常会牵涉到浏览器、得透过 DOM API 做事件或节点的存取.
若要执行我们写好的单元测试,势必得打开浏览器才能做 看看传统的 JavaScript Unit Test).
这让我们想利用 CI 达成自动单元测试、增加非常高的难度.
CI 系统得要很聪明:得自动打开浏览器、能执行你的单元测试、还要能得存取测试结果。要串起整个流程有太多事情要做,这也是过去 JavaScript 单元测试先前非常不普及的主因.
那么上面的种种完不成的功能,对于现在日新月异技术更新,没有能难倒我们的.
PhantomJS
对浏览器,我们原本的认知都是有个视窗接口,让人去看并操作.
而 PhantomJS 彻底颠覆了这样的思维:让开发者可以开启一个看不见的 Webkit 浏览器、并用它设计好的 API 接口 去加载任何 URL、获得数据.
通常会用于网页效能的检测(ex. 取得大量 HAR 档做分析)、以及我们目前在讨论的自动测试
Grover
虽然 PhantomJS 能够加载我们的测试网页,但它并不知道该如何执行 Test Cases、也不知道执行后到底是成功还是失败。要自己写吗?这样实在太累人了 :p
我所使用的 Unit Test 工具是 YUI Test (非 YUI 的 JavaScript 项目也可用)
它可搭配一个叫 Grover 的 Node.js 命令行工具使用.
他是YUI Test 与 PhantomJS 之间的桥梁 ,可以替你执行并取得结果!用法如下:
grover Unit Test 路径 --server
Grover 会以当前所在目录为 DocumentRoot、在本机启动一个简单的 HTTP Server、加载你的 Unit Test 所在网页、最后取得测试的结果
Travis CI
因为我们已经克服了主要问题:命令行即可跑 Unit Test.
接下来要达成自动化,其实不管是哪一套 CI 工具都可以达成.
但要找台 Server、设定一堆东西把 Hudson 或 Jenkins 跑起来仍然还是个苦差事 :p
Travis 是个提供给 Open Source 社交使用的免费 CI 服务,他很慷慨地捐出频宽、CPU 运算,让所有的 Open Source 项目都能无痛使用 CI、大幅减少设置时间,真是佛心来着!当然唯一的限制就是你的项目得是公开的,不然有商业机密的代码交给 Travis… 后果自负!
困难点都已经克服了,剩下的就是实作的细节