Androidアプリ開発 SQLite テストコードを記述する

2016年06月30日(編集2016年09月04日)
このエントリーをはてなブックマークに追加

Androidアプリ開発で、SQLiteを使うケースは多いです。
この記事は、AndroidアプリでSQLiteのテストコードの実装方法を記述した記事です。

環境はAndroid 7.0 (API level 24) です。

環境

  • OS X Yosemite
  • android sdk 24
  • Oracle jdk version 1.8.0_72
  • Android Studio 2.1.3

難易度

初心者向け

サンプルコード

Android-SQLite-Demo

更新履歴

2016/09/04 : sdk24(Android 7.0)に対応

SQLiteの接続

SQLiteデータベースの接続方法は、この記事で説明しています。
SQLの実行方法は、この記事で説明しています。
この記事は、SQLiteの実装を理解している前提で説明を続けます。

実装

SQLiteのテストは、インストラメンテッドユニットテスト(Instrumented Unit Test)を使います。

インストラメンテッドユニットテストは、エミュレーターやandroid端末で実行可能なテストです。このテストの実行には端末を必要とします 。端末なしではテストは実行できません。

理解が足りない場合は、こちらの記事で学習してください。

テストの実装

テーブルを操作するメソッドを集めたモデルのヘルバークラスのテストクラスを用意します。
ここでは、Dauモデルを操作するDauHelperクラスのテストとして、DauHelperTestクラスを用意します。

{project_folder}/app/src/androidTest/{package}/model/DauHelperTest.java
/**
 * Copyright (C) 2016 Programming Java Android Development Project
 * Programming Java is
 *
 *      http://java-lang-programming.com/
 *
 * Model Generator version : 1.3.1
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.java_lang_programming.android_sqlite_demo.model;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.test.RenamingDelegatingContext;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

@RunWith(AndroidJUnit4.class)
@SmallTest

/**
 * A Test class for for DauHelper
 */
public class DauHelperTest {

    private Context mContext;

    @Before
    public void setUp() {
        mContext = new RenamingDelegatingContext(InstrumentationRegistry.getInstrumentation().getTargetContext(), "test_");
    }

    @Test
    public void getDauList_not_found() {
        List>Dau< list = DauHelper.getDauList(mContext);
        assertEquals(list.size(), 0);
    }

    @Test
    public void getDau_not_found() {
        Dau dau = DauHelper.getDau(mContext, "1");
        assertNull(dau);
    }

    // TODO You should fix getContentValues
    @Test
    public void insert_success() {
        long result = DauHelper.insert(mContext, DauHelper.getContentValues());
        //assertNotEquals(result, -1);
    }

    @Test
    public void insert_failure() {
        long result = DauHelper.insert(mContext, DauHelper.getContentValues());
        assertEquals(result, -1);
    }

    @Test
    public void getMaxId_data_not_found() {
        int id = DauHelper.getMaxId(mContext);
        assertEquals(id, 1);
    }

    // TODO You should fix getContentValues
    @Test
    public void insert_confirm_data() {
        long result = DauHelper.insert(mContext, DauHelper.getContentValues());
        Dau dau = DauHelper.getDau(mContext, "1");
        //assertEquals(dau.id, "1");
    }
}
        

* 上記のコードは、当サイトのサービス機能である Model Generator で作成しています。

Model Generator

■ 実装の解説

1. テストデータベースの作成と接続

@Before
public void setUp() {
    mContext = new RenamingDelegatingContext(InstrumentationRegistry.getInstrumentation().getTargetContext(), "test_");
}
        

ユニットテストを実行するたびに、本番環境のデータベースのデータを変更するわけにはいきません。
なので、RenamingDelegatingContextオブジェクトを使ってtest用のSQLiteファイルを作成して実行するようにします。

build.gradleの編集

テストコードのBuildを通すために必要なライブラリを、build.gradleに追記します。

{project_folder}/app/build.gradle
apply plugin: 'com.android.application'

android {
    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    // Android JUnit Runner
    androidTestCompile 'com.android.support.test:runner:0.5'
    // JUnit4 Rules
    androidTestCompile 'com.android.support.test:rules:0.5'
    // Espresso core
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
    androidTestCompile 'com.android.support:support-annotations:24.2.0'

    compile 'com.android.support:appcompat-v7:24.2.0'
    compile 'com.android.support:design:24.2.0'
}
        

* 上記のbuild.gradleは、当サイトのサービス機能である Model Generator で作成しています。

Model Generator

テストの実行

テストコードを実行します。
端末を接続するか、エミュレーターを立ち上げます。

terminal
cd {project_folder}

// execute test
./gradlew cAT

:app:packageDebugAndroidTest
:app:assembleDebugAndroidTest
:app:connectedDebugAndroidTest
:app:connectedAndroidTest

BUILD SUCCESSFUL
        

テストの結果を確認します。

android studio console log

まとめ

Androidの開発でsqliteを利用するケースは多いです。
テストコードを書くと、変更に強くなるので、なるべく記述しましょう。

当サイトのサービスも利用してみてください。

Model Generator

関連記事

タグ検索で調べてみよう

Android7.0 Test SQLite