mocha,chaiを使って、リダイレクトが正しいかチェックする

Twitter ツイート Hatena Bookmark ブックマーク

前回の記事で、リダイレクト設定に関する話をしました。 今回は、そのリダイレクトが正しく行われているかをテストしようという話です。

そもそもテストなんかしなくて、目視でいいんじゃないの?

たしかにそう思う人もいるかと思います。
しかし、リダイレクト先がたくさんあったり、301でリダイレクトしたいのに302でリダイレクトしている何てチェックを人力でやるのはナンセンスだと思います。
なにより、簡単なスクリプトで検査できるのにそんな人力でやる必要ないし、人件費的に無駄だと思います。

mochaとは

mochaとはJavaScriptのテスティングフレームワークと言われるもので、テストに関する機能の提供、テスト結果の判定などをしてくれるライブラリです。 mocha自体にはアサーションの機能をもってなくて、値に関する検知はChaiなどの別のライブラリを使います。

mochaの使い方はテストフレームワーク mochaで詳しく解説されてるので、読んでみると非常に勉強になります。

テストコードを書く

さて、テストコードを書いていくための手順を紹介していきたいと思います。 まずは、作業用のディレクトリだけ確保してください。
今回は~/nodejs/testってディレクトリで作業します。

1
$ mkdir ~/nodejs/test

また、nodejs、npmのインストールは終わっていることとして説明します。
そして、nodeのバージョンは0.12.0を使っています。

package.jsonの用意と、必要なライブラリの準備

npm initでpackage.jsonを用意します。

1
$ npm init

次に必要なライブラリを用意します。

1
$ npm install --save-dev chai mocha coffee-script request

package.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "scripts": {
    "test": "make test"
  },
  "devDependencies": {
    "chai": "^1.10.0",
    "coffee-script": "^1.9.0",
    "mocha": "^2.1.0",
    "request": "^2.53.0"
  }
}

リダイレクト先の定義のファイルを用意する

今回はlist.txtというファイル名で用意します。

1
2
3
4
~^/2014/10/26/.* http://polidog.jp/2014/09/15/usami/;
~^/2014/09/12/.* http://polidog.jp/2014/09/12/swift_mail/;
~^/2014/09/11/.* http://polidog.jp/2014/09/10/mokumoku/;
~^/2014/09/07/.* http://polidog.jp/2014/09/07/go/;

左側は~^/2014/10/26/.*リダイレクト対象のpathになります。
右側はリダイレクト後のURLを指定しています。   正規表現が入っているのでつまりhttp://www.polidog.jp/2014/10/26/にアクセスすると、http://polidog.jp/2014/09/15/usami/にリダイレクトするという事になります。

test.jsファイルを用意します

ファイル名はなんでもいいんですが、こんな感じにテストファイルを作ります。 今回テストする項目は以下の2点になります。

  1. 指定したurlが、301リダイレクトが発生していることを確認する
  2. リダイレクト先のURLが存在する(200)で返すか
  3. リダイレクトした先のurlが正しいかどうか?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var baseUrl, expect, file, fs, line, request;

expect = require('Chai').expect;

request = require('request');

fs = require('fs');

baseUrl = 'http://www.polidog.jp';

file = fs.readFileSync('./list.txt', {
  encoding: 'UTF-8'
}).split("\n");

line = function*(file) {
  var line, recirectUri, target, uri, _i, _len;
  for (_i = 0, _len = file.length; _i < _len; _i++) {
    line = file[_i];
    target = line.replace('\~\^', '').replace('.*', '').replace(';','').split(' ');
    if (target[0].length > 0) {
      uri = baseUrl + target[0];
      recirectUri = target[1];
      yield {
        uri: uri,
        recirectUri: recirectUri
      };
    }
  }
  return null;
};

describe('redirect 302 checks', function() {
  var data;
  for (data of line(file)) {
    it('should return 301:' + data.uri, function(done) {
      request.get({
        followRedirect: false,
        uri: data.uri
      }, function(err, res, body) {
        // 1.指定したurlが、301リダイレクトが発生していることを確認する
        expect(res.statusCode).to.equal(301);
        done();
      });
    });
  }
});

describe('redirected site 200 checks', function() {
  var data;
  for (data of line(file)) {
    it('should return 200:' + data.uri, function(done) {
      request.get(data.uri, function(err, res, body) {
        // 2. リダイレクト先のURLが存在する(200)で返すか
        expect(res.statusCode).to.equal(200);
        // 3. リダイレクト先のURLが存在する(200)で返すか
        expect(res.request.uri.href).to.equal(data.recirectUri);
        done();
      });
    });
  }
});

あとは実行するだけ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ ./node_modules/.bin/mocha --harmony-generators --reporter=spec ./test.js


  redirect 302 checks
    ✓ should return 301:http://www.polidog.jp/2014/10/26/ (61ms)
    ✓ should return 301:http://www.polidog.jp/2014/09/12/ (50ms)
    ✓ should return 301:http://www.polidog.jp/2014/09/11/ (44ms)

  redirected site 200 checks
    ✓ should return 200:http://www.polidog.jp/2014/10/26/ (133ms)
    ✓ should return 200:http://www.polidog.jp/2014/09/12/ (92ms)
    ✓ should return 200:http://www.polidog.jp/2014/09/11/ (90ms)


  6 passing (482ms)

mochaを実行すればいいんですが、今回はgeneratorを使っているので--harmony-generatorsオプションを指定しています。
わりと手間を書けずにhttpのテスト書けちゃうわけです。

altJSでも書ける

たとえばCoffeeScriptを使うことなんかもできます。
その場合は実行時のオプションに--compilers=coffee:coffee-script/registerを指定します。

1
$ ./node_modules/.bin/mocha --harmony-generators --reporter=spec --compilers=coffee:coffee-script/register ./test.coffee

しかし、残念なことに今回の場合coffeeで書くとjs側のfor ofを使いたい場面でCoffeeScriptでfor ofを書くとfor inに変換されてしまい、coffee使うのを諦めてますw

最後に

SEOを考えると、301を間違えて302でリダイレクトさせるのって結構痛いと思います。
そんな時に目視でチェックするよりも確実に正しくチェックができるので、かなりオススメです。

また今回のサンプルはgithubで公開しています。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。