前回MySQLに接続ができたので、今回はMySQLにクエリを投げるデータレイヤーのクラスを自分なりにデザインして、それをテストしていきたいと思います。とりあえずこんなインターフェースとそれを実装するクラスを考えてみました。



プロパティはMySQLに接続するために必要な、いわばパラメータでそんなに難しくはないと思います。ちなみにどうしてIMySqlEngineというインターフェースを作ったかというと特に多多態性(Polymorphism)は必要がないのですが、スケルトンとして持っておきたいというのが正直なところです。


今日はGetConnectionメソッドを実装し、それをテストするUnitTestを書こうと思います。


/// <summary>
/// インスタンスのプロパティに基づいてMySQLへの接続オブジェクトを返します。
/// </summary>
/// <returns>MySql.Data.MySqlClient.MySqlConnection</returns>
public MySql.Data.MySqlClient.MySqlConnection GetConnection()
{
// コネクションが返せる状態か確認し、そうじゃなかったらExceptionを投げる。
if ((_Host == null) || (_Host == “”))
throw new Exception(“Hostが設定されていません。”);

if ((_Database == null) || (_Database == “”))
throw new Exception(“Databaseが指定されていません。”);

if (_Port == 0)
throw new Exception(“Port番号が指定されていません。”);

if ((_UserID == null) || (_UserID == “”))
throw new Exception(“UserIDが指定されていません。”);

MySqlConnection Conn = new MySqlConnection(“database=” + _Database + “;User ID=” + _UserID + “;Password=” + _Password + “;Host=” + _Host + “;Port=” + _Port.ToString());
return Conn;

}


非常に簡単なものですね。Connectionは常にデータベースを必要とするプログラミングには必要なものですから、一つにメソッドから取り出せるようにすることは必要不可欠だと思います。また、接続を得る前に少々Validationもしておいたほうがいいでしょう。単なるExceptionではなくて、MySqlEngineExceptionというExceptionから継承したクラスを作ってこのクラスから投げられる例外のタイプを分けておくともっといいかもしれません。後でいろいろプロパティなんかを追加してやることによってより扱いやすいExceptionオブジェクトに変身することができるからです。


では、ここでUnitTestに移ります。UnitTestのプロジェクトにMySqlEngineTestというクラスを作成しそれをGetConnectionメソッド内に実装して、下のようにTestGetConnection()というテストメソッドを作成します。



これをTest Driven .NET(右クリックでRun Tests)で実行すると成功しました。このユニットテストはこれでいいのですが、もうちょっとこのユニットテストを掘り下げてみましょう。もし接続に失敗したときはどうなるでしょうか?その前にGetConnection()にはvalidationが仕掛けてあって、例えばHostをコンストラクタにパラメータとして渡してやらないと、MySqlEngineExceptionが発生するようにしてあります。そういったときのテストはどうなるでしょうか?NUnitではネガティブテストにも対応していて、そういう状態もテストできるようになっています。下のUnitTestのコードをご覧ください。



今度はHostに”"を、つまり空文字を渡しています。これだとGetConnection()を実行したときにMySqlEngineExceptionが発生するはずですね。上のテストでは必ずMySqlEngineExceptionが起こらないとテストは成功したとみなしませんよという意味で、ExpectedExceptionというAttributeが用いられています。これを実行してやると成功します。ちなみにHostにlocalhostと代入してやると、このテストは「失敗」になります。失敗(パラメータがちゃんと渡されてなかった)を成功とみなしますので、こういうのをネガティブテストということがあります。


さらにもう一つネガティブテストができますね。例えばすべてのパラメータがMySqlEngineにちゃんと渡されたとしても、MySQLがその特定のポートをリッスンしていない場合はどうなるでしょう。試してみましたが、System.Net.Sockets.SocketExceptionが発生します。それにはこんなネガティブテストを書くといいでしょう。



ユーザ名やパスワードがまずい場合、つまりMySQLが門前払いしちゃう場合・・・



データベースがMySQLサーバ内に存在しない場合・・・



などなどこのメソッドだけでこんなにテストケースが書けてしまいました。とまあだんだんテストケースが多くなっていくわけですが、これ一つ一つを右クリックしながらテストしていくのは面倒ですね。そこでNUnit GUIの登場です。NUnit2.2をインストールすると、もれなくNUnit GUIがついてくるのですが、それにUnitTestプロジェクト(クラスライブラリ)によって生成されたアセンブリを読み込ませることによって、一気にそのアセンブリ内にあるテストケースを全て実行し、結果を知らせてくれます。



  1. NUnit 2.2を実行する前に、C:\Program Files\NUnit 2.2\bin\nunit-gui.exe.configをメモ帳で開く。
  2. .NET Framework 2.0のリリースビルド番号が一番上に来るようにしてください。v2.0.40607の行は削除しちゃうかコメントアウトしてください。この作業をしないとNUnit GUIはりリースバージョンのVS2005でコンパイルしたアセンブリを読み込んでくれません。

  3. NUnit GUIにUnitTest.dllを読み込ませる。
  4. Runボタンを押すと全てのテストが実行され、成功すると全てのテストケースが緑になる。

という感じでMySqlEngineのデザイン、MySqlEngine.GetConnectionの実装+ユニットテストをカバーしました。これからはもっとパブリックメソッドを追加してそれに対してユニットテストを追加していきます。次回はExecuteNonQueryRawSql()の予定です。

コメント書き込み