「適当にテストする方法」を実践してみた

Hudson勉強会でゆかわさんが紹介していた「Hudsonを用いて適当に?テストする方法」を実践してみました。


自分のプロジェクトでは「データベースアクセス用のクラスにSQLとその実行メソッドを書く」という設計になっているので、そのクラスの全メソッドに対して実行するだけ。
Javaなので、ひたすらリフレクションです。


大まかな手順は、こんな感じです。

  1. データベースアクセスレイヤーのクラスを指定する
  2. そのクラスの全メソッドを取得する ( Class#getDeclaredFields() )
  3. 2で取得したメソッドの、引数の型を取得 ( Method#getParameterTypes() )
  4. 3で取得した型から、実際の(適当な)データを取得 ( int -> 0、String -> 空文字 ...etc )
  5. クラスのインスタンスを取得 ( Class#newInstance() )
  6. 2で取得したメソッドを、5のインスタンスと3のデータを使って呼び出す ( Method#invoke(Object obj, Object... args) )

リフレクションのやり方は、Javaリフレクションメモ(Hishidama's Java Reflection Memo)を参考にさせていただきました。
また、自分が作ったMethod Name Analyzerも役に立ちました。


引数用のデータを取得するところが適当だと、本当はデータベースの制約違反ではじかれるのかもしれませんが、自分が試したデータベースでは NOT NULL 制約ぐらいしかなかった*1ので、これで動きました。
(もちろん、SQL文やパラメータの指定に誤りがあれば例外で失敗しました)


ちなみに、このやり方はデータベースアクセスレイヤーの概念があいまいな設計になっているとちょっと厄介です。
具体的には、クラスの中にデータベースアクセスとは関係ないメソッドが混じっていたりとか。
そういう場合、そのメソッドを取り除くか、リフレクションの対象から除外するようにする必要があります(自分は前者を取りました)。



ちょうど、データベースのライブラリを入れ替えでがっつり書き換えようと思っていたところだったので、これで安心して作業ができます!
改めて、ゆかわさんありがとうございました。

*1:ACID特性のうち、Consistency(整合性)が欠けている状態なので、結構危険です・・・。