ひよっこゲームブログ

なにもかも初心者のひよっこがゆったりと何かする

AndroidのUIテストの話とかふんわり

denden-kata.hatenablog.com


前は軽い説明だけ書いたので、UIテストのコードとか
UIAutomatorの一部記載がdeprecatedなんだけどまぁそのうち
早く自動で動くテストが見たくてそのまま実装してしまった


これでJUnit4使える

@RunWith(AndroidJUnit4::class)
class hoge {
    // いえーい
}


実際にはこんな感じ

// ぱっけーじ
// いんぽーと

@LargeTest
@RunWith(AndroidJUnit4::class)
class testCode {

    @Rule
    @JvmField
    // テスト時に最初にいるActivity(= hogeActivity)
    // Espressoでの自動生成時にmActivityTestRuleって名前だった。変えてもいいのかしら
    var mActivityTestRule = ActivityTestRule(hogeActivity::class.java)

    @Before
    fun setUp() {
        // テストが走る前に動くのでデータの初期化とかしとけばいいんじゃない?
    }

    // UI Automator
    private val uiDevice: UiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

    @Test
    fun hoge() {
        // 自動生成で出てくるボタン指定クリックはクッソ長いけど1行でまとまる
        // なんか適当なボタンのid = buttonid
        // 指定したidを見つけ次第(isDisplayed())クリック
        onView(allOf(withId(R.id.buttonid), isDisplayed())).perform(click())

        // UI Automator系はR.idを直接指定できないので文字列に直す必要がある
        // -> convertToString()

        // 指定したidが表示されるまで5000ミリ秒待ってくれる 
        uiDevice.wait(Until.hasObject(By.res(convertToString(R.id.button))), 5000)
        val button = UiSelector().resourceId(convertToString(R.id.button))
        
        // UiObject Deprecated なおそうね!
        UiObject(button).click()
    }

    // idを文字列に変換するメソッドをホイ!
    private fun convertToString(resourceID: Int): String {
        return InstrumentationRegistry.getInstrumentation()
                .targetContext
                .resources
                .getResourceName(resourceID)
    }
}


UIテストのコードはだいたいこんな感じだと思う。待つのは通信時とか
あとはperform()で使ったのはこの辺

scrollTo()
スクロールする

replaceText() 
テキストボックスに文字を入力(正確には置き換え)
(直接入力する書き方もあるけど、こっちの方が正確)

closeSoftKeyboard()
そのまま。邪魔で不具合起きたりするのでキーボード閉じる


UIテストはボタンと画面があればひとまずテストとして成り立つのでしあわせ
ボタンの生成とか画面の生成を変な方法でやるのはやめようね(嗚咽)

あと自動で動くの眺めてるの楽しい


AndroidのUIテスト書くにあたって参考にした本
peaks.cc

2018年の本だけどほぼすべてこれで網羅されてる。あとは公式見る
正直定期的に出してほしいレベル。マジ

ぶっちゃけAndroidテスト本って無い。全く無い

実はO'Reillyにあるんだけど
www.oreilly.co.jp
2013年5月発行・・・
つまるとこ、Androidアプリ開発Eclipseが主体だったころですね、うむ。


Androidのテストって色んなもの使わないといけないんですけど他の分野ってどうなんですかね
テストコード書くの初めてだったもんで勝手がわからん

UnitテストはRobolectrics(実際サンプルのプロジェクトでしっかり書いてある
Retrofit2の MockWebServer, moshi
Mockito kotlinと
あとRoomとかもモック入れるためのなんかあった気がするしもうなんか色々

多い!

っていうか今のAndroidテストってどういう流れなん?
教えてすごい人!

JUnit4でなんやかんやするのはそのうちなくなりそう・・・
もうJUnit5だしね、そもそも自動生成がJUnitでJUnit4に手直ししないといかんし


最近はプライベートで勉強したことを
職場になんとか反映させよう一人で転がってる日々が続いてます

つらい


特にオチはないです