はじめに
この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