データベース操作もラクラクテスト! Android JUnit テストで SQLiteOpenHelper を賢く使う
Android JUnit テストにおける SQLiteOpenHelper の詳細解説
Android アプリ開発において、SQLiteOpenHelper はデータベース操作を簡略化するための重要なクラスです。一方、JUnit はテスト駆動開発 (TDD) における単体テストの実行に用いられるフレームワークです。このチュートリアルでは、Android JUnit テストを利用して SQLiteOpenHelper を効果的にテストする方法について詳細に解説します。
ステップバイステップ解説
テスト環境の準備
- プロジェクト設定: テスト対象のプロジェクトで、JUnit テストモジュールを作成します。
- ライブラリ依存関係: テストモジュールの
build.gradle
ファイルに、JUnit と Robolectric などのテストライブラリの依存関係を追加します。
テストクラスの作成
MyDatabaseOpenHelperTest.java
のようなテストクラスを作成します。@RunWith(RobolectricTestRunner.class)
アノテーションを使用して、Robolectric ランナーを指定します。
SQLiteOpenHelper のインスタンス取得
InstrumentationRegistry.getInstrumentation().getTargetContext()
を使用して、テストコンテキストを取得します。- テスト対象の SQLiteOpenHelper クラスのインスタンスを、取得したコンテキストを使って生成します。
データベース操作のテスト
getWritableDatabase()
またはgetReadableDatabase()
メソッドを使用して、データベースへの読み書きアクセスを取得します。insert()
,update()
,delete()
,query()
などのメソッドを使用して、データベース操作をテストします。Assert
クラスを使用して、操作の結果が期待通りであることを検証します。
テストケースの例
@RunWith(RobolectricTestRunner.class)
public class MyDatabaseOpenHelperTest {
private MyDatabaseOpenHelper dbHelper;
@Before
public void setUp() {
dbHelper = new MyDatabaseOpenHelper(InstrumentationRegistry.getInstrumentation().getTargetContext());
}
@Test
public void testInsertProduct() {
// データを挿入
dbHelper.getWritableDatabase().insert("products", null, ContentValues(...));
// 結果を検証
Cursor cursor = dbHelper.getReadableDatabase().query("products", ..., null, null, null, null, null);
Assert.assertTrue(cursor.moveToFirst());
Assert.assertEquals("Product Name", cursor.getString(cursor.getColumnIndex("name")));
cursor.close();
}
}
- 上記は基本的な例であり、具体的なテスト内容はデータベース操作によって異なります。
- テストの対象範囲と詳細については、開発者が判断する必要があります。
MyDatabaseOpenHelper クラス
public class MyDatabaseOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "my_database.db";
public MyDatabaseOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// テーブル作成 SQL を実行
db.execSQL("CREATE TABLE MyProduct (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT," +
"price REAL" +
")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// データベースのアップグレード処理
// ...
}
}
説明:
DATABASE_VERSION
とDATABASE_NAME
は、データベースのバージョンと名前を定義します。onCreate()
メソッドは、データベースが初めて作成されたときに実行されます。このメソッド内で、テーブルの作成などの初期化処理を行います。onUpgrade()
メソッドは、データベースのバージョンが更新されたときに実行されます。このメソッド内で、データの移行などの処理を行います。
@RunWith(RobolectricTestRunner.class)
public class MyDatabaseOpenHelperTest {
private MyDatabaseOpenHelper dbHelper;
@Before
public void setUp() {
dbHelper = new MyDatabaseOpenHelper(InstrumentationRegistry.getInstrumentation().getTargetContext());
}
@Test
public void testInsertProduct() {
// データを挿入
ContentValues values = new ContentValues();
values.put("name", "Product 1");
values.put("price", 19.99);
dbHelper.getWritableDatabase().insert("MyProduct", null, values);
// 結果を検証
Cursor cursor = dbHelper.getReadableDatabase().query("MyProduct", null, null, null, null, null, null);
Assert.assertTrue(cursor.moveToFirst());
Assert.assertEquals("Product 1", cursor.getString(cursor.getColumnIndex("name")));
Assert.assertEquals(19.99, cursor.getDouble(cursor.getColumnIndex("price")), 0.01);
cursor.close();
}
}
setUp()
メソッドは、テスト実行前に実行されます。このメソッド内で、SQLiteOpenHelper インスタンスを生成します。testInsertProduct()
メソッドは、製品データをデータベースに挿入し、結果を検証するテストケースです。ContentValues
オブジェクトを使用して、挿入するデータの値を設定します。insert()
メソッドを使用して、データを挿入します。query()
メソッドを使用して、挿入されたデータを取得します。
- テスト対象のデータベース操作や検証方法については、開発者が判断する必要があります。
InstrumentationRegistry
利点:
- Robolectric を導入する必要がない
- 軽量で高速
欠点:
- 実際の Android 環境を完全にシミュレートできない
- テスト対象のコードが Android フレームワークに依存している場合、テストが失敗する可能性がある
Mockito
- モックオブジェクトを使用して、データベース操作をシミュレートできる
- テスト対象のコードを実際のデータベースに依存せずにテストできる
- テスト対象のコードが Mockito の使い方に依存してしまう可能性がある
- テストケースの作成が複雑になる
Espresso
- UI レベルでのテストが可能
- データベース操作を含む統合テストを実行できる
- テスト対象のコードが UI に依存している場合のみ使用できる
- テストケースの作成と実行に時間がかかる
ContentProviderTesting
- ContentProvider を介したデータベース操作をテストできる
- 実際の Android 環境でテストを実行できる
- テスト対象のコードが ContentProvider を使用している場合のみ使用できる
推奨される方法
使用する方法は、テスト対象のコードと要件によって異なります。一般的には、以下の指針に従うことをお勧めします。
- シンプルなテスト: InstrumentationRegistry を使用
- データベース操作のテスト: Mockito を使用
- UI レベルでのテスト: Espresso を使用
- ContentProvider を介したテスト: ContentProviderTesting を使用
- テスト対象のコードが複雑な場合は、複数の方法を組み合わせて使用することもできます。
- テストの自動化ツールを使用すると、テストの実行と管理を効率化できます。
android sqlite junit