nikkie-ftnextの日記

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

みんなのPython勉強会#88のやっとむさんによる「手軽なpytestでテストを活用しよう!」、テストコードに関係する知識が結び付き、刺激的でした #stapy

はじめに

ルーモス、光よ! nikkieです。

12/15(木)にみんなのPython勉強会が渋谷とオンライン(Zoom)でハイブリッド開催されました1
久々に会場で聞くトークは刺激的でした。
私の中で特に刺激的だった、やっとむさんによる「手軽なpytestでテストを活用しよう!」をレポートします。

目次

「手軽なpytestでテストを活用しよう!」の概要

どんなトークなのか、[ハイブリッド開催]みんなのPython勉強会#88 - connpassから一部を引用します。

書籍『テスト駆動Python第2版』が、今年8月に出版されました(私が監修を務めています)。こちらの内容をなぞりつつ、pytestの機能と使い方をご紹介します。

今回のトークに至るまで

2019年6月 みんなのPython勉強会#46

テスト駆動Python』自体は2018年の出版(今年の第2版は改訂版)。
2019年6月のstapyでもやっとむさんに「『テスト駆動Python』入門」というトークをしていただいていました。
アーカイブhttps://youtu.be/T7Tqt0fJG1A?t=4596 にあります。

nikkieとテスト駆動開発

初めて参加したPyCon JP 2018でやっとむさんのTDD実演を見ていました(たしか『テスト駆動Python』関連のスポンサーブースにて)。

2019年6月の勉強会の感想がこちら。

2019年4月からユーザベースに転職していますが、TDDが少しずつ少しずつできるようになりました(現在も練習中)。
「テストコードが書けるようになってそれまでよりはるかに開発しやすくなったな」という実感があります2

テストコードを書くのにunittestを使うことが多かった3ですが、最近はpytestも使っています。
『テスト駆動Python』は第1版を少しだけ読んでpytestの使い方を学びました。
第2版は未読です。

「やっとむさんがテストを書くライブコーディングが見られる!」ととてもワクワクしていました4

ライブコーディングあり!「手軽なpytestでテストを活用しよう!」本編

CSVファイルを読み込み、平均値を算出し、標準出力に出力するプログラムとそのテストコードを書いていきます5

プラグインpytest-watchは捗るぞ!

pytest-watchを使って、ファイルの保存をトリガーにテストコードを実行し、RED(テスト失敗)・GREEN(テスト成功)が流れるように確認できていました。

都度pytestコマンドを叩く必要がないので、ものすっごく楽になります。私もオススメです!
以下のツイートのときは、ptw -- -vvで使いました。

他のプラグインとして、Describe-styleでテストコードが書けるpytest-describeも紹介されました。

assert Falseで始める儀式

テストコードの書き始めは明らかに失敗するassertion。
期待通り壊れることで、環境構築できていることを確認します。

これは『Clean Craftsmanship』でも紹介されている習慣ですね。
Uncle Bob流は、何もしないテストを通して、環境構築できていることを確認しています(第2章 スタックを作る例)。

何もしないテストから開始して、テストがパスすることを確認する習慣をつけよう。そうすることで、実行環境が機能していることがわかる。 (p.67)

ほんとに動いてるなら失敗するように変える

通っているコードをわざと失敗させてテストコードに問題がないかも確認します。
これは松岡さん https://twitter.com/little_hand_s のDDDのデモでもお見かけしたなあ。

再びの『Clean Craftsmanship』ですが、最初に失敗する実装をし、一度テストを落としたあとで成功させるやり方が繰り返し説かれています(第2章 スタックを作る例)。
テストの期待値がTrueのときに、まずreturn Falseと実装して一度テストを落とし、次にreturn Trueと実装を修正するわけです。

失敗すべきときに失敗することを確認するためである。テストをテストしているのだ。(p.71)

わずか数秒で、テストが失敗すること、テストがパスすることを確認しているのである。(p.71)

失敗すべきときに失敗が確認できることで、テストがパスするときは正しく実装できている(たまたまパスするのではなく、正しく実装できているからパスする)という感覚が持てるのが大きいなと思います。
Cleanシリーズなのか他書なのか、どこで読んだか思い出せませんが、テスト駆動で進めながら状況を完全にコントロールしているという感覚が持てますね(後述の不安の話につながります)

組み込みフィクスチャの紹介

