Galapagos Tech Blog

株式会社ガラパゴスのメンバーによる技術ブログです。

PyCon APAC 2023 に参加してきました :)

AIR Design for Marketing 事業部 バックエンドエンジニアの大田です。最近ボルダリングをサボっているせいで体重が高め安定してしまっています。久しぶりに会った知人から「ちょっとふっくらしました?」というお言葉を頂戴しました、控えめな表現に優しさが垣間見えますね 😇

タイトルの通り、 PyCon APAC 2023に参加してきましたので、簡単ですがレポート的な記事を書こうと思います 🐍

Day 1

Keynote

京都大学の喜多一教授による「なぜ大学教授がPythonの教科書を書いたのか 」という内容でした。 初学者が躓きやすいポイントなどについて話されていて、それに対してどのように対応していくのかをわかりやすく説明されていました。

やはりいちばんの壁はエラーメッセージで、正常系が動いているうちは前に進めるけれど、エラーが発生してしまうとメッセージを読みたくなくてドロップ・アウトしてしまうことがよくあるとのことでした。 なのであえてエラーを発生させることをして、それを解決することを体験してもらうことでエラーへの恐怖をなくすようなやり方をしているということで納得感のあるお話でした。

Kyoto University Research Information Repository: プログラミング演習 Python 2023

講義で使用するテキストと専用に開発したフォントを公開されているということや、配布しているコードにはテストコードが含まれているというところも印象的でした。

Introduction to Structural Pattern Matching

slides.takanory.net

Python 3.10 からの新機能である構造的パターンマッチングの紹介で、何が嬉しいのかを見ていく内容でした。こういう新機能はなかなか使い始めるタイミングが無いので、こういった場で紹介されているとありがたいですね。

Lunch

白身魚のお弁当。大変美味しかったです。

Python はどのようにデータベースと繋がるのか

Python から PostgreSQL に Socket を使ってどの様にアクセスできるのかをやってみたという内容でした。

意外に(?)シンプルでわかりやすいプロトコルなのが印象的でした。

型チェックを強化するPython 3.11の新機能

pyconapac2023-pep681-slide.ryu22e.dev

Pydantic などのいわゆる「データクラスっぽい」ライブラリに対して型チェックを強化するための標準仕様(Data Class Transforms (PEP681))についてでした。みんな大好き型のお話ですね。

この手のライブラリは IDE 側でも対応していないと補完などが効かなかったりするので、進化に期待ですね。

Dev Containers時代のPython開発環境のあり方

vscode で使える Dev Containers のお話ですね。最近は JetBrains IDE でも使えるらしいので、ちょっと導入してみたいと思っています1

Day 2

Python で一歩踏み出すバイナリの世界

events/pycon.apac.20231026 at main · rhoboro/events · GitHub

UTF-8 の仕様のお話などされていました。「16進数はまずは 0,7,8,F だけ覚えておけば良い」2というのはなるほどと思いましたね。 最近業務で実装したID生成のことを思い出したりしました :)

Lunch

回鍋肉弁当。こちらも美味でした :)

20階の Unconference 会場でお弁当を頂いていたのですが、PyCon PH の方とお話させていただきました。 私の英語スキルは単語を羅列できる程度なのですが、フィリピンの学校でマイクロソフトの支援(?)でC#が教えられていることなど興味深いお話ができました。 (私が仕事でC#をやっていたことがあるという話から発展しました)

PyCon APAC ブースでお菓子とステッカーを配っていると教えていただき、頂戴してきました :)

お菓子美味しかったです!

Comparison of Packaging Tools in 2023

pipenv, Poetry, PDM, pip-tools, Hatch, pip(, Rye) の比較をされています。 まとめとしてはライブラリ開発者は Hatch 、アプリケーション開発者は PDM が良いのではということでした。3

PDM は pyproject.toml に記述する依存関係の標準4に対応していて依存性解決も速いということなので、早速 Poetry を使っているプロジェクトを PDM に切り替えてみて試しています。 使い勝手は Poetry と変わりなく、特に問題なく動いているようなのでこのまま正式に切り替えようかなと思っているところです :)

まとめ

久しぶりのオフラインでのカンファレンス参加で正直疲れてしまった部分もありますが、やはり同じ開発者がリアルで話すという場のありがたさを感じました。 すぐに業務に取り入れることができるトピックもあり、刺激をもらえる2日間でした :)


  1. 少し試してみたのですが、 JetBrains IDE では現状エラーメッセージなどが表から見えなくてすんなり使えるとは言えない感じに見えます。残念。
  2. 0 = 0000, 7 = 0111, 8 = 1000, F = 1111
  3. Rye はまだ安定していないし個人開発なので、様子見が良いのではということでした。
  4. PEP725のはず...

超久しぶりにインフラ構築したときにやったこと 〜SSM でポートフォワーディング編〜

サービス開発パートナー事業部 Android エンジニアの松下です。最近はストリートファイター 6 を遊んでいます。とても難しい。

弊社ではバックエンド領域も扱う案件も少ないながらに存在していますが、事業部としても個人的にも結構ご無沙汰になっていました。
これを機にインフラ構築を行ったときの備忘録を残したいと思います。 AWS です。

続きを読む

Roborazziでスクリーンショットテストを導入した話

サービス開発パートナー事業部 Androidエンジニアの務台です。 最近はモンハンNowのために散歩する日々が続いています。本編では双剣使いだったので早く追加してほしいなぁと思う今日この頃です。


