Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 ©2023 Loglass Inc. ログラスについて 企業価値を向上する
 経営管理クラウド


Slide 4

Slide 4 text

4 ©2023 Loglass Inc. ログラスについて(5秒) 企業価値を向上する
 経営管理クラウド


Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

7 ©2023 Loglass Inc. ログラスについて(5秒) 企業価値を向上する
 経営管理クラウド


Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

40