DBのユニットテスト③ Java

前回の続きです。
UserDaoのテストクラスを作成してみます。

UserDaoTest.java

JUnit4っぽく作ってみました。見やすいコードが書けたかも。


アノテーションは、こんな感じです。
 @Test があるのがテストメソッドです。
 @Before は各テストメソッドの実行前に呼ばれます。
 @After は各テストメソッドの実行後に呼ばれます。


テストの流れは、こんな感じです。
 1.setUpメソッドでuserテーブルを初期化
 2.テストメソッド実行
  UserDaoのメソッドを実行
  抽出結果比較 or 更新結果比較(userテーブル)
 3.tearDownメソッドで後始末

package sample;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class UserDaoTest {

  private DbTester tester = new DbTester();
  private UserDao dao;

  @Before
  public void setUp() throws Throwable {
    Connection conn = Dbcp.getInstance().getConnection();
    this.tester.setUp(conn);
    this.tester.initDb("testdata/DaoSampleTest/init.xls");
    this.dao = new UserDao(conn);
  }

  @After
  public void tearDown() throws Throwable {
    this.tester.tearDown();
  }

  @Test
  public void selectAll() throws Throwable {

    List<User> list = this.dao.selectAll();

    List<User> expected = new ArrayList<User>();
    expected.add(new User(1, "userA"));
    expected.add(new User(2, "userB"));
    expected.add(new User(3, "userC"));

    Assert.assertArrayEquals(expected.toArray(), list.toArray());
  }

  @Test
  public void select() throws Throwable {

    User user = this.dao.select(1);

    Assert.assertEquals(new User(1, "userA"), user);
  }

  @Test
  public void insert() throws Throwable {

    User user = new User(4, "userD");
    this.dao.insert(user);

    this.tester.assertDb("testdata/DaoSampleTest/insert.xls");
  }

  @Test
  public void update() throws Throwable {

    User user = new User(2, "userE");
    this.dao.update(user);

    this.tester.assertDb("testdata/DaoSampleTest/update.xls");
  }

  @Test
  public void delete() throws Throwable {

    this.dao.delete(2);

    this.tester.assertDb("testdata/DaoSampleTest/delete.xls");
  }

}

テストデータExcelファイルの中身

各テストデータExcelファイルにテスト実行後の期待値を記述します。
シート名がテーブル名で、1行目がカラム名、2行目からデータになります。


■init.xls(テスト実行前の初期状態)


■insert.xls(insertメソッド実行後)
[id=4、name=userD]のレコードが追加されているはず。


■update.xls(updateメソッド実行後)
[id=2、name=userB]が[id=2、name=userE]に変更されているはず。


■delete.xls(deleteメソッド実行後)
[id=2、name=userB]のレコードが削除されているはず。



Eclipseから実行してみる

Eclipseから実行してみます。


テストクラス名を選択して、
右クリック→「実行」→「JUnit テスト」で全テストが実行されます。


どれか一つのテストを実行したい場合は、
テストメソッド名を選択して、右クリック→「実行」→「JUnit テスト」で実行できます。





わざとエラーにしてみます。
selectメソッドの期待値を変更して実行すると・・・

  @Test
  public void select() throws Throwable {

    User user = this.dao.select(1);

  //Assert.assertEquals(new User(1, "userA"), user);
    Assert.assertEquals(new User(1, "HOGEHOGE"), user);
  }


ちゃんとエラーになりますね!
ユニットテストを作るときはわざと失敗して、
エラーになる事を確認しながら作るとテストの作成ミスを防げると思います。