データベース操作を伴うテスト
一口にデータベースと言っても、SQL ServerやOracle Databaseをはじめとしたさまざまなものがありますが、今回はその中でも簡単に入手可能で、かつ単体テストが行いやすいという点から、SQL Server Express Editionを対象としたデータベースの操作を伴う単体テストを行っていきます。なお、SQL Serverのバージョンは2005や2008 R2などどのバージョンでも構いませんが、必ずExpress Editionを利用するようにしてください。
データベースの準備
本稿では、Visual Studio 2010のインストール時に付属しているSQL Server 2008 Express Edition Service Pack 1を対象データベースとして利用します。インストールされていない場合は、Visual Studio 2010のインストーラを起動してSQL Server 2008 Express Edition Service Pack 1を追加インストールしてください。
続いて、テスト用に利用するデータベースとして、SQL Server 2000の頃にサンプルとして用意されていたpubsデータベースを利用します。このデータベースは、マイクロソフトのWebサイトNorthwind and pubs Sample Databases for SQL Server 2000からインストーラー「SQL2000SampleDb.msi」をダウンロードできます。「SQL2000SampleDb.msi」を実行すると、既定では「C:\SQL Server 2000 Sample Databases」フォルダにpubsデータベースのmdfとldfのセットやデータベース定義用のスクリプトファイルなどが展開されるので、これらを利用します。
操作手順
作業を開始する前に、今回テスト対象としているメソッドを確認しておきます。これはリスト1のようになっています。
/// <summary> /// pubsデータベースのauthorsテーブルに新しいデータを1行追加します。 /// </summary> /// <returns></returns> public int InsertAuthers() { //アプリケーション構成ファイルのデータベース接続文字列定義から //定義名が"Express"になっている接続文字列を取得する string connectionString = ConfigurationManager.ConnectionStrings["Express"].ConnectionString; //SQL Serverへの新しい接続を作成する SqlConnection connection = new SqlConnection(connectionString); //実行するSQL文を定義する string cmdText = "INSERT INTO authors (au_id, au_lname, au_fname, phone, address, city, state, zip, contract) " + "VALUES ('999-99-9999'," //au_id + "'libaty'," //au_lname + "'CodeZine'," //au_fname + "'804 826-0752'," //phone + "'3410 Blonde St.'," //address + "'Rockville'," //city + "'IN'," //state + "'48105'," //zip + "1)"; //contract SqlCommand command = new SqlCommand(cmdText, connection); int result; try { //データベースとの接続を開く connection.Open(); //SQL文を実行する result = command.ExecuteNonQuery(); } finally { //データベースとの接続を閉じる connection.Close(); } return result; }
このコードでは、アプリケーション構成ファイル(app.config)のconnectionStrings要素に定義されたExpressという名前の接続文字列を利用して、pubsデータベースに接続し、authorsテーブルに新しいデータを1行追加しています。追加するデータは通常はメソッドの引数として受け取ることがほとんどですが、今回はわかりやすくするためにメソッドの中に直接記述しています。
次に、今までと同様にリスト1のメソッドをテストする単体テストを作成します。とりあえずの作成となるため、単純に成功するパターンの単体テストを作成しておきます。これは例としてリスト2のようになります。
/// <summary> ///InsertAuthers のテスト ///</summary> [TestMethod()] public void InsertAuthersTest() { Class1 target = new Class1(); int expected = 1; int actual; actual = target.InsertAuthers(); Assert.AreEqual(expected, actual); }