『単体テストの考え方/使い方』
https://gyazo.com/c22de6a64c71fbe9472d1b2ed35aad97
2022/12/28
Vladimir Khorikov 著
須田智之 編集
/mrsekut-book-4839981728
サンプルコードはC#
章末の「まとめ」がかなりしっかり箇条書きで書かれているので、始めにそこを読むと良さそうmrsekut.icon
全体的に内容は良いんだけど、主張に対して文章量が多すぎ
やっぱ色の付いてないコードは読みづらいなあ
これはしゃあないが
GitHubでコード公開してほしい
https://swet.dena.com/entry/2023/11/13/170000
swetの
第1部: 単体 (unit) テストとは
/mrsekut-book-4839981728/018 (第1部: 単体 (unit) テストとは)
Unit Testの概要や原則についての紹介
第1章 なぜ、単体 (unit) テストを行うのか?
/mrsekut-book-4839981728/020 (第1章 なぜ、単体 (unit) テストを行うのか?)
A. プロジェクトの成長を持続可能なものにするため
mrsekut.iconの場合、そもそもたくさんのtest codeを書いてないので「質の悪いtest codeを原因とした体験劣化」という状態を経験したことがないんだよな
なので、その課題感が刺さりづらい
test coverageについて
割と当たり前なことを書いている印象mrsekut.icon
テスト初見の人にとってはかなり良い内容だと思う
どちらかと言うと、テスト書いてない人というよりか、書きすぎている人に刺さる内容か
第2章 単体テストとは何か?
/mrsekut-book-4839981728/044 (第2章 単体テストとは何か?)
ロンドン学派とデトロイト学派の違いが、単体テストの定義に関わる
この本はデトロイト学派寄り
DOCの分類
この章は、いろいろ整理がなされていて面白いmrsekut.icon*2
協力者オブジェクト
第3章 単体テストの構造的解析
/mrsekut-book-4839981728/074 (第3章 単体テストの構造的解析)
1つのtest caseを書く際の指針について
どうやったら読みやすくなるのか
最低限のルールなど
AAAパターン
第2部: 単体テストとその価値
/mrsekut-book-4839981728/110 (第2部: 単体テストとその価値)
第4章 良い単体テストを構成する4本の柱
/mrsekut-book-4839981728/112 (第4章 良い単体テストを構成する4本の柱)
価値のあるtest caseを認識する
testする対象を見極める
4.1, 4.2がかなり良いmrsekut.icon*2
4本の柱に対する極端な例が書いてるの、イメージがつきやすくて良い
/mrsekut-book-4839981728/132 ~
4本の柱のトレードオフの話、言ってることはわかるが実際に書くときにわざわざこれのどれを踏襲しているか、とか考えるものなのだろうか
あー、test pyramidを例にとれば確かにわかりやすいmrsekut.icon
第5章 モックの利用とテストの壊れやすさ
/mrsekut-book-4839981728/148 (第5章 モックの利用とテストの壊れやすさ)
Test Doubleの5分類についての整理
ざっくり2つとして整理してくれるの助かるmrsekut.icon
プロダクションコードの2軸
publicなAPI、privateなAPI
観察可能な振る舞い、実装の詳細
/mrsekut-book-4839981728/167 (5.3 モックの利用とテストの壊れやすさとの関係)〜
ここから
ヘキサゴナルアーキテクチャ
3つの性質
ドメイン層とアプリケーション・サービス層の関心の分離
依存の向きが一方こう
テストする際にinterfaceを経由する
2つのコミュニケーション
システム内コミュニケーション
実装の詳細
システム間コミュニケーション
観察可能な振る舞いの一部
mockを使って良いのはこちらだけ
第6章 単体テストの3つの手法
/mrsekut-book-4839981728/184 (第6章 単体テストの3つの手法)
単体テストを3つに分類する
C#はOOPやもんねぇmrsekut.icon
FPに関するところは基本的すぎるので読み飛ばした
Functional Coreについて軽く触れられている
ここの話、具体的なコードが一切ないけどFP触れたことない人に伝わってるんだろうか
/mrsekut-book-4839981728/206 (6.4 関数型アーキテクチャおよび出力値ベース・テストへの移行)
具体的なテストコードを題材にしてリファクタしていく
最初のコードではそもそも単体テストの定義を1つしか満たしていない
元の実装内で、直接fsに依存していた部分をInterfaceに変換することでmockしやすくする
FileContentやFileUpdateといった、eventを表す構造をやり取りするように変換する
これは説明のためで仕方ないのかもしれないが、関数型のアプローチとは発想の順序が逆やなあmrsekut.icon
なぜOOP言語使ってるんスカ、という気持ちになる
第7章 単体テストの価値を高めるリファクタリング
/mrsekut-book-4839981728/230 (第7章 単体テストの価値を高めるリファクタリング)
test codeのrefactoring
先にまとめを読むmrsekut.icon
コードの複雑さは分岐の数で判断できる
ドメインにおける重要性は、問題領域においての重要度のこと
複雑で重要なものが良いテスト対象
任意のプロダクションコードは以下の4つに分類できる
ドメイン・モデル/アルゴリズム
unit
取るに足らないコード
コントローラ
integration
過度に複雑なコード
↑の2つに分割しよう
Humble Object
コードの広さ、コードの深さ
広さは協力者オブジェクトの多さのことを意味する
両方を兼ね備えてはいけない
Domain Event
第3部: 統合 (integration) テスト
第8章 なぜ、統合 (integration) テストを行うのか?
/mrsekut-book-4839981728/278 (第8章 なぜ、統合 (integration) テストを行うのか?)
Integration TestとはUnit testではないテストのこと
どのようなプロセス外依存をモックに置き換えるべきか?
プロセス外依存の2つの分類
managed dependency
unmanaged dependency
具体例
/mrsekut-book-4839981728/306~
先にまとめを読むmrsekut.icon
管理下にある依存を扱う層をすべて経由する検証を行う
確認フェーズでもDBにアクセスする
なるほどmrsekut.icon
サポートログと診断ログ
スタッフが見るか、エンジニアが見るか
第9章 モックのベスト・プラクティス
/mrsekut-book-4839981728/324 (第9章 モックのベスト・プラクティス)
先にまとめを読むmrsekut.icon
mock
第10章 データベースに対するテスト
/mrsekut-book-4839981728/344 (第10章 データベースに対するテスト)
DBのテストの事前準備について
Schema定義をGitで管理する
Prismaのmigrationの仕組みとかそれだねmrsekut.icon
参照データもschemaに含める
開発者ごとに個別のDB instanceを用意する
コンテナなどで用意できれば良い
DB schemaの変更の反映のための2つ方法
/mrsekut-book-4839981728/348
状態ベース
DB同士を比較するツールを使う
こっち見たこと無いなmrsekut.icon
移行ベース
Gitで管理するmigration fileを使う
こちらの方がmerge競合への対処が楽
Flyway, Liquibaseなど
/mrsekut-book-4839981728/352 (10.2 データベース・トランザクションの管理)
transactionの説明が長え
DBを扱うときの基本的な話だからわざわざテスト本に書くこと無いだろう
/mrsekut-book-4839981728/362~
DBに対するテストって、具体的に何のテストのこと?
APIのCURDが機能するかとかそういう話?
先にまとめを読むmrsekut.icon
Repositoryのtest
test caseの異なるフェーズで同じDB transactionを使わない
準備フェーズ、実行フェーズ、確認フェーズでそれぞれ別のdb transactionを持つ
どういうこと?
結合テストではtest caseを1つずつ実行する必要がある
テストの後始末に描ける時間を減らす
in memory dbを使わない
書き込みに対するテストが重要
第4部: 単体テストのアンチ・パターン
/mrsekut-book-4839981728/386 (第4部: 単体テストのアンチ・パターン)
第11章 単体テストのアンチ・パターン
先にまとめを読むmrsekut.icon
テストのためにprivateなものを公開しない
間接的にテストする
アルゴリズムやロジックの知識をテストに持ってきてはならない
ドメイン知識がテストに漏洩することを避けないといけない
環境コンテキスト
日付や時刻のテストの話かな
#スクボ読書化した本