やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

【書評】単体テストの考え方 / 使い方 を読了しました

2022/12/28に「Manning Publishing: Unit Testing Principles, Practices, and Patterns」の翻訳書である「単体テストの考え方/使い方」という書籍が発売されました。買うか迷っていたのですが、TDD(テスト駆動開発)で有名なt_wadaさんがツイートされているのをお見かけして、いつものように衝動買いをしました。

著者は単体テストの第一人者であるウラジーミル・コリコフさんが書かれたもので、原書の評判は良く待望の日本語版です。先日、読了しましたので内容を簡単にまとめつつ、書評を書いてみようと思います。お値段は少々お高いですが、それだけの価値がある書籍だと僕は感じました。

オススメできる人・できない人

オススメできる人

  • 単体テストについて詳しくなりたい人
  • ある程度、単体テストを書いたことがある人
  • OOP, DDD, 関数型言語に知見がある人

オススメできない人

  • 「単体テスト?何それ美味しいの?」という状態の人
  • 単体テストを全く書いたことが無い人
  • 何かしらのプログラミング言語のコードを読めない人(本書のサンプルコードはC#で書かれています)

簡単な感想

第1部

タイトルにもあるように「単体テストの考え方/使い方」について徹底的に学べる一冊です。
単体テストとは何か、よく議論される結合テストと単体テストの違い・境界についてハッキリと書かれていて非常に参考になりました。単体テストが満たすべき3つの性質を満たしていないものを結合テスト(もしくはそれ以外)と呼ぶという考え方には納得するものがありました。

単体テストに「古典学派」と「ロンドン学派」という学派が別れていることも初めて知りました。
自分が書いてきた単体テストはどちらかというと古典学派に属するものでした。ロンドン学派ではテストするものに集中するために、それ以外のものを全てモックに置き換えてテストを行うというのには衝撃を受けました。

(※ちなみに筆者は古典学派で1つの振る舞いは1つのクラスに依存するとは限らないと考えているからでした)

第2部

単体テストとは何かが分かったところで、いよいよ良い単体テストの作り方・考え方が紹介されていきます。
良い単体テストを構成する4本の柱や、単体テストの手法の種類など、良くない状態の単体テストのコードを筆者の思う良い単体テストのコードへ変身させていきます。

細かい手法や方法はともかく、ここで一番、印象に残っているのはコードの設計が悪いと単体テストも悪いものになるという内容です。設計と単体テストは切ってもきれないものであるということを強く主張していました。

関数を純粋にすること、副作用を分離することで単体テストをしやすくするために関数型プログラミングの話が登場するのも面白かったです。

www.okb-shelf.work

www.okb-shelf.work

第3・4部

単体テストの話は終わり、結合テストの話に入っていきます。
先ほども書いたように、結合テストとは単体テストが満たすべき3つの性質を満たしていないテストを指します。本書で紹介されているのはコントローラーのテストです。個人的にはあまり刺さる内容はありませんでした。

単体テストのアンチパターンでプライベートなメソッドのテストをするべきではないというのは驚きました。いつも無理やりやっていたので、これがアンチパターンなのかと汗が出ました。

最後に

日々、単体テストを書きまくっているのですが「単体テストとは何か」を改めて考える良い機会になりました。
自分は伊藤先生のQiitaの記事や「Everyday Rails - RSpecによるRailsテスト入門」に非常にお世話になっており、気づいたら古典学派の単体テストを書いており著者が考える良いテストに近いものもありました。

自分は過去に無理やり関数型のパラダイムをオブジェクト指向の言語に持ち込んで痛い目を見たことがあるので、単体テストの書きやすさはあるものの、何でも関数型プログラミングを採用すれば良いとは考えていません。適材適所、使うべきところを見極める必要があります。

www.okb-shelf.work

単体テストについて、もう一つ理解を深めたいという方にはおすすめの書籍です。

少しでも「ええな〜」と思ったらイイネ!・シェア!・はてなブックマークを頂けると励みになります。