nikkie-ftnextの日記

イベントレポートや読書メモを発信

読書ログ | #ちょうぜつ本 第6章前半 〜テスト駆動開発に向け、一歩一歩着実に前準備〜

はじめに

変更しやすいコードが書けないのにソフトウェア開発とか舐めているのですか
天使様1ごめんなさい〜、nikkieです

「かわいい」と技術書が夢の合体を果たした、ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)!🤗
読書会と絡めて読み進めており、今回は第6章「テスト駆動開発」を6.4まで読みました。

目次

前回のちょうぜつ本!

いわしまんさんの書評エントリがきっかけで、手に取りました。
5章まで読み進め、

今回は次の読書会の範囲になっている6章前半の読書ログです!

6章前半(6.1〜6.4)

章のタイトルはテスト駆動開発ですが、6.4までではテスト駆動開発にはまだ至っていません。
(5章でも挙げられた)飽和関数を例に、テストコードの書き方を1つ1つ解説しています。

この先のテスト駆動開発につなげるための準備を着実に進めている印象です。

思い返せば私はテスト駆動開発に体当たりだった2ので、テストコードの書き方、モック、テスト駆動開発といろいろなものが同時に押し寄せました。
ちょうぜつ本のこの構成は当時読んでいたらその分かりやすさに喜びの涙を流したでしょう。

テスト駆動開発をふだんやっている身としても、理論面が補強され、知識が整理された感覚です。

印象的だったポイントを2つ挙げます。

単体テストにまつわる考え方

改めて気づきがあったな〜という点を書いていきます。
※あくまで私の理解です

  • 部品品質の保証を積み上げる
    • 部品を使うのはプログラム。なので保証もプログラムで書く(=テストコード)
  • 徹底的に部品をテストする例(min、max)
    • これらの部品を使う飽和関数では、引数の組のパターンを抑え込める
    • 結合機能テストにしない(部品ごとに区切って徹底的にテスト
  • 一方、テストコードによる品質保証は自己申告でもある
  • 蓄積した単体テストコードで回帰テスト

モックってそういうことか!

スタブとモックの何が違うかが整理されました。
テストコードで使われ方を検証できるのがモック!
テスト駆動開発』の付録Cにはt-wadaさんの解説もあったと思うので、そちらにも挑みたいところ。

モックする/しないについては以下が参考になります(思えばモックについての指針に書籍で初めて出会ったかも(<-不勉強))。

一般的には、単一パッケージ内のクラス関係は、直接依存で単体テストを書き、異なるパッケージのクラスを使う場合だけモック化するのがオススメです。(Kindle版 p.226)

この方針はパッケージ原則(2章)3とも絡むんですよね〜、なるほど。

オブジェクト指向らしいxUnitの使い方としてのモックという見方は気づきがありました。
単体テストしにくい設計はオブジェクト指向というパラダイムに乗り切れていないという主張もあったのですが、これは冒頭の天使様の言に対してのように「ごめんなさい〜」です。

IMO:Pythonのモックについて思うこと

PythonにおけるxUnitって標準ライブラリのunittestなんですよね。

unittest ユニットテストフレームワークは元々 JUnit に触発されたもので、

で、Pythonのモックなのですが、こいつは他の言語のモックとはちょっと違うように感じているのです。

ちょうぜつ本のPHPUnitの例だと4

  • mathはモック
  • mathのmaxメソッドが少なくとも1回、2と1を引数に呼ばれたら
    • maxは2を返す

のようにコードを書いています。

Pythonだとこう

math = MagicMock(spec=Math)
math.max.return_value = 2  # maxメソッドは2を返す

# Action(実行される中で、モックになっているmath.maxも呼ばれる)

math.max.assert_called_once_with(2, 1)  # maxメソッドは2と1を引数に、1回呼び出されていることの検証

PHPUnitのコードと違う点

  • この引数で呼び出されたらこの値を返すという設定はしない
    • どんな引数であれ呼び出されたらこの値を返すという設定
  • 呼び出しの検証を別でする

どんな思想があってこの使い方になるのか、これもxUnitのモックといっていいのか、気になるところです〜

終わりに

ちょうぜつ本 第6章前半で、テスト駆動開発を学ぶ準備をしました。
ふだんテスト駆動開発をしている身からしても、特に以下の点で知識が整理されました!

Pythonで写経したコードはこちらです:

ちなみに第6章の個人的最かわいいポイントは6-4の挿絵!
とある話題を振られてあわあわしてるそけっとさんかわいい
「モックオブジェクトでいい」はわかりみが深いです(二次元はモックオブジェクト説)

P.S.その1 テスト駆動開発を楽しく学ぶ

ちょうぜつ本ではかわいいの力でテスト駆動開発を楽しく学べています。

世界は広く、テスト駆動開発ゲームしながら学ぶこともできるのです!
それがミノ駆動さんによる、バグハンター2 REBOOT!!

全8話なのですが、5話はテスト駆動開発がフィーチャーされます。
フェザ子おおおお😭

P.S.その2 9/1(金) 第6章「テスト駆動開発」前半のちょうぜつ本_読書py!

次回ちょうぜつ本_読書py(Python使い視点でちょうぜつ本を読む、みんなのアウトプット中心の読書会)は9/1(金)です!

常連さんも、お久しぶりの方も、はじめましての方も単体テストに興味ある方、大歓迎です!
ぜひぜひお気軽にお越しください〜


  1. ちょうぜつ本読書ログシリーズではおなじみのこちらの書き出し。元は『お隣の天使様にいつの間にか駄目人間にされていた件』の「家事ができないのに一人暮らしとか舐めているのですか」です
  2. 3月のライオンの桐山くんみがあります(長くなりそうなのでまたの機会に)
  3. KotlinのMockKも共通だと思います(expect, return)