前回の記事で、リダイレクト設定に関する話をしました。
今回は、そのリダイレクトが正しく行われているかをテストしようという話です。
そもそもテストなんかしなくて、目視でいいんじゃないの?
たしかにそう思う人もいるかと思います。
しかし、リダイレクト先がたくさんあったり、301でリダイレクトしたいのに302でリダイレクトしている何てチェックを人力でやるのはナンセンスだと思います。
なにより、簡単なスクリプトで検査できるのにそんな人力でやる必要ないし、人件費的に無駄だと思います。
mochaとは
mochaとはJavaScriptのテスティングフレームワークと言われるもので、テストに関する機能の提供、テスト結果の判定などをしてくれるライブラリです。
mocha自体にはアサーションの機能をもってなくて、値に関する検知はChaiなどの別のライブラリを使います。
mochaの使い方はテストフレームワーク mochaで詳しく解説されてるので、読んでみると非常に勉強になります。
テストコードを書く
さて、テストコードを書いていくための手順を紹介していきたいと思います。
まずは、作業用のディレクトリだけ確保してください。
今回は~/nodejs/test
ってディレクトリで作業します。
また、nodejs、npmのインストールは終わっていることとして説明します。
そして、nodeのバージョンは0.12.0
を使っています。
package.jsonの用意と、必要なライブラリの準備
npm initでpackage.jsonを用意します。
次に必要なライブラリを用意します。
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点になります。
- 指定したurlが、301リダイレクトが発生していることを確認する
- リダイレクト先のURLが存在する(200)で返すか
- リダイレクトした先の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で公開しています。