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

Kotlinサーバサイドで頑張る「単体テストの考え方_使い方」 / "Unit Testing...

Kotlinサーバサイドで頑張る「単体テストの考え方_使い方」 / "Unit Testing Principles, Practices, and Patterns" by Kotlin

こちらのイベントの登壇資料です。
https://server-side-kotlin-meetup.connpass.com/event/274359/

個人的2023年ベスト技術書「単体テストの考え方/使い方」の要点に触れながらどうサーバーサイドKotlinで保守しやすいテストコードを書いていくか発表しました。

YuitoSato

April 07, 2023
Tweet

More Decks by YuitoSato

Other Decks in Technology

Transcript

  1. 10 ©2023 Loglass Inc. 良いテストは森羅万象を解決する(主観) • 良いテストはリファクタリングのハードルを下げる。 • 良いテストは良いプロダクションコードを提供する。 •

    良いテストは品質を良くする。ユーザーを安心させる。事業も伸びる。残業も減る。家族と過ごせ る時間も増える。他様々な悩みが減り、日常生活が豊かになる
  2. 11 ©2023 Loglass Inc. この本の何がいいの? • 良いテストコードとはなにか? というのが網羅的に体系化されている • 単体テストだけでなく

    リファクタリング、プロダクションコード、統合テストにまで言及 されている • 組織の共通知識として この本の情報がインプットされていると確実に品質が良くなる
  3. 15 ©2023 Loglass Inc. 良い単体テストとは? 1. 退行(regression)に対する保護 2. リファクタリングへの耐性 3.

    迅速なフィードバック 4. 保守のしやすさ 単体テストの考え方 /使い方 第4章参照
  4. 16 ©2023 Loglass Inc. 良い単体テストとは? 1. 退行(regression)に対する保護 a. 「機能追加したら他の機能がなんか壊れた」を減らす 2.

    リファクタリングへの耐性 a. リファクタリングをしてもテストが壊れない 3. 迅速なフィードバック a. 素早く頻度多くテストを実行できるか 4. 保守のしやすさ a. テストケースが理解しやすいか b. テストを行うこと自体が難しいか 単体テストの考え方 /使い方 第4章参照
  5. 17 ©2023 Loglass Inc. 良い単体テストとは? 今日はここだけ 1. 退行(regression)に対する保護 a. 「機能追加したら他の機能がなんか壊れた」を減らす

    2. リファクタリングへの耐性 a. リファクタリングをしてもテストが壊れない 3. 迅速なフィードバック a. 素早く頻度多くテストを実行できるか 4. 保守のしやすさ a. テストケースの理解のしやすさ b. テストを行うことの難しさ 単体テストの考え方 /使い方 第4章参照
  6. 18 ©2023 Loglass Inc. リファクタリングへの耐性が高いとは? • 偽陽性 (false positive)が少ないこと ◦

    偽陽性とは テスト対象のコードが実際には意図通りの振る舞いをしているのにもかかわら ず、テストが失敗すること ◦ 偽陽性を減らすには 観察可能な振る舞いのみをテストし、実装の詳細をテストしないこと ▪ 絶対にSQL自体を文字列でテストするなよ!!絶対だぞ!! 単体テストの考え方 /使い方 第4~5章参照
  7. 19 ©2023 Loglass Inc. 観察可能な振る舞いとは?実装の詳細とは? • クライアントが目標を達成するために使う公開された状態 or 操作 ◦

    観察可能な振る舞いは What、実装の詳細はHow 単体テストの考え方 /使い方 第5章参照 名前のバリデーションを する 新しい名前 でユーザーの インスタンスを作る ユーザーのインスタンス を返す ユーザー名を 更新したい
  8. 20 ©2023 Loglass Inc. 観察可能な振る舞いとは?実装の詳細とは? • クライアントが目標を達成するために使う公開された状態 or 操作 ◦

    観察可能な振る舞いは What、実装の詳細はHow 単体テストの考え方 /使い方 第5章参照 名前のバリデーションを する 新しい名前 でユーザーの インスタンスを作る ユーザーのインスタンス を返す ユーザー名を 更新したい What How How How
  9. 27 ©2023 Loglass Inc. リファクタリングの定義 by Martin Fowler “外部から見たときの振る舞いを保ちつつ、 理解や修正が簡単に

    なるように、 ソフトウェアの内部構造を変化させること。 “ Martin Fowler. 新装版 リファクタリング 既存のコードを安全に改善する (p.53)
  10. 28 ©2023 Loglass Inc. リファクタリングの定義 by Martin Fowler “外部から見たときの振る舞いを保ちつつ、 理解や修正が簡単に

    なるように、 ソフトウェアの内部構造を変化させること。 “ Martin Fowler. 新装版 リファクタリング 既存のコードを安全に改善する (p.53)
  11. 29 ©2023 Loglass Inc. リファクタリングの定義 by Martin Fowler “外部から見たときの振る舞いを保ちつつ、 理解や修正が簡単に

    なるように、 ソフトウェアの内部構造を変化させること。 “ Martin Fowler. 新装版 リファクタリング 既存のコードを安全に改善する (p.53) 内部構造(実装の詳細)をテストしてたら、 リファクタリングで変わるのでそりゃテストは落ちる
  12. 34 ©2023 Loglass Inc. 2. data classを安易に使わない • data classのcopyメソッドは実装の詳細

    ◦ ロジックが多いドメイン層には基本使わない ◦ 処理の都合上のデータをまとめたものに data classを使うのはOK
  13. 38 ©2023 Loglass Inc. まとめ • 偽陽性をとにかく減らしてリファクタしてもテストコードが不正に落ちないコードを目指そう ◦ そのためにKotlin ▪

    実装の詳細はprivateメソッドにする、privateメソッドをテストしない ▪ data classを安易に使わない ▪ init構文を使う ▪ テストダブルを安易に使わない
  14. 40