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

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

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. 1
    ©2023 Loglass Inc.
    Kotlinサーバサイドで頑張る「単体テストの考
    え方/使い方」
    2023.04.07 佐藤有斗(Yuiiitoto) 株式会社ログラス

    View full-size slide

  2. 2
    ©2023 Loglass Inc.
    自己紹介
    佐藤有斗(Yuiiitoto)
    ログラス エンジニア
    Kotlin Fest 2022でKotlinの型パワーについて話し
    てきました!

    View full-size slide

  3. 3
    ©2023 Loglass Inc.
    ログラスについて
    企業価値を向上する

    経営管理クラウド


    View full-size slide

  4. 4
    ©2023 Loglass Inc.
    ログラスについて(5秒)
    企業価値を向上する

    経営管理クラウド


    View full-size slide

  5. 5
    ©2023 Loglass Inc.
    皆さんにプログラマー人生で
    一番おすすめしたい本があります

    View full-size slide

  6. 6
    ©2023 Loglass Inc.
    Vladimir Khorikov(2022). 単体テストの考え方
    /使い方 より引用

    View full-size slide

  7. 7
    ©2023 Loglass Inc.
    ログラスについて(5秒)
    企業価値を向上する

    経営管理クラウド


    View full-size slide

  8. 8
    ©2023 Loglass Inc.
    なので今日はそのために

    View full-size slide

  9. 9
    ©2023 Loglass Inc.
    良いテストを作ろう。

    View full-size slide

  10. 10
    ©2023 Loglass Inc.
    良いテストは森羅万象を解決する(主観)
    ● 良いテストはリファクタリングのハードルを下げる。
    ● 良いテストは良いプロダクションコードを提供する。
    ● 良いテストは品質を良くする。ユーザーを安心させる。事業も伸びる。残業も減る。家族と過ごせ
    る時間も増える。他様々な悩みが減り、日常生活が豊かになる

    View full-size slide

  11. 11
    ©2023 Loglass Inc.
    この本の何がいいの?
    ● 良いテストコードとはなにか? というのが網羅的に体系化されている
    ● 単体テストだけでなく リファクタリング、プロダクションコード、統合テストにまで言及 されている
    ● 組織の共通知識として この本の情報がインプットされていると確実に品質が良くなる

    View full-size slide

  12. 12
    ©2023 Loglass Inc.
    ということでログラスでは毎週輪読会をやっています

    View full-size slide

  13. 13
    ©2023 Loglass Inc.
    今日のゴール
    ① 単体テストの考え方の本、読んでみようかなーって気になって
    いただく
    ② 特にKotlinで気をつけたいポイントを持ち帰っていただく
    大事さ: ① >>>>>>>>>>>>> ②

    View full-size slide

  14. 14
    ©2023 Loglass Inc.
    Excuse ⚠
    ● 武器になり得るくらいには厚い本のため全ての内容には触れません
    ○ 体感5%くらいしか扱えません
    ● ちょいちょいKotlinに繋げますが、大枠他の言語でも対応可能な内容です

    View full-size slide

  15. 15
    ©2023 Loglass Inc.
    良い単体テストとは?
    1. 退行(regression)に対する保護
    2. リファクタリングへの耐性
    3. 迅速なフィードバック
    4. 保守のしやすさ
    単体テストの考え方
    /使い方 第4章参照

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. 18
    ©2023 Loglass Inc.
    リファクタリングへの耐性が高いとは?
    ● 偽陽性 (false positive)が少ないこと
    ○ 偽陽性とは テスト対象のコードが実際には意図通りの振る舞いをしているのにもかかわら
    ず、テストが失敗すること
    ○ 偽陽性を減らすには 観察可能な振る舞いのみをテストし、実装の詳細をテストしないこと
    ■ 絶対にSQL自体を文字列でテストするなよ!!絶対だぞ!!
    単体テストの考え方
    /使い方 第4~5章参照

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  21. 21
    ©2023 Loglass Inc.
    具体的にコードで表すと
    ● 実装の詳細を公開しないこと。テストしないこと
    単体テストの考え方
    /使い方
    第5章参照

    View full-size slide

  22. 22
    ©2023 Loglass Inc.
    具体的にコードで表すと
    ● 実装の詳細であるバリデーションが公開されている
    単体テストの考え方
    /使い方
    第5章参照

    View full-size slide

  23. 23
    ©2023 Loglass Inc.
    具体的にコードで表すと
    ● バリデーションがprivateになり、更新処理の中に
    単体テストの考え方
    /使い方
    第5章参照

    View full-size slide

  24. 24
    ©2023 Loglass Inc.
    テストコード
    ● NGは実装の詳細をテスト。 Goodは振る舞いをテスト
    単体テストの考え方
    /使い方 第5章参照

    View full-size slide

  25. 25
    ©2023 Loglass Inc.
    リファクタリングの耐性?
    ● checkNameメソッドを使うのをやめる

    View full-size slide

  26. 26
    ©2023 Loglass Inc.
    テストコード
    ● 仕様は変えていないのに NGの方のテストが落ちてしまう
    単体テストの考え方
    /使い方 第5章参照

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  30. 30
    ©2023 Loglass Inc.
    で、Kotlinでは?
    (お待たせしました)

    View full-size slide

  31. 31
    ©2023 Loglass Inc.
    Kotlinでは特にどうすべきか?
    1. 実装の詳細はprivateメソッドにする、privateメソッドをテストしない
    2. data classを安易に使わない
    3. init構文を使う
    4. テストダブル(広義のモック)を安易に使わない

    View full-size slide

  32. 32
    ©2023 Loglass Inc.
    1 . 実装の詳細はprivateメソッドにする、privateメソッドをテストしない

    View full-size slide

  33. 33
    ©2023 Loglass Inc.
    1 . 実装の詳細はprivateメソッドにする、privateメソッドをテストしない

    View full-size slide

  34. 34
    ©2023 Loglass Inc.
    2. data classを安易に使わない
    ● data classのcopyメソッドは実装の詳細
    ○ ロジックが多いドメイン層には基本使わない
    ○ 処理の都合上のデータをまとめたものに
    data classを使うのはOK

    View full-size slide

  35. 35
    ©2023 Loglass Inc.
    3. init構文を使う
    ● インスタンスの不変条件を定義するには init構文が
    一番強力
    ○ createメソッドや別経路のインスタンス作成
    全てに適用可能

    View full-size slide

  36. 36
    ©2023 Loglass Inc.
    4. テストダブル(広義のモック)を安易に使わない
    ● テストコードに実装の詳細が漏れている

    View full-size slide

  37. 37
    ©2023 Loglass Inc.
    4. テストダブル(広義のモック)を安易に使わない
    ● テストコードに実装の詳細が漏れている

    View full-size slide

  38. 38
    ©2023 Loglass Inc.
    まとめ
    ● 偽陽性をとにかく減らしてリファクタしてもテストコードが不正に落ちないコードを目指そう
    ○ そのためにKotlin
    ■ 実装の詳細はprivateメソッドにする、privateメソッドをテストしない
    ■ data classを安易に使わない
    ■ init構文を使う
    ■ テストダブルを安易に使わない

    View full-size slide

  39. 39
    ©2023 Loglass Inc.
    ありがとうございました!
    ● kotlin-treeというKotlinでCollection APIのように
    木構造を扱えるOSSを作っています!
    気が向いたら使ってみてください(宣伝)
    ● あとログラス絶賛採用中です!

    View full-size slide