• 首页
  • nodejs
  • node.js 单元测试 Unit Test 及 程序持续集成 CI 工具

node.js 单元测试 Unit Test 及 程序持续集成 CI 工具

CI.png

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… 后果自负!

困难点都已经克服了,剩下的就是实作的细节

出自:node.js 单元测试 Unit Test 及 程序持续集成 CI 工具



回到顶部