日々之迷歩

世の中わからんことだらけ

ITが複雑で難しくなっていく様に翻弄される日々です。微力ながら共著させていただいた「シェル・ワンライナー160本ノック」をよろしくお願い申し上げます。

Web開発のテスト環境について

 テストは重要だとは分かっているのだが、、今までのやり方を変えるのが面倒とか、ただでさえ時間がキツキツなのに、、とか、障壁があるのが正直な所。ただプロとしての仕事を行うにはやはり不可欠。現状が出来ていないため、これからやっていく。
 テストが大変な原因として、開発が進んで機能が増えたりした時の回帰テストだったりもする。テストは単体テスト結合テストシステムテストと進んでくと思うのだが、上位のテストで問題が見つかった時に下位のテストに回帰しないといけないはず。また、だんだんコードが複雑になってきた時、リファクタリングしたくても怖くて出来ないとか。またデータを何度も入れて手動でテストやるの、、、とか。
 本来は仕様からテストに落とし込んでいくプロセスが最も重要だと思うのだが、自動化出来る部分は自動化したい。単体テスト結合テストで使える自動化の仕組みを調べてみることにした。

単体テスト

 単体テストには、JUnitとかRubyUnitなどがあるようだ。Assertionという考え方でテストを記載していく。直近ではPHPについてが必要なので、PHPUnitについて調べていたら、関数やメソッドのコメントに直接テストを記載するDocTestという仕組みがあることが分かった。

<?php
class NumberValidator
{
  /**
   * 7桁の数字かどうかをチェックする
   * #test
   * <code>
   * #true(#f(1234567));
   * #false(#f(123456));
   * #false(#f(12345678));
   * #false(#f(-123456));
   * #false(#f(123.456));
   * </code>
   */
  public function validate($value)
  {
    if (preg_match('/^\d{7}$/', $value)) {
    return true;
    } else {
      return false;
    }
  }
}

 元々はPythonのライブラリだった?ようですが、PHPRubyに移植した有志がいらっしゃる。PHPの場合はこんな感じで、関数の頭のコメントに、入力する値と期待される結果(true,false)を記載。複雑なテストを書くのは無理がありそうだが、面白い仕組みではないかな?
 PHPのDocTestだとpearを使ってインストールすればいいのだが、参考にしていた以下のページに載っていたようにインストールすると、DocTest実行時にエラーが出る。
第6回 UnitTestをする理由 - テスト講座
PHPライブラリパスの中の以下のファイルについて、修正が必要だ。

  • Maple4/DocTest.php
  • Maple4/DocTest/Runner.php
//require_once('PHPUnit/Framework.php');
require_once('PHPUnit/Autoload.php');

PHPUnit/Framework.phpというファイルが無くなってPHPUnit/Autoload.phpというファイルに変わっているようだ。

結合テスト

 Web開発の場合は、結合テストはWebブラウザに向かってデータ入れてクリックして、、になると思う。が、、これ毎回やるの??
 ところが、こちらについても自動化の仕組みがあるようだ。参考にしていたページに紹介されていたseleniumというやつ。HTMLとJavaScriptで実装されており、開発言語に依存しない!
第4回 Seleniumの実行環境を作ってみよう - テスト講座
 テスト記述はHTMLのTableで記載するようだ。テストすべきリンクとかフォームにidを付けておけば、テストの記載は楽になるようだ。
 HTMLのTableに対して、一行目にテストのタイトル、二行目以降にテストの記載を書く。テストの記載は、左からテストのコマンド(Asssertionについて)、2番目がターゲット(idなど)、3番目が入力値。詳しくは上記のリンクを参照して欲しい。
 これならプログラマじゃなくても、HTMLが分かる人なら仕様書を元に結合テストが書けるのではないだろうか?