$30 off During Our Annual Pro Sale. View Details »

「コンパイル時のユニットテスト」導入するとユニットテストを 書かなくてよくなるのか?

「コンパイル時のユニットテスト」導入するとユニットテストを 書かなくてよくなるのか?

Scott Wlaschin氏は著書である"Domain Modeling Made Functional" (和訳本なし)に関する講演で、関数型言語を用いてドメインモデルを定義すると、テストを書く必要がなく、たくさんのフラグをチェックする必要もないと説明しています。

彼はこの方法を「自己文書化」と「コンパイル時のユニットテスト」と呼んでいます。

この話では、彼の言う「コンパイル時のユニットテスト」が具体的にどのようなものなのか、そしてこの方法を使うことでテストがどれほど効率的になるのかを扱います。ただし、ドメイン駆動開発の定義やC#やF#の詳細な文法については説明しません。

https://zenn.dev/jtechjapan_pub/articles/d4e1dacb6f00a2

こちらのブログで練習で話したセッションなども見ることが可能です。

Tomohisa Takaoka

March 22, 2024
Tweet

More Decks by Tomohisa Takaoka

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 高丘 知央 ( Tomohisa Takaoka ) 株式会社ジェイテックジャパンCTO イベントソーシング・CQRSフレームワーク Sekiban

    メンテナ 米国カリフォルニア州ロングビーチ在住(ロスの近く) • X : @tomohisa • Github : @tomohisa • Linkedin : tomohisatakaoka 自作キーボード、3Dプリント自作トラックボール製作 London Tech Talk ポッドキャストとブッククラブ出演 #NextbeatTechBar 🆗
  2. 株式会社ジェイテックジャパンの紹介 • 創業50年を超えた総合IT企業、株式会社 ジャパンテクニカルソフトウェア (JTS) のグループ企業。 • New York 所在

    J-Tech Creations, Inc. の 東京拠点。 • B2C / B2B アプリケーションを 開発‧運⽤するソフトウェア開発企業。 • .NET‧Azure 等 Microsoft の 技術スタックを主に使⽤。 🆗 #NextbeatTechBar
  3. 「コンパイル時のユニットテスト」どこからきた、どんな概念なのか? 🆗 Scott Wlaschin (スコット ラーション) ⽒ 「F# for Fun and

    Profit」 • Wlaschin ⽒の運営するブログ • https://fsharpforfunandprofit.com/ • F#を⽤いて多くの関数型ドメインモデリングの概念 が説明されている • 関数型ドメインモデリングの概念はF#などの関数型 ⾔語以外でも参考にできる #NextbeatTechBar
  4. 「コンパイル時のユニットテスト」どこからきた、どんな概念なのか? Scott Wlaschin (スコット ラーション) ⽒ 「Domain Modeling Made Functional」 •

    関数型を⽤いてドメインモデリングを⾏う⼿法につ いて解説した本 - Pragmatic Bookshelfで購⼊可能 • 2018年1⽉発⾏ 英語のみ、⽇本語は未発⾏ • ADT(代数的データ型)を使⽤して型の合成(AND, OR) を⾏い、ドメインの定義を⾏う⼿法 • Railway Oriented Programming - 型の合成と Result型を使⽤したエラーハンドリング 🆗 #NextbeatTechBar
  5. 「コンパイル時のユニットテスト」どこからきた、どんな概念なのか? Scott Wlaschin (スコット ラーション) ⽒ 「Domain Modeling Made Functional -

    Scott Wlaschin KanDDDinsky 2019」YOUTUBE • 上記の「Domain Modeling Made Functional」 本の概要について2019年に説明している講演 • この講演の中で”Compile Time Unit Test” - コ ンパイル時のユニットテストに⾔及している 🆗 #NextbeatTechBar
  6. 「コンパイル時のユニットテスト」どこからきた、どんな概念なのか? 実際に話している内容 ① • メールアドレスを表現するEmailContact 型は VerifiedEmailもしくは UnverifiedEmail型のどちらかの型の多相性を持つ型とする type EmailContactInfo =

    VerifiedEmail | UnverifiedEmail • メール送信サービスの⼊⼒はVerifiedEmailのみとする。 • このような静的な型を⽤いたモデリングにより、ビジネスの要件を表現するこ とができる。 🆗 #NextbeatTechBar
  7. 「コンパイル時のユニットテスト」どこからきた、どんな概念なのか? 実際に話している内容 ② • フラグをチェックするたくさんのコードが不要になり、ユニットテストを書く 必要がない。 With this new things called

    “VerifiedEmail”, I don’t have to write a unit test, I don’t have to check any billion flags. • これは⾃⼰⽂書化であり、コンパイル時のユニットテストです。 This is self documenting and it’s a Compile Time Unit Test. 🆗 #NextbeatTechBar
  8. 「コンパイル時のユニットテスト」どこからきた、どんな概念なのか? まとめ • 「コンパイル時のユニットテスト」とは Scott Wlaschin ⽒のDomain Modeling Made Functional

    に関する登壇で出てきた表現 • 1つのオブジェクトの状態の遷移をパラメータやフラグで表現するのではなく、 別の型として定義する。各機能は特定のオブジェクトの状態でないと実⾏でき ないように動作を制限する。 • 不正なデータを⼊れることができず、⼊れようとするとコンパイルエラーとな るため、「コンパイル時のユニットテスト」と表現している • その部分に関してはコンパイルでチェックできるので”テストを書く必要がな い”と書いており、ロジックのテストが不要であると⾔っているわけではない。 🆗 #NextbeatTechBar
  9. 個⼈的に作ったC#版 - パスワードリセットメール送信のテスト ① フラグを使ったオブジェクト指向的 な書き⽅ ② 状態ごとに型を変える書き⽅ 「コンパイル時のユニットテスト」テストにどんな影響があるのか? 🆗

    VerifiedEmailしか関数の入力に できないため、UnverifiedEmail に関しては関数に渡すことができ ないので、テストを書く必要がな い。 ”コンパイル時の ユニットテスト” #NextbeatTechBar
  10. 「コンパイル時のユニットテスト」注意点 静的な型の合成を使ってのモデリングの注意点 - パターンマッチング F# のような判別共⽤体 - Discriminated Unions があるとパターンマッチングでの網羅、完

    全性をコンパイルでチェックできるので便利 判別共⽤体 - Discriminated Unions 直和型 - Disjoint Union タグ付きユニオン - Tagged Union 選択型 - Choice Type など状況によって⾊々表現される。C#などには直接の実装がないため、Interfaceや型の多相 性などを⽤いて似た機能として実装できるが、パターンマッチングでの完全性をコンパイル 時の判別はできないという問題はある 🆗 #NextbeatTechBar
  11. 「コンパイル時のユニットテスト」注意点 静的な型の合成をドメイン内で使⽤したデータの永続化 ‧復元 Domain Modeling Made Functionalでは、カスタムのシ リアライザ‧デシリアライザを定義して永続化、データ の復元を⾏う⽅法を紹介している。 JSONを使⽤している場合、JSON内に型のタグをつける

    ことにより、カスタムシリアライザを定義せずにデータ の永続化、復元を型を保持して⾏うことができる。 [JsonDerrivedData(typeof(VerifiedEmail),nameof(VerifiedEmail))] https://zenn.dev/jtechjapan_pub/articles/618539ba9 43093 🆗 #NextbeatTechBar
  12. 「コンパイル時のユニットテスト」注意点 関数型ドメインモデリングとイベントソーシング • Domain Modeling Made Functionalの本は基本的に 関数型でドメインモデリングを⾏い、イベントソー シングで実装する⽅法について書かれている。 •

    関数型ドメインモデリングはイベントソーシングと 相性はよく、データの状態の遷移をイベントで表現 して、ドキュメントデータベースにデータを保存す ることにより扱いやすくなる。 • ただ、関数型ドメインモデリングはイベントソーシ ングを採⽤しなくても実践可能 🆗 #NextbeatTechBar
  13. Sekiban の紹介 • イベントソーシング / CQRS ⽤のアプリケーション開発フレームワーク • ⾔語は C#

    .NET 7 + • データストアに Microsoft Azure Cosmos DB / Amazon DynamoDB、 PostgreSQL にも対応済み。 • 2023年12⽉にオープンソースソフトウェアとして公開 (Apache 2.0)、 有料プランはない。 • 関数型ドメインモデリングとの相性もよく、実際に複数プロジェクトで使⽤ されている。 🆗 #NextbeatTechBar
  14. まとめ • Domain Modeling Made Functional 本はどの⾔ 語で実装するにしてもアイデアが得られるのでお すすめ。 •

    Scott Wlaschin⽒はテストを軽視しているわけで はなく、データの意味が変わるときに型を変える ことにより、特定の処理を特定の状況でしか実⾏ できないように制限することにより、フラグの チェックやテストの個数を減らすことを勧めてい る • 実装の選択肢としてイベントソーシングと組み合 わせてツールの⼀つとして持っておくのは良いか もしれない。 🆗 #NextbeatTechBar