読み込むCSVファイルはパスがコマンドラインから渡され(sys.argv)、計算された平均値がprint関数で出力されます。
このテストを書く上でpytestの組み込みフィクスチャが力になります

  • monkeypatch: テスト用にsys.argvを設定するのに使いました(setattr
  • capsys: print関数による出力をテストするのに使いました

これらのフィクスチャ、第1版では以下で取り上げられていますね(第2版では章立てが変わっているかも)

  • 4.5 monkeypatchを使用する
  • 4.4 capsysを使用する

フィクスチャに関しては、第1版で「yieldでフィクスチャが自作できる」というのを知れたのが大きかったです。

テストコードの関数名は日本語(ドキュメント化!)

def test_行が壊れている()のようにテストケースを表す関数名は日本語です。
Python 3系から名前は日本語もいける6んですよね

これはテストコード自体をドキュメントにするためのアプローチと理解しています。
TDD Boot Campでt-wadaさんが言ってました https://youtu.be/Q-FJ3XmFlT8?t=7740

だんだんドキュメントに近づけていく

結び:「テストを味方につけよう」「不安を安心に変えよう」

ライブコーディングありのトークはあっという間でした。
最後の結びの言葉、これはケント・ベックの言に通じますね(『テスト駆動開発』第25章)。

テストは不安を退屈に変える賢者の石だ。(Kindle の位置No.3198)

この言葉、テストコードを練習して練度があがってくると、身体で理解している感じになりますね。
テストコードを書かない(書けない)ときに感じていた私の不安は、テストコードが書けるようになって退屈に変わりました(状況はコントロールしている!)。

終わりに

やっとむさんのトーク「手軽なpytestでテストを活用しよう!」のレポートでした。
ライブコーディングを見るのを通して、テストコードに関する自分の中の知識が結び付いて、大変刺激的な時間でした。

そういえばfin-pyコミュニティによる『テスト駆動Python第2版』の読書会があるんですよね(次回は12/21(水))。

第2版読みたくなってしまった自分がいまして、読書会も興味あります(検討しよう)。

やっとむさん、素晴らしいトークをありがとうございました!

P.S. その1 「不安を退屈に変える賢者の石」

結びの「不安を安心に変えよう」で思い出したのが、Django Congress JP 2018のtell-kさんのトーク「できる!Djangoでテスト!」。
そこでは「Kent Beck のお言葉」が紹介されています。

Tests are the Programmer’s Stone, transmuting fear into boredom

https://tell-k.github.io/djangocongressjp2018/#75

リファレンスをたどったところ、今回わかったのは、この出自は『テスト駆動開発』の英語版(原著)にあるということ。
該当する部分が、上で引用した「不安を退屈に変える賢者の石」です(第25章)。

原著では「the Programmer’s Stone」、日本語訳は「賢者の石」。
おそらくですが、ケント・ベックが賢者の石(the Philosopher's Stone7)をもじったのでしょう。
「賢者の石」と訳しているのすごすぎですね。

P.S. その2 アスタリスク、呼びました?

pytest.mark.parametrizeで掛け算のアスタリスクが言及されました。

Pythonとアスタリスク 🐍🌟💫🐍🌟💫8



  1. 現地会場周りのスタッフ活動録はこちら:イベントレポート | ハイブリッド開催のみんなのPython勉強会#88(2022師走tapy)にスタッフ参加しました #stapy - nikkie-ftnextの日記
  2. TDDについてはLT「テスト駆動開発と私」をするなど。Tech BASE Okinawa徹底公開!!~全資料公開~ | 株式会社プロトソリューション(参加者LT)
  3. hoboroさんの「unittestで始めるユニットテスト入門」(PyCon JP 2019)がバイブルです
  4. TDD Boot Campや『Clean Craftsmanship』など、テストコードを書くライブコーディングを見るのは非常に勉強になると感じます。
  5. マイクスタンドはなかったのですが、司会の辻さんがマイク周りをサポートしてくださり、現地音声はバッチリ聞こえました。ありがとうございました
  6. マルチバイト文字OKなので、emojiもいける認識
  7. Harry Potter and the Philosopher's Stone』というふうにも使われていますし、『鋼の錬金術師』の「賢者の石」も同じものですよね
  8. スライドへの直リンク:https://ftnext.github.io/2022_slides/pyconjp/python_and_star.html#/5/3