Shunk

Shunk/Given When Thenとは何なのか?

Created Sun, 17 Nov 2024 20:45:06 +0900

前の記事はsupabaseのブランチングを試してみた

はじめに

このcodelabをやっている時に出てきたこの一文。

このCodelabのテストは全て、Given-When-Then記法に沿ったものです。

気になりすぎて、夜しか眠れないので調べてみた

結論

テストコードを書くときに、コードをどういうふうに分けるのかを決めるルール。 これに従っておくと、テストコードの可読性が上がる。

具体的には名前の通り以下の三つのセクションに分ける。

Given

前提条件を定義する

例えば仮のDBを作ったり、仮のデータを作ったりするところ。

When

何をするのかを定義

実際にテストしたいメソッドを呼ぶところ

Then

結果を定義する

アサーションを書くところ。

テストしたいviewModel

import androidx.lifecycle.ViewModel

class LoginViewModel : ViewModel() {
    private val validUsername = "test_user"
    private val validPassword = "secure_password"

    fun login(username: String, password: String): Boolean {
        return username == validUsername && password == validPassword
    }
}

Given When Thenに従ったテストコード

import org.junit.Assert.assertTrue
import org.junit.Assert.assertFalse
import org.junit.Test

class LoginViewModelTest {

    private val viewModel = LoginViewModel()

    @Test
    fun `Given the user is on the login page, When valid credentials are entered, Then the user is logged in successfully`() {
        // Given: ユーザーがログインページを開いている
        val username = "test_user"
        val password = "secure_password"

        // When: 正しい資格情報を入力する
        val result = viewModel.login(username, password)

        // Then: ログインが成功する
        assertTrue(result)
    }

    @Test
    fun `Given the user is on the login page, When invalid credentials are entered, Then the user is not logged in`() {
        // Given: ユーザーがログインページを開いている
        val username = "wrong_user"
        val password = "wrong_password"

        // When: 間違った資格情報を入力する
        val result = viewModel.login(username, password)

        // Then: ログインが失敗する
        assertFalse(result)
    }
}

おまけ

Codelabからリンクされていた記事がとても勉強になったので共有。 Given When Then