月: 2024年1月

[Kotlin] Parameterizedテストを書く

ユニットテストを充実させていくと小さい関数のテストが必要になってきます。例えば下記のような拡張関数がある場合

fun Int.toBoolean(): Boolean = this == 1

Int型の変数が1の場合のみtrueでそれ以外はfalse。ParameterizedテストはJunitの機能で記述できます。

import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@RunWith(Parameterized::class)
class IntTest(
    private val cate: String,
    private val input: Int,
    private val expected: Boolean
) {
    @Test
    fun intToBoolean() {
        val actual = input.toBoolean()
        assertThat(actual).isEqualTo(expected) // junitのみで書きたい場合はassertEquals()でも良い
    }

    companion object {
        @Parameterized.Parameters(name = "{0}")
        @JvmStatic
        fun data() = listOf(
            arrayOf(
                "0の場合はfalse",
                0,
                false
            ),
            arrayOf(
                "1の場合はtrue",
                1,
                true
            ),
            arrayOf(
                "2の場合はfalse",
                2,
                false
            )
        )
    }
}

private val case: Stringはテストの内容を記述します。@Test内では利用されていませんが、実行結果やエラー時に表示されるので書いておくことをおすすめします。

caseを書かない場合

Parameterizedテストを書けるようにしておくとAndroidのコードから切り出したif文が正しく動作するか、data class内の関数が動作するかが確認できるようになります。


HTTP Toolkitを使って通信内容を書き換える

HTTP/HTTPSで通信するアプリで動作確認等をしたりする場合、環境によってはFakeモジュールで固定の通信結果を返したり、ローカルPCにサーバを立てて通信内容を確認/返却したり、色々な方法があると思いますがHTTP Toolkitを使うとVPNを使って通信内容を書き換えることができ、動作確認等に便利です。GoogleでHTTP Toolkitで検索しても日本語の検索結果があまり出てこないので使い方だけ覚書しておきます。今回はmac版で導入します。

https://httptoolkit.com

Download free nowをクリックします。

自動でダウンロードされない場合はClick hereを押下します。

ダウンロードしたdmgファイルを開きます。

HTTP Toolkit.appをApplicationsフォルダに移動します。(普通にインストールします)

HTTP Toolkitを実行します。

まずはアプリがインストールされている通信内容を確認しましょう。ADBが使われるのでUSBデバッグ可能な状態でAndroid端末をmacにUSB接続します。InterceptタブにあるAndroid Device via ADBをクリックします。

HTTP ToolkitはVPNを利用して通信内容をインターセプトするのでOKを押します。

CA証明書をインストールする必要があるのでそのままOKを押します。

そのままOKを押します。

Connectedと表示されれば成功です。

試しにTest interceptionを押すとViewタブで通信内容を確認できます。

通信内容を書き換える場合は書き換えたいURLの一部をコピーするなり文字列入力できるようにしてMockタブを開きます。

今回はすべてのリクエストを対象にしたいのでAny requestsを選択し、FOR URLS MATCHINGでextensionsと入力します。このようにするとリクエスト先URLにextensionsが含まれる通信に対してインターセプトできます。忘れずに+ボタンを押します。レスポンスの内容を書き換えたいのでPause the response to manually edit itを選択します。リクエストを書き換えたい場合はPause the resquest to manually edit itを選択します。最後に右上のSave changesを押すと設定が適用されます。+ボタンとSave changesボタンは忘れがちなので必ず押してください。

その後、Match:のルールに書いたリクエストが有効になるような操作をAndroid端末で行います。するとViewタブでインターセプト中である画面に切り替わります。

今回はレスポンスを書き換えたいのでRESPONSE BODYの内容を書き換えてResumeボタンを押すと書き換えたレスポンスがAndroidアプリに送られます。(Mockタブでリクエストを書き換える設定にしている場合はREQUEST BODYの内容を書き換えます)ステータスコード401,402とかも発生されるのが難しいですがHTTP Toolkitで簡単に確認できます。

使い方は簡単ですが、いくつかの注意点があります。

  • Mockタブで+ボタンやSave changesボタンを押し忘れることが多い(入力したら自動でインターセプトしてほしい)
  • 無料版ではMockタブの設定内容はアプリ終了と共に削除されるので毎回入力しないといけない
  • アプリ側で通信タイムアウトする前に操作しないといけないのでコピー&ペーストするなり、素早い操作が必要になる
  • Android端末で2重VPNを使うことができないのでリモートワーク等で会社のVPNに繋ぎつつ、HTTP Toolkitと併用することができない。(ホストPC側で会社のVPNに繋いでエミュレータでHTTP Toolkitを使うことは可能です)
  • Android14は2024年1月時点で利用できません。https://httptoolkit.com/blog/android-14-breaks-system-certificate-installation/#enter-android-14