|
HelloWorldのテストhttp://works.dgic.co.jp/djwiki/Viewpage.do?pid=@48656C6C6F576F726C64E381AEE38386E382B9E38388Encoding:UTF-8 / Locale:en_US / PageStatus: Frozen Owner of this page:d.Dev |
はじめてのテスト ~ HelloWorldTest Λプログラミングの入門書などで、はじめてのプログラム「HelloWorld」を、よく目にします。javaだと、こんな感じです。
では、はじめてのテストは、HelloWorldのテスト「HelloWorldTest」だと思うのですが、 JUnit Cookbookをチラ見しても、HelloWorldTestはありませんでした。 HelloWorldTestは、はじめてのテストとしては、不向きなのかもしれません。 以下は、少しまじめに考えて、HelloWorldのテストを「JUnit」「djUnit」を使って作成してみます。 JUnitでのHelloWorldTest Λ調べてみるとdWにHelloWorldTestがありました。 AntとJUnitを用いた漸進的開発(http://www-6.ibm.com/jp/developerworks/java/010223/j_j-ant.html) ソース例この記事によりますと、テスト対象であるHelloWorldは、
のようになっており、
一方、HelloWorldTestのテストメソッドは、
のようになっております。 sayHelloメソッドにしたことにより、テストしやすくなっているようです。 確かにJUnitは、メソッドを実行し、その戻り値を検証するのが得意そうです。 違う議論になりそうなので、あまり触れたくありませんが、sayHelloメソッドをpublicではなく、package privateにし、HelloWorldと、HelloWorldTestのパッケージを同じにするという努力をしている方もいるようです。 問題点ケチをつけるつもりはないのですが、今後のために、このテストの問題点を探してみます。
以上のことから、このHelloWorldTestは、HelloWorldのテストというより、むしろ sayHelloのテストですYO! djUnitでのHelloWorldTest ΛJUnitでテストするということは、「コンソールに文字を出力する」という、たった1行のプログラムのテストでも、ある程度工夫が必要みたいです。 我々が製造するアプリケーションは、たとえそれが、WEBアプリケーションで、フレームワークを利用して作るものだとしても、 HelloWorldよりは複雑になってしまうことが、ほとんどです。きっと、もっと工夫が必要になるはずです。 ここでdjUnitを利用し、HelloWorldのテストにチャレンジしておきます。 ソース例テスト対象は、最初の
です。 対するHelloWorldTestは、このようになります。
HelloWorld.main()のアウトプットは、java.io.PrintStream#printlnメソッドの引数であることに注目しています。 HelloWorld.main()が実行され、System.out.printlnが実行されたならば、getArgumentメソッドで、引数を取り出すことができます。 Object DJUnitTestCase#getArgument(String クラス名, String メソッド名, int 引数のインデックス); 引数のインデックスとは、「何番目の引数をgetする」というのを0からはじまる整数で指定します。 printlnの引数は、1つですので、「0」を指定しています。 検査対象の引数が単純であれば、、下記のようにしても同様のテストができます。
assertArgumentPassedは、取得した引数と、予想値を、「equals」で比較し、検証します。 void DJUnitTestCase#assertArgumentPassed(String クラス名, String メソッド名, int 引数のインデックス, Object 予想値); 結論 ΛdjUnitによるテストでは、テスト対象のプログラムを、(テストのためだけに)修正することなくテストしています。 そして、デフォルトコンストラクタを除けば、HelloWorldの全ステップを実行しています。 このようなアプローチもありだと思いますし、もっと複雑なプログラムのテストへ応用できそうです。 |