皆さんのプロジェクトではスクリーンショットテストは使っていますか?

私が担当しているプロジェクトでは今までやってこなかったのですが、満を持して導入することができましたので、 その中での躓きを共有できればと思います。

結論

  • Compose Material3のバージョンが1.0.1未満の場合はgradleへ以下の記述が必要になる
configurations.all {
    resolutionStrategy.force libs.compose.material3
}

UIテスト導入の背景

Compose Material3のバージョンを1.0.0-alpha13から1.0.2に上げたところ…

1.0.0-alpha13 => 1.0.2

はい。HorizontalPagerのインジケータの位置がずれてしまいました。

この変化はたまたま見つけることができましたが、全コンポーネントを目視で確認するのはとても大変ですし、確認漏れが発生する恐れがあります。

このような予期しない変更を検知するため、Material3のバージョンアップ前にUIテストを導入し、バージョンアップによる表示崩れが起きないようにしました。

Roborazziの導入

現在だとUIテストを行うときに使用するライブラリとしては

のいずれかが選択肢として挙がるかと思いますが、今回は以下の理由によりRoborazziを使用することにしました。

  • Paparazziより後発であり、Paparazziで使用できる機能を保有していること
  • Hiltを使用したDIが使用可能であること
  • DroidKaigi 2023アプリに使用されており、この実装を参考にできること

導入手順

導入手順としてはGitHubに書いてあるとおり簡単で、

Robolectricを追加して

testImplementation "org.robolectric:robolectric:4.10.3"

プロジェクトのgradleにプラグインを追加して

plugins {
   id "io.github.takahirom.roborazzi" version "1.6.0" apply false
}

モジュールのgradleにもプラグインを追加する。

plugins {
    id 'io.github.takahirom.roborazzi'
}

./gradlew test実行時にスクリーンショットテストも行うために gradle.propertiesに以下を追記する。

roborazzi.test.verify=true

ここまででライブラリの導入は完了です。

あとはキャプチャの保存先や判定の閾値等を管理するクラスを作成して

class LaunchScreenShotRobot(
    private val composeTestRule: ComposeContentTestRule,
) {
    private val roborazziOptions = RoborazziOptions(
        compareOptions = RoborazziOptions.CompareOptions(
            changeThreshold = 0.001f,
        ),
    )

    fun setupContent(
        content: @Composable () -> Unit,
    ) {
        composeTestRule.setContent {
            MaterialTheme {
                Surface {
                    content()
                }
            }
        }
    }

    fun captureLaunchScreen(
        fileName: String,
    ) {
        composeTestRule.onRoot().captureRoboImage(
            filePath = "screenshots/$fileName.png",
            roborazziOptions = roborazziOptions,
        )
    }
}

スクリーンショットテストを行うためのユニットテストを書く。

@RunWith(AndroidJUnit4::class)
@GraphicsMode(GraphicsMode.Mode.NATIVE)
@Config(
    qualifiers = RobolectricDeviceQualifiers.Pixel7Pro,
    sdk = [33],
)
class SampleScreenShotTest {
    @get:Rule
    val composeTestRule = createComposeRule()

    @Test
    fun checkSampleScreen() {
        with(LaunchScreenShotRobot(composeTestRule)) {
            setupIntegrationContent {
                SampleCompose(modifier = Modifier.fillMaxSize())
            }
            captureLaunchScreen("SampleScreen")
        }
    }
}

これにより./gradlew recordRoborazziDebugスクリーンショットを/screenshots/配下に保管し、 ./gradlew test実行でUIの変更も検知することができるようになります。

…通常であれば、、、

沼った

Roborazziを依存関係へ追加後ビルドすると、プロジェクトで使用しているMaterial3のバージョンが1.0.0-alpha13なのにも関わらず、 上記と同様の位置ズレ問題が発生するようになってしまいました。 これはRoborazziがMaterial3 1.0.1に依存していることが原因でした。(原因調査に1日以上かかってしまった…)

Roborazziでも1.0.0-alpha13を使用すればOKなので、以下の記述をgradleへ追加します。

configurations.all {
    resolutionStrategy.force libs.compose.material3
}

これによってRoborazziでも使用するMaterial3のバージョンが1.0.0-alpha13に強制され、UIが崩れる前のHorizontalPagerの画像を取得することができました。

試してみる

これでMaterial3のバージョンアップ前、バージョンアップ後でスクリーンショットテストによるUI崩れの検知ができるようになったはずなので試してみます。

バージョンアップ前に./gradlew recordRoborazziDebugを実行し、 バージョンアップ後に./gradlew testを実行してみると…

Roborazzi: /screenshots/Sample.png is changed.

無事、テストに失敗しました。 build/outputs/Roborazzi/Sample_compare.pngを見てみると

と、しっかり差分が検知されていることが確認できます。

まとめ

躓きはあったものの、無事Roborazziによるスクリーンショットテストを導入し、Material3のバージョンアップによるUI崩れを検知することができるようになりました。 一度入れてしまえばあとは新画面追加の度にスクリーンショットテストの実装も追加していくだけなので簡単にUI崩れを防ぐことができそうです。

まだまだ使用していないRoborazziの機能があるので、今後は

  • Hiltを利用したRobotのDI
  • ライトモード、ダークモードでのスクリーンショットテスト
  • RoborazziRuleを用いたgifでの動作中画像の比較

あたりを追加できたらいいなと思っています。


ガラパゴスでは、一緒に働く仲間を募集しています!

hrmos.co