某所でテストの神様と呼ばれるt-wadaさんの講演を聞く機会があったので、参加してきました。
その際に聞いた話&学びを残していきます
#TDD(テスト駆動開発)とは
プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。
(wikipedia参照)
#TDDの進め方
- テストコードが失敗するコードを書く
- 最低限動くコードを書く
- テストを失敗させるテストコードを書く
- 3で失敗したテストコードが通るようにコードを修正する
- テストが通った状態でリファクタリングをしていく
#さっそくやってみる
今回はmochaでテストを書いていきます
###1. テストコードが失敗するコードを書く!
describe('偶数かどうかチェックする関数', function() {
it ('2は偶数なのでtrueで返す', function() {
var result = checkEven(2);
assert(result === true);
});
});
checkEvenという関数が存在しない&assertをよんでいないので、失敗します。
###2. 最低限動くコードを書く!
var assert = require('assert');
function checkEven() {
return true;
}
describe('偶数かどうかチェックする関数', function() {
it ('2は偶数なのでtrueが返ってくる', function() {
var result = checkEven(2);
assert(result === true);
});
});
###3. テストを失敗させるコードを書く
var assert = require('assert');
function checkEven() {
return true;
}
describe('偶数かどうかチェックする関数', function() {
it ('2は偶数なのでtrueが返ってくる', function() {
var result = checkEven(2);
assert(result === true);
});
it ('3は奇数なのでfalseが返ってくる', function() {
var result = checkEven(3);
assert(result === false);
});
});
evenCheck関数が必ずtrueを返すので2つ目のテストは失敗する
###4. 3で失敗したテストが通るようにコードを直す
var assert = require('assert');
function checkEven(num) {
if (num % 2 === 0) {
return true;
} else {
return false;
}
}
describe('偶数かどうかチェックする関数', function() {
it ('2は偶数なのでtrueが返ってくる', function() {
var result = checkEven(2);
assert(result === true);
});
it ('3は奇数なのでfalseが返ってくる', function() {
var result = checkEven(3);
assert(result === false);
});
});
これで全部のテストが通ります!
次にこの状態を保持してリファクタリングをします。
###5.テストが通った状態でリファクタリングをしていく
var assert = require('assert');
function checkEven(num) {
return num % 2 === 0;
}
describe('偶数かどうかチェックする関数', function() {
it ('2は偶数なのでtrueが返ってくる', function() {
var result = checkEven(2);
assert(result === true);
});
it ('3は奇数なのでfalseが返ってくる', function() {
var result = checkEven(3);
assert(result === false);
});
});
これがTDDのひと通りの流れです。
#感想
テストコードを書きながら開発が進められたら一番いいけど
納期とか色々あってうまくいかないこともあるかもしれません。
その時はそっちを優先するとしてもきちんとテストコードを書く癖をつけます。
結構テストを書いている時に思うのが、どこまで書けばいいのか、これで足りるのかを悩んでしまいます。
今後はそのへんも考えてテストしていきたいです。