2
3

More than 1 year has passed since last update.

JUnitでのユニットテストに入門してみた

Last updated at Posted at 2022-01-28

はじめに

初めまして、Androidエンジニアのバナナと申します。
Android開発の経験年数はそれなりになるのですが、テストコードを書くことなくここまできてしまったため、今年こそはという思いでテストについてまとめていければと思っています。
Androidテストのバイブルと言われているAndroidテスト全書を参考に進めていきます
まずは、JUnitを使って簡単なユニットテストをしていきます。 

テスト対象クラスの作成

今回は簡単な入力ボックスを想定し、8文字以上の英数字の入力であれば真を返すメソッドを持つクラスを作成していきます。

InputChecker.kt
class InputChecker {
    fun isValid(text: String): Boolean {
        if (TextUtils.isEmpty(text)) throw IllegalArgumentException("Cannot be blank")
        return text.length >= 8 && text.matches(Regex("[a-zA-Z0-9]+"))
    }
}

テストクラスの作成

次に、テストクラスの作成をしていきます。
AndroidStudioに上記のテスト対象クラス名にカーソルを合わせて、command+shift+tを押すとテストクラス作成のダイアログが出るため、それに沿ってテストクラスの作成をします。
クラス名は慣習的にテスト対象クラス名+Testとなっているようなので、今回の場合はInputCheckerTestとします。
作成されたテストクラスは下記のようになっています。

InputCheckerTest.kt
class InputCheckerTest {

    @Before
    fun setUp() {
    }

    @After
    fun tearDown() {
    }

    @Test
    fun isValid() {
    }
}

各アノテーションの役割としては以下の通りです
@Before: テスト実行前に呼び出される。テスト対象クラスのインスタンスなどはここで初期化しておく
@After: テスト実行後の後処理を書く場所。どういうケースで使うのかはまだわからない
@Test: 実際のテスト処理を書く場所。

今回は@Beforeのタイミングでテスト対象クラスのインスタンス生成のみしておきます。

class InputCheckerTest {

    lateinit var target: InputChecker

    @Before
    fun setUp() {
        target = InputChecker()
    }

テストケースの列挙

今回は8文字以上の英数字という入力を正常値として扱うため、境界値である7と8を用いて下記のテストケースを検証していきます。

  • 7文字の入力をした際に戻り値がfalseであるか
  • 8文字の半角英字を入力した際の戻り値がtrueであるか
  • 8文字の数値を入力した際の戻り値がtrueであるか
  • 8文字の英数値混合の入力をした際の戻り値がtrueであるか
  • 8文字の英数字以外の値を入力した際の戻り値がfalseであるか

テストコードの記述&実行

JUnitのassertThat関数を使い、下記のようなテストコードを記述しました。

    // 7文字以下の際にfalseが返るか
    @Test
    fun isValid_givenLessThan8_returnFalse() {
        val actual = target.isValid("aaaaaaa")
        assertThat(actual, `is`(false))
    }

    // 8文字以上の英字のみの際trueを返すか
    @Test
    fun isValid_gibenAlpha_returnTrue() {
        val actual = target.isValid("aaaaaaaa")
        assertThat(actual, `is`(true))
    }
    
    // 8文字の数字のみの際にtrueを返すか
    @Test
    fun isValid_givenNumeric_returnTrue() {
        val actual = target.isValid("01234567")
        assertThat(actual, `is`(true))
    }

    // 8文字以上の英数字の組み合わせの際trueを返すか
    @Test
    fun isValid_givenAlphaNumeric_returnTrue() {
        val actual = target.isValid("abcd1234")
        assertThat(actual, `is`(true))
    }

    // 8文字以上だが半角英数以外の値を入れた際にfalseを返すか
    @Test
    fun isValid_givenInValidCharacter_returnFalse() {
        val actual = target.isValid("ああああああああ")
        assertThat(actual, `is`(false))
    }

クラス名横の実行ボタンをおし、上記を実行した結果は下記の通りです
スクリーンショット 2022-01-04 15.14.06.png
全てのテストケースで、期待通りの戻り値が返ってきていることを確認できました。

終わりに

今回は、JUnitを使った初めてのユニットテストに入門しました。
とりあえずはもっと理解を深めていきたいと思います。

2
3
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
2
3