DroidKaigi 2025に参加してきました

に公開

はじめに

こんにちは!WED株式会社でAndroidの開発をしている松葉です!
レシート買取アプリ「ONE」のAndroidの実装を担当しています。

今回は9月に開催されたDroidKaigiに参加してきたので、参加した感想や心に残ったテーマを書いていこうと思います。

毎年開催されているDroidKaigiですが、セッションや企業のブースを見て、KotlinMultiPlatFormなどを用いたクロスプラットフォーム開発、AI Agentや各種AIアシスタントを利用した開発支援といったテーマが多く目につきつつも、様々な領域でのAndroidならではの課題も話されていて、トレンドを追いながら既存のAndroidの知見も深めることができました。
会情の企業ブースの様子

印象に残ったセクション・ブース

今回のDroidKaigiで見た様々なセッションやブースの中で、AIを使ったテストに関するセッションとブースが印象に残ったので感想と一緒に詳しく紹介していきたいと思います!

【セッション】テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成

https://2025.droidkaigi.jp/timetable/940148/
makunさんのセッションはJetBrains AI Assistantを使ってテストコードをAIに委ねた時のテストの品質の話でした。
今回セッションで用いていたサンプルと同様にRoomデータベースにアクセスするUserDaoを作成し、それに関するテストコードの生成の検証をしてみました。

UserDao.kt
@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    suspend fun getAllUsers(): List<UserEntity>

    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUserById(userId: Long): UserEntity?

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(user: UserEntity)

    @Update
    suspend fun update(user: UserEntity)

    @Query("DELETE FROM users WHERE id = :userId")
    suspend fun deleteById(userId: Long)
}
AIへの指示
UserDaoのためのユニットテストを作成してください。

作成するテストは次の要件を満たして下さい。
- in-memory databseを使用する
- @Beforeでデータベースを初期化し@Afterで閉じる
- テストはkotlinx-coroutines-testのrunTestを使用する
- アサーションの検証にはフィールドの単位のアサーションや件数の検証も行なう

テストケースは以下を網羅して下さい。
- insertで挿入したUserがgetAllUsersで正しく取得できる
- updateで更新した内容が正しく反映される
- deleteUserByIdで削除したUserが正しく反映される

セッションではアサーション時に検証が不足していて正確性に問題が出たという話があったので、要件の最後にアサーションについての指示も加えてみました。

UserDaoTest.kt
    // insertで挿入したUserがgetAllUsersで正しく取得できる
    @Test
    fun insert_then_getAllUsers_returnsInsertedUsers() = runTest {
        val u1 = newUser(id = 1L, name = "Alice")
        val u2 = newUser(id = 2L, name = "Bob")

        dao.insert(u1)
        dao.insert(u2)

        val all = dao.getAllUsers().sortedBy { it.id }
        
        assertThat(all).hasSize(2)
        assertThat(all[0].id).isEqualTo(1L)
        assertThat(all[0].name).isEqualTo("Alice")
        assertThat(all[1].id).isEqualTo(2L)
        assertThat(all[1].name).isEqualTo("Bob")
    }

テストコードを生成してみたところ、@Before/@Afterでデータベースのクリーンアップ、runTestによる非同期処理の検証ができていました。また、アサーションに関する指示を細かく行うことで多くの検証を行いカバー率が上がっていたので、指示によってテストの正確性を上げられることが分かりました。よって正常系テストに関してAIに生成してもらうことでテストの実装の効率化ができると思いました。

また、普段AI Assistantとして利用しているGitHub Copilotと比べてみました。GitHub Coplilotに同じ指示を出したところ、ユーザー一覧の一致を確認するアサーション時にListの長さだけ検証しているなど、JetBrains AI Assistantでは十分だった検証まで至っていないことがありました。よって、正確性や網羅性がGitHub Copilotの方が低いという結果に至りました。

最後に、他のセッションでもAIの話は多く聞きましたが、現状だとAIはペアプログラミングの相手という付き合い方がちょうどいいということを言ってる方が多くいました。私も設計や保管、レビューといったことは人の手を入れる必要はあると実感しているので、今後もAIとの付き合い方はいい距離感を保っていこうと思います。

【ブース】MagicPod株式会社

MagicPod様のブースではMagicPodというE2Eのテストツールを紹介していただきました。

実際のアプリの画面を見ながらUIのテストを作成できるので、エンジニアではなくても直感的にテスト項目が作れるなと感じました。さらに、MagicPod Autopilotという機能を使うことでAIにテスト項目を作ってもらうこともできます。
実際に「ONE」アプリの電話番号登録のテスト項目をAIで作成してみました。

AIへの指示
初めてアプリを起動した時から電話番号入力画面で正しいフォーマットの電話番号を入力するまでのステップを作成してください。

AIが作成したテスト項目
生成されたテスト項目を確認したところ十分なUIに関するテスト項目ができていました。さらに、テストを走らせる端末を選択できたり、CI/CDの中に組み込んで自動テストに連携させることもできるので様々な活用方法が考えられるなと思いました。

また、ブースでは2つの画面を見比べた間違い探しなどのワークも行ったりと、とても楽しい体験になりました!
ブース内で行った間違い探し

【番外編】Androidエンジニアとしてのキャリア

https://2025.droidkaigi.jp/timetable/946868/
専門的な話以外だとmhidakaさんのキャリアの話が興味深かったです。
エキスパートやマネージャーのお手本から道を選ぶのではなく、自分に合った選択をする。そのためにはチャレンジを楽しむことが大事という話が心に残りました。
モバイル以外の領域の方にもぜひ聞いてみてほしい内容でした。

まとめ

DroidKaigiに参加する前はGoogle I/OのようにAIの話が中心になると思っていました。しかし、参加してみるとAIなどの最新技術はもちろん、Jetpack Composeやマルチプラットフォームなど既存のAndroidの技術に関する話題も多く聞くことができ、様々な知識を増やすとともにやりたいことも増えました。
また、アフターパーティーなどで多くのAndroidに関わる方々と交流することで、価値観や課題感を共有する喜びや、刺激を受けられたのもとてもいい経験になりました!

WED Engineering Blog

Discussion