Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin + Power-Assert 言語組み込みならではの Assertion Li...

Kotlin + Power-Assert 言語組み込みならではの Assertion Library 採用と運用ベストプラクティス by Kazuki Matsuda/Gen-AX

Avatar for Kazuki MATSUDA / 松田一樹

Kazuki MATSUDA / 松田一樹

November 01, 2025
Tweet

More Decks by Kazuki MATSUDA / 松田一樹

Other Decks in Programming

Transcript

  1. 1 , P U M J O   1

    P X F S  " T T F S U ݴ ޠ ૊ Έ ࠐ Έ ͳ Β Ͱ ͸ ͷ " T T F S U J P O  - J C S B S Z ࠾ ༻ ͱ ӡ ༻ ϕ ε τ ϓ ϥ Ϋ ς Ο ε C Z  , B [ V L J  . B U T V E B  ( F O  " 9 @ Kotlin Fest 2025 , 2025-11-01 / opinions are my own
  2. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own Abstract Kotlin Conf 2025 で will become part of the language の発表があった "Power Assert compiler plugin" は、失敗したアサーションの中間値を可視 化するという ”あの体験” を実現します 本セッションでは、 • 実 Gradle Project への導入スニペット から始まり • 複雑条件/Soft Assertion • created_at 等の特定フィールド無視比較 などの課題の解決策を具体的なコードとライブデモで紹介し、 段階的に Power Assert を導入する手順も持ち帰って頂ければと思います
  3. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 3 ⾃⼰紹介 / Speaker Note 松⽥⼀樹, Gen-AX 株式会社 (//gen-ax.co.jp) (ソフトバンク株式会社 100% ⼦会社) ⽣成AIを活⽤したSaaSプロダクトの開発・提供や、 企業のAXを⽀援するコンサルティングサービスを提供 Backend (Server Side) Software Engineer. (Non AI/ML/LLM) 個⼈的に UnitTest の書き味・読み味というのは⼤きなテーマにしており、 Kotlin Fest 2022 でも発表の機会を頂いたほどです。(1) Test ライブラリというと、jUnit / Kotest 等の Framework (Runner) の選定も話題にな りますが、Assertion Library にも様々な選択肢があります。 (AssertJ / AssertK / google/truth …) 新しい選択肢(組み合わせ可)が増えたタイミングでの、Power Assert の紹介をさせ ていただこうと思って発表しております。 名前 所属 サービス Role 発表背景 @kazuki_matsuda on X.com (1) ::class.fixture() pattern — 拡張関数を⽣かした、Test Fixture 管理の紹介, Kotlin Fest 2022,2022-12-10,http://bit.ly/3LcuXBq
  4. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 4 ⾃⼰紹介 / `./gradlew clean koverHtmlReport`
  5. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 5 1. Introduction 2. What’s is “あの体験”? — PowerAssert 系譜の紹介 3. Gradle への導⼊ Snippet 4. 実例とカスタマイズ 1. Soft Assertion 2. 特定フィールド無視⽐較 5. まとめ — Power Assert との付き合い⽅ Q) AssertK 等『Assert 毎に個別の Extension Method』⽅式との⽐較 Q) そもそも PowerAssert を使う “べき” なのか? ⽬次
  6. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 7 課題 様々な⾔語、フレームワークで assert(式) という書き⽅が普遍的に使われていたが、 これには式が false となったときに、原因が解らない、という問題があった。
  7. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 8 課題の解決策 — メッセージを書く・実装を別ける 様々な⾔語、フレームワークで assert(式) という書き⽅が普遍的に使われていたが、 これには式が false となったときに、原因が解らない、という問題があった。 これを避ける為⽅法の⼀つとして、 Assertion の挙動(Equality? Not Null? Greater Than?) 毎に実装を変えるやり⽅がある。
  8. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 9 Another 解決策 — Assertion に Power を! 様々な⾔語、フレームワークで assert(式) という書き⽅が普遍的に使われていたが、 これには式が false となったときに、原因が解らない、という問題があった。 これを避ける為⽅法の⼀つとして、 Assertion の挙動(Equality? Not Null? Greater Than?) 毎に実装を変えるやり⽅がある。 これを⾃動的に、もっと Detailed にできないか? ということで⽣まれたのが PowerAssert の系譜
  9. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 10 History of Power Assert これを 勝⼿に、もっと Detailed にできないか? ということで⽣まれたのが Power Assert の系譜 • Assert ⾃体をリッチに、発想⾃体は pytest で 2004 年頃に発⽣ • `py.test --nomagic` で無効化可能 • Power Assert の直接の系譜は 2008〜2009 年ごろの Groovy 圏で⽣まれる。(Peter Niederwieser) • 2009 年、Groovy で “Power Assert” の名前が登場。 • 2013 年には JavaScript へ波及。(Takuto Wada) • 「No API is the best API(API を増やさずに⾔語の式そのものを使う)」という哲学を広めた。 • 各⾔語がそれぞれのやり⽅に添ったやり⽅で進め、PowerAssert の系譜を構成している(マクロ・前処理・実⾏時) • Kotlin でも 2019 年作成、Kotlin Conf 2025 で “will become part of language”. • (= language ecosystem の⼀部として JetBrains でメンテ)
  10. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 11 1. Introduction 2. What’s is “あの体験”? — PowerAssert 系譜の紹介 3. Gradle への導⼊ Snippet 4. 実例とカスタマイズ 1. Soft Assertion 2. 特定フィールド無視⽐較 5. まとめ — Power Assert との付き合い⽅ Q) AssertK 等『Assert 毎に個別の Extension Method』⽅式との⽐較 Q) そもそも PowerAssert を使う “べき” なのか? ⽬次
  11. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 12 実 Gradle への導⼊ Snippet Gradle Plugin として IntelliJ/Kotlin 公式から配布されている kotlin(“plugin.power-assert”) version “<version>” これだけ! ※ なお、2.2.21 では apply すると Test Runner を Gradle にしないといけない Issue があり、2.3.0 にて修正される予定 https://youtrack.jetbrains.com/issue/KT-80429 Power Assert with "Run test using: IntelliJ": NoClassDefFoundError
  12. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 13 仕組みの概要 Kotlin Power Assert が初期状態で対応するのは、 最後の引数に message ⽣成 Lamba を取れる assert 関数 (≠ 新規 API / Method 追加) コンパイル時に、lazyMessage Lamda を構築して失敗時に評価されるようにしている。
  13. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 14 1. Introduction 2. What’s is “あの体験”? — PowerAssert 系譜の紹介 3. Gradle への導⼊ Snippet 4. 実例とカスタマイズ 1. Soft Assertion 2. 特定フィールド無視⽐較 5. まとめ — Power Assert との付き合い⽅ Q) AssertK 等『Assert 毎に個別の Extension Method』⽅式との⽐較 Q) そもそも PowerAssert を使う “べき” なのか? ⽬次
  14. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 15 実例とカスタマイズ — Soft Assertion Power Assert は中間値の可視化が専⾨ + 通常の Exception で外部と I/F Soft Assertion が必要であれば、 Exception を捕らえる通常の Library を使う org.junit.jupiter.api.assertAll 等
  15. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 16 実例とカスタマイズ — 特定フィールド無視⽐較 特定フィールド無視、Power Assert とやらないといけないと少し踏み込む必要がある。 PlanA) 専⽤ Assertion を作成して、Power Assert 対象に追加 PlanB) 専⽤中置演算⼦(infix)を作成して、既存 assert で利⽤
  16. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 17 PlanB: infix operator を書いてみる 格好いいが全然⾒やすくない︕ 既存の Assertion Library のほうが。。。
  17. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 18 AssertK (or AssertJ / usingRecursiveComparison) だと? プロジェクトで1回程度は⼿書きする必要があるがここまでは出せる
  18. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 19 AssertK (or AssertJ / usingRecursiveComparison) だと? Sample Code (Paste Ready) // https://pl.kotl.in/GqM4RFeuU private fun <T, R> Assert<T>.isEqualToIgnoringTimestamp(expected: R) { val ignoreFieldName = listOf("createdAt", "updatedAt") given { actual: T -> if (actual == null || expected == null) { return [email protected](expected) } val actualProperties = actual::class.memberProperties.associateBy { it.name } val expectedProperties = expected::class.memberProperties.associateBy { it.name } prop("_fields") { actualProperties.keys.filter { !ignoreFieldName.contains(it) } } .isEqualTo(expectedProperties.keys.filter { !ignoreFieldName.contains(it) }) [email protected] { for (name in (actualProperties.keys + expectedProperties.keys)) { if (ignoreFieldName.contains(name)) continue val actualProperty = actualProperties.getValue(name) val expectedProperty = expectedProperties.getValue(name) val expectedValue = expectedProperty.getter.call(expected) prop(name) { actualProperty.call(it) } .isEqualTo(expectedValue) } } } }
  19. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 20 Plan A) いいとこ取りをしようと思ったら⼿書きしかない 末尾が lazyMessage の関数を独⾃に定義(lazyMessage 中⾝は埋めてもらえる) 明⽰的な引数は複数でもOK リッチ差分も欲しい(欲張り)なので、中で AssertK を呼び出す build.gradle.kts に『この関数も PowerAssert 対象とする』記述を追加
  20. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 21 Plan A) いいとこ取りをしようと思ったら⼿書きしかない Demo
  21. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 22 1. Introduction 2. What’s is “あの体験”? — PowerAssert 系譜の紹介 3. Gradle への導⼊ Snippet 4. 実例とカスタマイズ 1. Soft Assertion 2. 特定フィールド無視⽐較 5. まとめ — Power Assert との付き合い⽅ Q) AssertK 等『Assert 毎に個別の Extension Method』⽅式との⽐較 Q) そもそも PowerAssert を使う “べき” なのか? ⽬次
  22. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 23 まとめ:どう付き合うか • ⾔語標準ライブラリをそのまま利⽤・No API is the best API の思想は良い • Power-Assert は “式そのもの” を使って可視化できる • ただし、超⻑⽂の差分や集合の差分など、依然として専⾨ライブラリのメッセージの⽅が⼈間に優しい場⾯はまだある。 • → “Power-Assert + 既存アサーション” の適材適所が現実的 • 当⾯の戦略 • まず現状整理︓アサーションライブラリが複数混在なら⼀本に寄せる(3種併存はつらい) or 寄せるために移⾏ • プライマリを決めた上で、Power-Assert を追加 • ⽂字列/コレクション差分など“⼈が読むログ”が要だと分かる箇所は、 既存ライブラリまたはプロジェクト固有の差分表⽰を併⽤ • Kotlin 側でも改善トラッキングは進んでおり、 ⽂字列・コレクションの差分表⽰の改善などの議論がある • KT-66806 Diffs for strings and collections. Open. Etc → 将来はより読みやすくなる⾒込み。
  23. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 25 Appendix: Power Assert 移⾏調査の⽅法 簡単な1次調査であれば、LLM に任せられる時代。 いい時代になった。。。
  24. Kotlin + Power-Assert ︓ ⾔語組み込みならではの Assertion Library 採⽤と運⽤ベストプラクティス @ Kotlin

    Fest 2025 , 2025-11-01 / opinions are my own 26 Appendix: Power Assert 系譜 初出 プロジェクト ⾔語 位置づけ サイト(GitHub/公式) 主なメンテナー 2008 Spock Groovy (JVM) 起点の実装(Spock の失敗出⼒が Groovy 組込 Power Assert の源流) 公式ドキュメント・サイト spockframework.org+1 Spock Dev Team(創始︓Peter Niederwieser) 2009 Groovy 組込 Power Assertions(assert) Groovy ⾔語組込の原点(起源) Groovy Testing Guide / Semantics groovy-lang.org+1 Apache Groovy Project 2010 PowerAssert.NET C# / .NET Groovy からの初期ポート(歴史的) GitHub: PowerAssert/PowerAssert.Net GitHub PowerAssert.Net コミュニティ 2010 ExpressionToCode(PAssert を提供) C# / .NET .NET の現⾏代表(式ツリーベースの強化出⼒) GitHub: EamonNerbonne/ExpressionToCode GitHub Eamon Nerbonne 2011 (機能導⼊) pytest のアサーション書き換え Python Python の実質的代表(assert を AST 書き換え) pytest docs「assertion rewriting」/2011 年の導⼊解説 docs.pytest.org+1 pytest-dev 2013 power-assert(power-assert-js) JavaScript JS のカノニカル実装(代表) GitHub: power-assert-js/power-assert GitHub Takuto Wada(@twada)/ power-assert-js org 2013 Expecty Scala (JVM) Scala への導⼊起点(歴史的) GitHub: pniederw/expecty(配布は eed3si9n 名義も) GitHub+1 Peter Niederwieser(ほかに eed3si9n) 2014 以降 ScalaTest – Diagrams(旧 DiagrammedAssertions) Scala Scala の実運⽤代表(失敗時に図解出⼒) ScalaTest API (scalatest-diagrams) scalatest.org+1 ScalaTest Team(Artima / Bill Venners ほか) 2014 power_assert(Ruby) Ruby Ruby の代表(bundled gem) GitHub: ruby/power_assert/Bundled Gem 情報 GitHub+1 Ruby org(主要貢献︓k-tsj) 2014 (参考) test-unit-power_assert Ruby 初期アダプタ(歴史的)—test-unit 3.x 以降は内蔵 GitHub: k-tsj/test-unit-power_assert GitHub k-tsj 2016 power-assert(crate) Rust Rust の代表(マクロで図解出⼒) crates.io / GitHub: gifnksm/power- assert-rs crates.io+1 Kenta Ogushi(gifnksm) 2016 java-power-assert Java Java 向け代表(注︓採⽤は限定的) GitHub: jkschneider/java-power-assert /JDK 議論でも参照 mvnrepository.com+1 Jonathan Schneider 2021 Nimoy Python Spock ライク DSL + Power Assert ⾵出⼒(歴史的) GitHub: browncoat-ninjas/nimoy(アー カイブ)/解説記事 GitHub+1 Noam Tenne 2023 Kotlin Power-assert(公式コンパイラプラグイン) Kotlin Kotlin の代表(公式) Kotlin Docs: Power-assert plugin Kotlin JetBrains Kotlin Team 2023 Swift Power Assert Swift Swift における先駆的実装(歴史的) GitHub: kishikawakatsumi/swift-power- assert GitHub Katsumi Kishikawa 2024 Swift Testing(#expect マクロ) Swift Swift の代表(公式)—式を捕捉し値を提⽰ Apple Dev Docs(Testing / #expect)・ Xcode ページ Apple Developer+1