テストコードについてなんとなく説明
テストコードの話で盛り上がっていたので久しぶりに記事を書いてみます。
動画を見た感じだと「電脳カプセル」のメンバーはスキルに多少差があるようなので
この記事は超初心者向きに書いてみます。
サンプルコードはPHPのコードになります。
テストコードって何?
その名の通りテストするためのコードです。
$this->assertTrue($result); // isOne()の結果がTrueかテスト
じゃあ、テストコードはなんのために書くの?
テストコードとはリリースしようとしているプログラム(システム)を自動でテストするためのコードです。
1だったらTrue、それ以外はFalseを返す関数isOne(int Num)を作ったとします。
isOne(int Num)をテストするプログラムは以下のようになります。(抜粋)
$result = isOne(1); // 渡した引数が1か判定する関数を呼び出し
$this->assertTrue($result); // isOne()の結果がTrueかテスト
$result = isOne(2); // 渡した引数が1か判定する関数を呼び出し
$this->assertFalse($result); // isOne()の結果がFalseかテスト
テストコードを書く目的は自信を持って修正できるようにするためです。
開発をすすめるとこの変数名おかしいから変更しよう、ここの処理は共通化できるから
別の場所に移動しよう、ということがあると思います。
修正を行うと修正前と修正後で同じを動きをするか不安になります。
不安だからテストするのですが毎回値を変えながら数パターンのテストするのはめんどくさいです。
修正の規模が大きいとテストに漏れが出るかもしれません。
テストコードがあれば、すべてのテストコードが通れば修正に問題ないし、
テストコードが通らなかったら一旦修正前に戻すことも出来ます。
「”多分”動いている”はず”」をなくせます。
テストプログラムがあれば品質は担保されるか?
そもそもテストプログラムを書くのは品質を担保するためではありません(結果、品質が上がることはあると思います)。
システムを作るときは設計フェーズ、開発フェーズ、テストフェーズ、運用フェーズがあると思いますが
「テスト」コードだからといってテストフェーズでたくさんのテスト項目を自動的にこなすためのものではありません。(そういう使い方をしているチームもあるかもしれませんが)
どういうことか説明したかったのですが簡潔に説明するのが難しいので機会があればTDD(テスト駆動開発)を勉強してください。
テストコードが間違ってた場合はどうするの?
間違ってていいんです。
先程言ったようにテストコードは品質を担保するものではないので品質を保証するテストは別にきちんと行ってください。
その際にバグが発生したならテストコードのテストケースが間違っている(漏れている)のでテストコードを修正してから製品コードを修正してバグが治ったことと他に影響がでてないことを確認します。
元々がリーダブルコードの輪読会だったのでその辺の話も
多分短いコードがいいのか理解しやすいコードがいいのかの話でテストコードが出てきたと思うのですが、一般的に同じ処理を繰り返すならfor文で繰り返します。
先程のisOne(int Num)のテスト
for($i; $i < 3; $i++){
$result = isOne($i);
$this->assertTrue($result);
if($i > 1){
$this->assertFalse($result);
}
}
ですが、テストコードはforで書かないほうがいい場合があります。
$result = isOne(1); // 渡した引数が1か判定する関数を呼び出し
$this->assertTrue($result); // isOne()の結果がTrueかテスト
$result = isOne(2); // 渡した引数が1か判定する関数を呼び出し
$this->assertFalse($result); // isOne()の結果がFalseかテスト
$result = isOne(3); // 渡した引数が1か判定する関数を呼び出し
$this->assertFalse($result); // isOne()の結果がFalseかテスト
後者の書き方で書いておくと「どのようなテストを行っているか明白」「どの値でエラーがあったか明白」というメリットがあります。
以上、文才が無いのでうまく伝わったかわからないですが「電脳カプセル」のみなさんがテストコードで疑問に思ってた部分に回答してみました。
PHPコンパイルオプション
Composerを使ったSymfony2インストール時の備忘録
・コンパイルオプションに--enable-zipを付ける
・php.iniで明示的にopenssl.soを有効にする。
ゆっくり療養してる間にPHP(Symfony2)+Jenkinsまでは動かしたい。
後、JavaScriptの処理をクラスに切り出すのが苦手だからパーフェクトJavaScriptも読み終えたい。
6/30 Symfony2勉強会に参加してきました #Symfony2Study
内容や勉強会の様子は日本Symfonyユーザー会の方々がアップしてるので
そちらを御覧ください。
http://www.symfony.gr.jp/blog/20120630-symfony2-workshop6-report
それにしても相変わらず濃い内容の勉強会だったのでちょっと疲れました。
Symfony2勉強の面白いところはSymfony2というフレームワークの使い方だけじゃなくてSymfony2の基になってる考え方や思想(オブジェクト指向、デザインパターン)の話や他のフレームワークの話も聞けるところが面白い。
Midnightにも参加して@hidenorigotoさんと話したけど、色々課題も残る勉強会だったので微力ながらより良い勉強会になるように頑張ります。
参加者の皆様、スピーカーの皆様、ユーザー会のスタッフの皆様、大変お疲れ様でした。
VOYAGE GROUP様会場の提供ありがとうございました。