はじめに
「頑張れ!」ってきっと 愛してるって言葉♪ nikkieです
2/11のPHPカンファレンス2024登壇1準備より1ネタ。
PHPカンファレンス2022にとてもよいユニットテスト入門トークがありました。
目次
「実践!ユニットテスト入門」
プログラミングをするパンダさんによる発表です。
テストを書いたことのない方が、テストを書いてみたいと思ってもらえることを目指します。
サンプルコードは PHP + PHPUnit ですが、他言語でも通用する考え方を紹介します。
入門者から初心者へという内容です。
ここがよかった!
私はPyCon APAC 2023で「練習してテストを書けるようになるんだ」というトークをしています。
その立場からすると、プログラミングをするパンダさんのこちらの発表は解 釈 一 致なんですよ!
ユニットテストを書いたことがない開発者向けに、3つの点が話されます。
- テストを書くためのモチベーションを上げる
- 明日からテストを実践するための知識を得る
- テストを通してソフトウェア開発の全体像を学ぶ
1. テストを書くためのモチベーションを上げる より
バグを出さないための自動テスト -> 始めるのはユニットテストから(テストピラミッド参照)ということでPHPUnitが導入されます。
PHPUnitを使ったテストの書き方の紹介、これを聞いたら書いたことがなくても書いてみようと思えるのではないでしょうか。
そして嬉しい用語解説!
自分の発表準備から、テストに関する言い回しって結構独特だと思います。
- 成功=パス=グリーン
- 失敗=落ちる=レッド
PHPUnitによるユニットテストの書き方だけでなく、実行したときの結果の見方も伝えられていました👏
2. 明日からテストを実践するための知識を得る より
以下の5つが紹介されます
- テストケースは日本語で書こう2
- arrange / act / assert パターンで書こう
- いろんなassertionを知ろう
- setUp / tearDown で前後の処理をしよう
- dataProviderでテストケースをまとめよう
ここの組み立ては非常に鮮やかですね。
2の3Aパターン3は私も自分のトークで紹介しました。
このトークが見事な点の1つは、3Aパターンを導入したことで、続く3,4,5が3Aのどこの話かが分かりやすいことだと思います。
テストの読み方にも言及!(学びがありました)
assertSameとassertEquals(などなど)
- assertSameは型を見る(
===
) - assertEqualsは型まで見ない(
==
)
アサーションの中からテストの意図を伝えるものを選ぶ!(slide=60,61)4
setUpでarrangeをまとめる
dataProviderの導入と合わせて知れて嬉しい警句
dataProviderってpytestでいうparametrize5だと思うのですが、たしかにテストのリファクタリングとして書いています。
「もう1ケース追加しようと思ったらparametrize(dataProvider)で書けそうだぞ。よし、まずは既存のケースを移行だけしよう。できた、2ケース目追加!」みたいな感じです。
ここまで「ここがいいぞ。とにかくいいぞ」と書いていますが、立場が違いそうな点としてはDRY原則。
重複とありますが、これを押し出しすぎるとコードの見た目が似ているからとDRY原則を誤って適用しかねません6。
『達人プログラマー』に詳しいのですが
コードは同じですが、これらコードが表現している知識は異なっているのです。(9 DRY原則ー二重化の過ち)
重複には今たまたま重複している(共通化してしまうと後でかえって困る)場合があるんですよね(転んで学んだ)。
私はテストコードはdataProvider(やpytestのフィクスチャ7)は使いますが、ソフトウェアのコードほどゴリゴリにDRYにはしないようにしています。
圧巻の付録!
forteeのプロポーザルに以下がありました。
(略) TDD を3年間実践してきた経験に基づいてお話しします。
これは付録に結実していますね。
②でテスト駆動開発、すなわち、ユニットテストを設計に使う話題
付録の内容はさらなる学習のための資料につながっていて、私の積ん読です。
挙げられた資料の中にはモックへの言及も(slide=143)
終わりに
PHPカンファレンス2022のトーク「実践!ユニットテスト入門」が同様のトークをした立場として刺さりました。
明日からテストを実践するための知識5つ、とてもよいですね。
これはPHPUnitのドキュメントを蒸留した内容と言えるんじゃないでしょうか。
発表中にもありますが、PHPやPHPUnitに限定される内容ではなく、他のテストフレームワーク、他のプログラミング言語でも有用な知見だと思います(つまり、全人類にオススメ!)。
プログラミングをするパンダさん、ご発表ありがとうございました!
この記事のきっかけツイートはこちら
#phpcon2022 の実践!ユニットテスト入門をアーカイブ視聴。
— nikkie / にっきー (@ftnext) 2024年2月5日
めっちゃよかった。入門者から初心者へ。これでテストを書き出せますね!https://t.co/seYf5RbZKC
これ私 #phpkansai でテストの話する必要ある?ってくらいよかったです👏
- 大阪で僕と握手!↩
- 参考:#pyconapac2023 トーク「練習してテストを書けるようになるんだ」extra | テストを書くようになったあなたと語りたいトピック集 - nikkie-ftnextの日記↩
- 発表資料中のリンクより http://wiki.c2.com/?ArrangeActAssert↩
- この点、Pythonではunittestは汲んでいますが、pytestはむしろ全部assert文で開発者が楽をすればいいという真逆の思想ですね↩
- 一例です ↩
- ミノ駆動さんの発表でも鮮明に焼き付きました ↩
- pytestでarrangeをすっきりさせる方法の1つです。 連鎖できるのがマジですごいです! ↩