0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DBに対するテストコード

Posted at

はじめに

今回はDB
に対してテストコードを書いてみました。

コードを書くためには

テストコードを書く場所は前回のテストコードと同じExampleUnitTestと同じファイルにClassを作成します。

必要なライブラリ

次に、テストコードを書く際に必要なライブラリは次のようになります。

build.gradle

/** Unit Test **/
testImplementation 'org.junit.platform:junit-platform-runner:1.1.0'
androidTestRuntimeOnly "de.mannodermaus.junit5:android-instrumentation-test-runner:$junit5_runner"

// assertion
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"

// spek
testImplementation "org.spekframework.spek2:spek-dsl-jvm:$spek_version"
testImplementation "org.spekframework.spek2:spek-runner-junit5:$spek_version"

// MockK
testImplementation 'io.mockk:mockk:1.9'

// DB
testImplementation "org.dbtools:dbtools-room-jdbc:4.4.0"
testImplementation "org.xerial:sqlite-jdbc:3.25.2"


// Test helpers for LiveData
testImplementation "android.arch.core:core-testing:1.1.0"

// Test helpers for LiveData
androidTestImplementation "android.arch.core:core-testing:1.1.0"

実際に書いてみた

ライブラリを導入した後は、
テストを実行するクラスを作成し各関数でテスト内容を書きます!

データの追加・削除を行うTodo等は今回省略しております。

DataBaseTest.kt

class DataBaseTest {
    lateinit var context: Context
    lateinit var appDatabase: AppDatabase
    lateinit var todoDao: TodoDao

    @get:Rule
    var instantExecutorRule = InstantTaskExecutorRule()

    @Before
    fun setUp() {
        context = mockk()
        appDatabase = Room.inMemoryDatabaseBuilder(
                context,
                AppDatabase::class.java
        ).allowMainThreadQueries()
                .openHelperFactory(JdbcSQLiteOpenHelperFactory())
                .build()
        todoDao = appDatabase.todoDao()
    }

    @After
    fun tearDown() {
        todoDao.deleteAll()
    }

// データ追加時のテスト
    @Test
    fun getAllTodo() { 
        val expected = listOf(
                createDummyTodoEntity(1),
                createDummyTodoEntity(2),
                createDummyTodoEntity(3)
        )

        // 3件登録済み
        todoDao.insert(createDummyTodoEntity(1))
        todoDao.insert(createDummyTodoEntity(2))
        todoDao.insert(createDummyTodoEntity(3))

        // テスト実施
        val result = todoDao.getAllTodo()

        // Todo項目を全件取得し期待値と一致していること
        result.test().assertValue(expected)
    }

//データの更新のテスト
    @Test
    fun updateTodo() { 
        // 3件登録済み
        todoDao.insert(createDummyTodoEntity(1))
        todoDao.insert(createDummyTodoEntity(2))
        todoDao.insert(createDummyTodoEntity(3))

        val todo = createDummyTodoEntity(3, true)
        val expected = listOf(
                createDummyTodoEntity(1),
                createDummyTodoEntity(2),
                createDummyTodoEntity(3, true)
        )

        // テスト実施
        todoDao.update(todo)

        // Todo項目を全件取得しid3の項目が更新されていること
        todoDao.getAllTodo().test().assertValue(expected)
    }

// データ削除のテスト
    @Test
    fun deleteTodo() {
        // 3件登録済み
        todoDao.insert(createDummyTodoEntity(1))
        todoDao.insert(createDummyTodoEntity(2))
        todoDao.insert(createDummyTodoEntity(3, true))

        val expected = listOf(
                createDummyTodoEntity(2),
                createDummyTodoEntity(3, true)
        )

        // テスト実施
        todoDao.delete(1)

        // Todo項目を全件取得しid1の項目が削除されていること
        todoDao.getAllTodo().test().assertValue(expected)
    }

// データ全削除のテスト
    @Test
    fun deleteAllTodo() {
        // 3件登録済み
        todoDao.insert(createDummyTodoEntity(1))
        todoDao.insert(createDummyTodoEntity(2))
        todoDao.insert(createDummyTodoEntity(3))

        val expected = emptyList<TodoEntity>()

        // テスト実施
        todoDao.deleteAll()

        // Todo項目が一件も存在しないこと
        todoDao.getAllTodo().test().assertValue(expected)
    }
}

テストするには

先ほど記載した各関数ごとにテストをすることで、
期待通りの結果になっているか確認することができます。

成功時は0と表示されます。

失敗時はコードが見切れていますが、
実際のDBのデータと期待結果のDBデータを記載してくれています!

終わりに

今回はDBに対するテストコードを書いてみました。
通常のテストコードをより必要なライブラリやコードが多かったですね。
次はAPIに対するテストコードを書いてみようと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?