はじめに
ルーモス、光よ! nikkieです。
12/15(木)にみんなのPython勉強会が渋谷とオンライン(Zoom)でハイブリッド開催されました1。
久々に会場で聞くトークは刺激的でした。
私の中で特に刺激的だった、やっとむさんによる「手軽なpytestでテストを活用しよう!」をレポートします。
目次
- はじめに
- 目次
- 「手軽なpytestでテストを活用しよう!」の概要
- 今回のトークに至るまで
- ライブコーディングあり!「手軽なpytestでテストを活用しよう!」本編
- 終わりに
- P.S. その1 「不安を退屈に変える賢者の石」
- P.S. その2 アスタリスク、呼びました?
「手軽なpytestでテストを活用しよう!」の概要
どんなトークなのか、[ハイブリッド開催]みんなのPython勉強会#88 - connpassから一部を引用します。
書籍『テスト駆動Python第2版』が、今年8月に出版されました(私が監修を務めています)。こちらの内容をなぞりつつ、pytestの機能と使い方をご紹介します。
本日は #stapy で書籍『テスト駆動Python第2版』のトークをやらせていただきます! 今回はライブコーディングもやります(前回は時間切れになった)。オンライン参加はまだ申し込めます。書籍プレゼントも予定してます!(オンライン参加者も抽選に参加できます) https://t.co/Ym7GpQ1AJi
— YASUI Tsutomu (@yattom) 2022年12月15日
今回のトークに至るまで
2019年6月 みんなのPython勉強会#46
『テスト駆動Python』自体は2018年の出版(今年の第2版は改訂版)。
2019年6月のstapyでもやっとむさんに「『テスト駆動Python』入門」というトークをしていただいていました。
アーカイブが https://youtu.be/T7Tqt0fJG1A?t=4596 にあります。
nikkieとテスト駆動開発
初めて参加したPyCon JP 2018でやっとむさんのTDD実演を見ていました(たしか『テスト駆動Python』関連のスポンサーブースにて)。
#stapy やっとむさんのテスト実演見るのは #pyconjp 2018のブースでTDD実演FizzBuzzを見て以来!わくわく
— nikkie にっきー 🎤10/1 XP祭り 10/14-15 PyCon JP (@ftnext) 2022年12月15日
2019年6月の勉強会の感想がこちら。
#stapy
— nikkie にっきー 🎤10/1 XP祭り 10/14-15 PyCon JP (@ftnext) 2019年6月12日
恥ずかしながら、unittestでいいじゃんと思っていたのですが、pytestすっごく便利そう(これまで知らなかった。。)
- テストは行き先を示す道標 兼 足元を照らす明かり
- 安全に行ける歩幅で進む
- テスト駆動開発は身につけられる開発手法。TDDをしなくてもテストを書くこともある
2019年4月からユーザベースに転職していますが、TDDが少しずつ少しずつできるようになりました(現在も練習中)。
「テストコードが書けるようになってそれまでよりはるかに開発しやすくなったな」という実感があります2。
テストコードを書くのにunittest
を使うことが多かった3ですが、最近はpytest
も使っています。
『テスト駆動Python』は第1版を少しだけ読んでpytest
の使い方を学びました。
第2版は未読です。
「やっとむさんがテストを書くライブコーディングが見られる!」ととてもワクワクしていました4。
ライブコーディングあり!「手軽なpytestでテストを活用しよう!」本編
CSVファイルを読み込み、平均値を算出し、標準出力に出力するプログラムとそのテストコードを書いていきます5。
流れるようにデモ入りのトークが進んでいく。さすがすぎる。 #stapy pic.twitter.com/DhcL76QaSV
— すーぎー@革カブ (@soogie) 2022年12月15日
プラグインpytest-watch
は捗るぞ!
pytest-watch
を使って、ファイルの保存をトリガーにテストコードを実行し、RED(テスト失敗)・GREEN(テスト成功)が流れるように確認できていました。
都度pytest
コマンドを叩く必要がないので、ものすっごく楽になります。私もオススメです!
以下のツイートのときは、ptw -- -vv
で使いました。
『Clean Craftsmanship』で学んでる細かくRedとGreenを行き来するTDD、
— nikkie にっきー 🎤10/1 XP祭り 10/14-15 PyCon JP (@ftnext) 2022年9月17日
テスト実行コマンドを叩く回数も増えるわけですが、ファイルが変更されたら勝手にテスト実行で解決!https://t.co/UH1eL4UZcU
VSCodeで保存時フォーマットされるし、いまRedかGreenかすぐ分かるの本当に快適。heaven!😆
あとは型
他のプラグインとして、Describe-styleでテストコードが書けるpytest-describe
も紹介されました。
assert False
で始める儀式
assert False などでの儀式、やるやる #stapy
— kAZUYA tAKEI (@attakei) 2022年12月15日
テストコードの書き始めは明らかに失敗するassertion。
期待通り壊れることで、環境構築できていることを確認します。
これは『Clean Craftsmanship』でも紹介されている習慣ですね。
Uncle Bob流は、何もしないテストを通して、環境構築できていることを確認しています(第2章 スタックを作る例)。
何もしないテストから開始して、テストがパスすることを確認する習慣をつけよう。そうすることで、実行環境が機能していることがわかる。 (p.67)
ほんとに動いてるなら失敗するように変える
#stapy ほんとに動いてるなら失敗するように変える、
— nikkie にっきー 🎤10/1 XP祭り 10/14-15 PyCon JP (@ftnext) 2022年12月15日
これはClean Craftsmanshipでも説かれていた方法!
すべてコントロールした状態
通っているコードをわざと失敗させてテストコードに問題がないかも確認します。
これは松岡さん 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
でフィクスチャが自作できる」というのを知れたのが大きかったです。
テストコードの関数名は日本語(ドキュメント化!)
#stapy すっかり慣れてきたけど、日本系前提だったらテスト関数あたりは、当たり前のように日本語が使われ来てて良いなー
— kAZUYA tAKEI (@attakei) 2022年12月15日
def test_行が壊れている()
のようにテストケースを表す関数名は日本語です。
Python 3系から名前は日本語もいける6んですよね
これはテストコード自体をドキュメントにするためのアプローチと理解しています。
TDD Boot Campでt-wadaさんが言ってました https://youtu.be/Q-FJ3XmFlT8?t=7740
だんだんドキュメントに近づけていく
結び:「テストを味方につけよう」「不安を安心に変えよう」
素晴らしいトークでした。
— すーぎー@革カブ (@soogie) 2022年12月15日
#stapy pic.twitter.com/dx3asM17o1
ライブコーディングありのトークはあっという間でした。
最後の結びの言葉、これはケント・ベックの言に通じますね(『テスト駆動開発』第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
で掛け算のアスタリスクが言及されました。
#stapy いまアスタリスクの話しました?👀👀👀
— nikkie にっきー 🎤10/1 XP祭り 10/14-15 PyCon JP (@ftnext) 2022年12月15日
掛け算の*、PyCon JPで話した人🙋♂️
- 現地会場周りのスタッフ活動録はこちら:イベントレポート | ハイブリッド開催のみんなのPython勉強会#88(2022師走tapy)にスタッフ参加しました #stapy - nikkie-ftnextの日記↩
- TDDについてはLT「テスト駆動開発と私」をするなど。Tech BASE Okinawa徹底公開!!~全資料公開~ | 株式会社プロトソリューション(参加者LT)↩
- hoboroさんの「unittestで始めるユニットテスト入門」(PyCon JP 2019)がバイブルです↩
-
TDD Boot Campや『Clean Craftsmanship』など、テストコードを書くライブコーディングを見るのは非常に勉強になると感じます。
↩『Clean Craftsmanship』、Uncle BobがTDDをしているビデオを見られるのがめっちゃありがたい。
— nikkie にっきー 🎤10/1 XP祭り 10/14-15 PyCon JP (@ftnext) 2022年8月31日
Stackの実装 in TDD、リズムがわかったし、Uncle Bobでもテストの期待値間違える(弘法も筆の誤り)のも見られた。
✍️仮実装ではテストの失敗を確認。
私のTDDはもっと小さくRED-GREEN-REFACTORできそう - マイクスタンドはなかったのですが、司会の辻さんがマイク周りをサポートしてくださり、現地音声はバッチリ聞こえました。ありがとうございました↩
- マルチバイト文字OKなので、emojiもいける認識↩
- 『Harry Potter and the Philosopher's Stone』というふうにも使われていますし、『鋼の錬金術師』の「賢者の石」も同じものですよね↩
- スライドへの直リンク:https://ftnext.github.io/2022_slides/pyconjp/python_and_star.html#/5/3↩