オライリーの本「リファクタリング・ウェットウェア」にある、初心者の効果的な学習方法に以下のような事項がある。
- 明確に定義されたタスクがある
- タスクには適度な難度(やりがい)が必要だが、実行可能でなければならない
- 復習のための繰り返しの機会が与えられ、またエラーを修正する機会も提供されるべきである
上記の学習方法に沿ったいい勉強方法はないかと考えたところ、テストフレームワークによる学習テストが最適なことに気付いた。
- 最小単位の粒度でタスク(テスト)を定義できる
- テスト単位で即時実行できる
- 成功/失敗がわかり、失敗したらすぐに修正することが可能
- 繰り返し実行に優れている
上の効果的な学習方法の事項を全て網羅している。
ということで例としてEffective JavaScriptを読んで気になった、型の異なった比較演算子の挙動のところをテストに書いて学んでみる。
まずテストフレームワークのインストール。
ここではmochaを使ってみる。
npm install -g mocha
次に、実際に動作を確認してみたいことを書いていく。
var assert = require('assert');
describe("型が異なるときの==の挙動", function() {
it("null == undefinedはtrueである", function() {
assert.equal(null, undefined);
});
it("null == (null|undefined)以外はfalseである", function() {
assert.notEqual(null, 1);
assert.notEqual(null, "1");
assert.notEqual(null, true);
assert.notEqual(null, false);
assert.notEqual(null, {});
assert.notEqual(null, []);
assert.notEqual(undefined, 1);
assert.notEqual(undefined, "1");
assert.notEqual(undefined, true);
assert.notEqual(undefined, false);
assert.notEqual(undefined, {});
assert.notEqual(undefined, []);
});
it("プリミティブ型 == DateオブジェクトはtoStringを試し、次にvalueOfを試す", function() {
var birthday = new Date("1980/7/21")
,origin_to_string = birthday.toString;
assert.notEqual("1980/7/21", birthday);
var origin_to_string = birthday.toString;
birthday.toString = function() {
return "" + this.getFullYear()
+ "/" + (this.getMonth() + 1)
+ "/" + this.getDate();
};
assert.equal("1980/7/21", birthday);
birthday.toString = origin_to_string;
assert.notEqual(332953200000, birthday);
birthday.toString = undefined;
assert.equal(332953200000, birthday);
});
it("プリミティブ型 == Date以外のオブジェクトはvalueOfと試し、次にtoStringを試す", function() {
var sut = {}
,origin_value_of = sut.valueOf;
assert.notEqual("hello", sut);
sut.valueOf = function() {
return "hello";
}
assert.equal("hello", sut);
sut.valueOf = origin_value_of;
assert.notEqual("hello", sut);
sut.toString = function() {
return "hello";
};
assert.equal("hello", sut);
});
});
上記コードは全てパスするが途中でErrorになるのを何回か繰り返して最終的なコードになっている。
その修正確認もコマンドを叩くと即時結果がわかる。
まさに「復習のための繰り返しの機会が与えられ、またエラーを修正する機会も提供されるべきである」を提供している。
本には一覧表でまとめられていることを、コードとして確認してみると読むだけより理解が深まる。
実際、valueOfとtoStringの順序がDateオブジェクトとその他のオブジェクトでは比較順序が違うということは知らなかったし、==の挙動についてこのテストにより理解が深まった。
コードに書いてあるので復習として何回でも見れるし、コードを書いて結果がすぐに確認できるのは楽しい。
学習テスト、最初の一歩にとてもお勧めの学習方法である。