nikkie-ftnextの日記

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

#pyconapac2023 トーク「練習してテストを書けるようになるんだ」extra | テストを書くようになったあなたと語りたいトピック集

はじめに

倍くらい頑張れば... nikkieです。

今日はDay0、明日からPyCon APAC 2023カンファレンスです!

15分(英語で)テストが書けるようになるための知見を発表するのですが、話したいこと全部は15分には収まらないのでエントリにしています。
第2弾は、トークを機にテストを書くようになった方と話したいトピック集(またの名を、トークの対象レベルを上回るためにカットした部分中心のコメンタリー)です。

目次

日本語テストメソッド

トークではpytestで書くテストのメソッド名を日本語で示しました。
これは以下の記事1に納得し、今回採用したものとなります。

[ポイント] 日本語テストメソッド
日本語テストメソッドとは、日本語でコミュニケーションをとっているプロジェクトの場合、日本語でテストメソッド名を書いても良いのではないかという考え方です。

この考え方には議論があるようで、上記の記事でも議論へのリンクがあります。

後述するt-wadaさんのテスト駆動開発の例と関係するのですが、日本語テストメソッドにするとテストコードがまさに動作する仕様書になっている感があります!

printはテストしないという考え方

トークではFizzBuzzを例にしています。
テスト対象のfizzbuzz関数はFizzBuzzのルールに則った文字列を返すだけで、画面出力はしません。
これは意図を持ってやっています。

pytestの強力なフィクスチャを使えば出力の検証もできますが2、私の考えはそこまでやらなくてもよいというものです。
fizzbuzz関数の返り値(メモリ上の値)が徹底的にテストできているならば、それをprintするだけの箇所にテストがなくても問題ないという立場です。

『Clean Craftsmanship』では「コードに恥をかかせる」と述べられています

したがって、このパターンの目的は、テストする必要がないほど質素なコードにして、コードに恥をかかせることである。(Kindle版 p.193 第4章)

モックのコツ

モックの使い方ダメダメだったなと直近ぶん殴られた経験をしています。

「Don’t Mock What You Don’t Own」(意訳 所有していないものをモックするな)

例えば、HTTPライブラリを使う実装のテストでモックを使うときは、HTTPライブラリをラップする薄いレイヤーを自作して、それをモックしよう

この警句をモックを多用するモック主義TDDが主張していることに、「なんでもモックすればいいじゃん!」と思っていたnikkieは大マサカリを食らったのでした3

また、ちょうぜつ本で知った「作ると使うを分ける」という考え方も、モックのしやすさに通じるものがあると思います。
モックを渡して使い方を検証すればいいと理解しています。

テスト駆動開発

テストコードを先に書く開発スタイルです。
私は4年程度の経験があり、非常に手に馴染んでいます。

この習慣により達成されるのは、実装とテストコードの歩調を合わせる

テストコードを書けるようになったら、私の希望としては、ぜひテスト駆動開発を試してみてほしいですね。
私はテスト駆動開発で、不安から完全に解き放たれました。
「テストが全部通ってるんでしょ? じゃあ何も問題ない!」

テスト駆動開発の国内のヨーダ的存在、t-wadaさんによるライブコーディングのアーカイブがあり、オススメです!(何回か見てます)
https://www.youtube.com/watch?v=Q-FJ3XmFlT8&t=1145s

私は小さく進めるテスト駆動開発が気に入っていて、先日XP祭りでワークショップもしました。

開発者のためのテスト

テストコードを先に書くテスト駆動開発なのですが、テストという言葉の意味が一般的な意味と異なってきます。
テストと言ったら品質保証(QA)を思い浮かべる方が多いんじゃないかと思います。
それに対してテスト駆動開発のテストは、開発者が自信を持って開発を進めるためのものです。
QA目的とは別なのです4

テスト駆動開発の"テスト"はDeveloper Testing

今回のトークで扱ったテストコードも開発者のためのものですね。

脱線:assert文の使い所

pytestでテストを使うときに使うassert。
これをpytest以外で普段から使っている方は少ないんじゃないかと思います。
「え?テストコード以外で利用シーンなんてあるの?」
はい、あるんです。表明 として使います。

t-wadaさんのトークをきっかけに知ったのですが、「assertって全然使われていないように思い込んでいたけど、ちゃんと使い所ってあるんだなあ」と私は感動しました。
表明としてのassertは、使いこなせるように日々素振りって感じです。

終わりに

時間と対象の制約により PyCon APAC 2023のトークに盛り込めないトピックについて、このエントリに書き出しました。
ここが到達点ではない(=通過点にすぎない)と思っていますし、積ん読しているテスト関係の書籍もあるので、このバックアップの上に積み上げていきたいですね。
PyCon APACやPythonコミュニティでは、ここに書き出したトピックについて意見交換できたらとっても嬉しいです


  1. ちょうぜつ本_読書pyの中で共同主催のYumihikiさんから教えていただきました。ありがとうございます
  2. capsys
  3. 同じくらいのかわいさであればどんなによかったことか
  4. QA目的、かつそのテストの自動化として、E2Eの各種ツールがあるように見えています(経験中)