👨‍🔧

UnitTest実行手順

2022/08/18に公開

UnitTest実行手順

実装手順

ライブラリの追加(デフォルトで入っているが、一応確認)

testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'  

テストクラスの作成

テストを行うクラスで右クリック「Generate... -> Test...」を選択

Testing Library: JUnit4 を選択し「OK」

何も触らず「OK」

app>java>com.example.アプリ名(test) にテストクラスが出来ていることを確認

テストクラスの実装

    private lateinit var sampleClass: SampleClass
    
    @Before
    fun setUp() {
        sampleClass = SampleClass()
    }

テストの記入
@Test をつけることによってテスト対象のFunctionになる

    @Test
    fun `Int同士の計算`() {
        val result = sampleClass.sum(1, 1)
        assertEquals("2", result)
    }

    @Test
    fun `0を含む計算`() {
        val a = 1
        val b: Int = 2147483646
        val result = sampleClass.sum(a, b)
        assertEquals("2147483647", result)
    }

以下、テストコード
テスト対象クラス

import android.util.Log

class SampleClass {

    companion object {
        private const val LOG_TAG = "__SAMPLE_CLASS__"
    }

    fun sum(a: Int, b: Int): String {
        val s = a + b
        return s.toString()
    }

    fun defaultFun() {
        val str = "何をするわけでもないただのfunction"
        Log.d(LOG_TAG, str)
    }

    /**
     *  送られてきた文字列でハンバーガーが作れるのか確認
     *  @param order: オーダー
     *  @return Boolean: true: 作れた, false: 作れなかった
     */
    fun canMakeHamburger(order: String): Boolean {
        var ret  = false
        val inLettuce = isInLettuce(order)
        val inTomato = isInTomato(order)
        val inCheese = isInCheese(order)
        val inBeef = isInBeef(order)

        // 肉が入っていればそれはハンバーガー
        if(inBeef) {
            ret = true
        }
        // 肉が無くても一応ハンバーガー
        if(inLettuce && inTomato && inCheese) {
            ret = true
        }
        return ret
    }

    /**
     * レタスが入っているか
     *  @param order: オーダー
     *  @return Boolean: true: 入ってた, false: 入ってなかった
     */
    fun isInLettuce(order: String): Boolean {
        return order.contains("Lettuce")
    }

    /**
     * トマトが入っているか
     *  @param order: オーダー
     *  @return Boolean: true: 入ってた, false: 入ってなかった
     */
    fun isInTomato(order: String): Boolean {
        return order.contains("Tomato")
    }

    /**
     * チーズが入っているか
     *  @param order: オーダー
     *  @return Boolean: true: 入ってた, false: 入ってなかった
     */
    fun isInCheese(order: String): Boolean {
        return order.contains("Cheese")
    }

    /**
     * ビーフが入っているか
     *  @param order: オーダー
     *  @return Boolean: true: 入ってた, false: 入ってなかった
     */
    fun isInBeef(order: String): Boolean {
        return order.contains("Beef")
    }
}

テストクラス

import org.junit.Assert.*
import org.junit.Before
import org.junit.Test

class SampleClassTest {

    private lateinit var sampleClass: SampleClass

    // ここで初期設定
    @Before
    fun setUp() {
        sampleClass = SampleClass()
    }

    @Test
    fun `Int同士の計算`() {
        val result = sampleClass.sum(1, 1)
        // assertEquals(期待値, 実測値)
        assertEquals("2", result)
    }

    @Test
    fun `0を含む計算`() {
        val a = 1
        val b: Int = 2147483646
        val result = sampleClass.sum(a, b)
        // assertEquals(期待値, 実測値)
        assertEquals("2147483647", result)
    }

    @Test
    fun `defaultFunを呼び出す`() {
        val result = sampleClass.defaultFun()
        assertNotNull(result)
    }


    @Test
    fun `チーズとビーフ`() {
        val result = sampleClass.canMakeHamburger("Beef and Cheese in Hamburger.")
        // assertEquals(期待値, 実測値)
        assertEquals(true, result)
    }


    @Test
    fun `ビーフとレタス`() {
        val result = sampleClass.canMakeHamburger("Beef and Lettuce in Hamburger.")
        // assertEquals(期待値, 実測値)
        assertEquals(true, result)
    }


    @Test
    fun `レタスとチーズ`() {
        val result = sampleClass.canMakeHamburger("Lettuce and Cheese in Hamburger.")
        // assertEquals(期待値, 実測値)
        assertEquals(false, result)
    }

    @Test
    fun `チーズとレタスとトマト`() {
        val result = sampleClass.canMakeHamburger("Cheese, Lettuce and Tomato in Hamburger.")
        // assertEquals(期待値, 実測値)
        assertEquals(false, result)
    }

    @Test
    fun `トマトとチーズ`() {
        val result = sampleClass.canMakeHamburger("Tomato and Cheese in Hamburger.")
        // assertEquals(期待値, 実測値)
        assertEquals(false, result)
    }
}

テストの実施

赤枠をクリックでテストクラス全体のテスト実施
青枠をクリックでテスト単体のテスト実施

テスト結果

テスト結果はログ表示される

注意点

テスト対象コードに Androidクラス(ex. Log.d()) が入っているとエラーを吐くので、下記コードをbuild.gradle(app)に追加

android {
    ....
    ....
    ...

    testOptions {
        unitTests.returnDefaultValues = true
    }
}

Discussion