もやもやエンジニア

IT系のネタで思ったことや技術系のネタを備忘録的に綴っていきます。フロント率高め。

Node.js + Travis CIを試してみる その1

Node.jsでもCI(継続的インテグレーション:continuous integration)出来るのかな?と思い、調べたところ出来そうだったので、まずはTravis CIを使って回してみます。

概要

GitHubにpushしたらTravisが自動でテストを実行し、テスト結果をGitHubに表示してpushしたコードが正しく動いているのかを判定する、というような仕組みを作ってみます。

準備

GitHubTravisでアカウントをそれぞれ登録します。んでGitHubリポジトリを作っておきます。作った後、Travisのサイトを開きログインします。そして右上のアカウントを押すと、GItHubリポジトリの一覧(下のキャプチャ参照)が出てくるので、先ほど作ったリポジトリを選択してONにしておきます。これでGitHubTravisの連携が開始されます。

f:id:Rei19:20140611092557p:plain

仕様

Travisは言語毎にヘルプドキュメントが作成されているので、まずはそれを読み込んでみます、英語スキルも上げたい。。。

http://docs.travis-ci.com/user/languages/javascript-with-nodejs/

ほんでポイントとしては以下の通り

1) .travis.ymlをプロジェクトルートに作り、テスト対象の言語がNodeであるということとテストするバージョンを書いておく。

2) テストのコマンドはnpm testを実行する。これはpackage.jsonのscriptsにtestを書いとけという話ですね。

3) テスト前にnpm installを実行する。必要なモジュールはpackage.jsonに全部書いとけばOKという話ですかね。

やってみよう

では実際にTravisに働いてもらいます。まずはローカルでブランチを切りwipでプルリクエストを送って、gitignoreとpackage.jsonを追加してpushしてみます。

.gitignore

node_modules/

package.json

{
  "name": "travisTest",
  "version": "0.0.1",
  "description": "Travisのサンプルテスト",
  "scripts": {
    "test": "vows test/division-by-zero-test.js --spec"
  },
  "repository": "https://github.com/rei-m/travisTest",
  "author": "Rei Matsushita",
  "license": "MIT",
  "dependencies": {
    "vows":"*",
    "assert":"*"
  }
}

今回はvowsというビヘイビア駆動開発用のフレームワークを使ってみます。assertはまんまですね。ここで大事なのは "test": "vows test/division-by-zero-test.js --spec"の部分です。pushしてTravisが走るとnpm testが実行されて、実体はvows test/division-by-zero-test.js --specが実行されるという形ですね。

とりあえずこれでpushしてGitHubのプルリクエストの画面を開いてみます。そうするとmergeボタンが黄色くなってプルリクエストのコミットログの左にいつもと違うマークが出るはずです。これはテスト実行中の状態でしばらく待つと×マークが出るはずです。

f:id:Rei19:20140616092224p:plain

この×マークはpushを契機にTravis CIが走りテストを行った結果、テストが失敗しましたよということを意味しています。マークを押すとTravis側の画面に飛んでテスト結果を見る事が出来ます。テスト結果を見ると下のようなログがつらつらと出ていますね。
f:id:Rei19:20140616093256p:plain

失敗しているログを見ると.travis.ymlが見つからないと言われています。では次に.travis.ymlとテストモジュールのtest/division-by-zero-test.jsを追加してpushしてみます。

.travis.yml

language: node_js
node_js:
  - 0.11
  - 0.10

test/division-by-zero-test.js

var vows = require('vows'),
    assert = require('assert');

// Create a Test Suite
vows.describe('Division by Zero').addBatch({
    'when dividing a number by zero': {
        topic: function () {
            return 42 / 0;
        },
        'we get Infinity': function (topic) {
            assert.equal (topic, Infinity);
        }
    },
    'but when dividing zero by zero': {
        topic: function () {
            return 0 / 0;
        },
        'we get a value which': {
            'is not a number': function (topic) {
                assert.isNaN (topic);
            },
            'is not equal to itself': function (topic) {
                assert.notEqual (topic, topic);
            }
        }
    }
}).export(module);

このテストモジュールはvowsのサイトに載っていたサンプルコードで0除算の計算結果をassertかけているだけなので深い意味はありません。では、こちらを置いてpushしてみます。

コミットログを見ると以下のように緑のチェックが入ってマージボタンも緑色になっているはずです。これはTravisのテストが正しく通ったのでマージ出来ることを意味しています。
f:id:Rei19:20140616141950p:plain

では意図的に失敗させてみましょう。42 / 0となっている部分を42 / 2にしてエラーを起こしてみます。push後しばらく待つと失敗するはずです。Travis側の画面を見てみましょう。
f:id:Rei19:20140616142531p:plain

テストを実行した結果、we get Infinityの部分でテストがこけているのがわかります。Travisが正しくGitHubにテスト結果を返していますね。

テストが通れば後はマージをして終了です。今回はサンプルモジュールでのテストだったので次回は実践的なテストを書いて試してみます。