04/01(月) は「【東京:高円寺】テスト駆動飲み会 -Test Driven Drinking-【4/01】」に参加してきました。
会場は 株式会社ヴァル研究所 さんのイベントスペース。
目次
テスト駆動飲み会とは
昨年参加した時の参加報告がありますので、こちらを参照してください。
テスト駆動開発に全員が参加していてツイートする暇はない、ということでTwitterのハッシュタグなどは有りません。 興味が出てきた方は次回は是非参加してみてください!
内容
テスト駆動飲み会という名の通り、まずは飲み物と食べ物から始まります。これは前回も同じですね。
今回はたこ焼きがたくさんあった事もあり TDDというのは たこ焼き駆動開発 ということで盛り上がってました。 こういうところもいいですよね。(笑)
はじめての参加だった前回と違って、今回は顔を覚えていただいていたことも有ってリラックスして参加できました。 どういう流れで進めるのかも分かってきたので、リズムがつかみやすかったというのもあります。
お題や使う言語などはその場に集まったメンバーで決めるということで、自分の知らない言語を使ってTDDを学べるというのが面白いです。 今回はPythonを使ってPokerのプログラムを開発するという事になりました。
前回参加したときはほぼ全員知らない言語のGoだった事もあり、言語仕様を理解するところからで結構時間がかかったのですが、今回はPythonということで、知っている人も多くて結構スムーズに進んでいた気がします。
今回もコードは Cyber-dojo で書きました。
ブラウザさえ有れば、面倒な環境構築なしにテスト駆動でコードを書けるというサイトです。 対応する言語も30以上あります。 更にサンプルコードも用意されていてすぐに始められるので、TDDを手を動かしながら学びたいという人には結構おすすめです。 表記は英語ですけど、コメントなどに日本語を使っても大丈夫なようです
始め方は、まずサイトのトップページで
- 一人でコードを書く(I'm on my own)
- 複数人でコードを書く(We're in a group)
のいずれかを選択(ボタンをクリック)します。 今回はモブでドライバーは一人なので I'm on my own の方をクリックします。
次に新しくセッションを始めるかを聞かれるので Create a new session をクリックします。
最後に、language, test-frameworkのリストから"Python, pytest"、exerciseから "Poker Hands"を選びます。
これでメイン画面が開きます。 メイン画面では以下のようなことができます。
- コードを書く(実装/テストコード)
- ファイル操作(ファイルの追加/削除/名前変更)
- テストを実行
- 要件の確認
- 結果出力(標準出力/標準エラー出力など)を確認する
- テスト実行オプション設定
コード画面では保存操作も不要なので、書いてはテスト実行、という手順の繰り返しに集中できます。
今回は7分間ずつドライバー(コードを打ち込む人)とナビゲーター(ドライバーに指示する人達)を交代しながら進めました。
最初に、要件(readme.txに書かれている)から、どんな事をしなければいけないか?というのをホワイトボードに書き出し、その中からナビゲーターがドライバーに書くコードを指示します。 今回はルールや持ち手を実装するのは後回しにして「ペアかどうかのチェック」という簡単な要件から始めました。 全員がPythonやTDDに慣れているわけではないので、最初は簡単なところから初めて感覚とリズムを作るという戦略だったわけですが、これは今回すごくうまく行ったように感じました。
進めるリズムとしては
スタート ↓ 要件を元にテスト作成 ↓ テスト実行(失敗:レッド) ↓ コードを作成/修正してテスト実行(成功:グリーン) ↓ リファクタリング ↓ テスト実行(成功:グリーン) ↓ スタートに戻る
という感じで、流れ自体は複雑なものではありません。 でも、流れに慣れていないと実装ではなくテストの方を修正しようとしてしまったりして、未だにアタフタしちゃいます(汗
あと、今回Pythonとpytestの組み合わせだったのですが、pytestでは他のxUnitにある setup に相当するものとして @pytest.fixture
というのを初めて知りました。これを使うと、最初にインスタンスを作成して、みたいなクドくなりがちな処理を共通化して使うことができるようになります。下のコードの例だと、def test_same_two_numbers(self, checker)
の checker という引数部分を @pytest.fixture
の直後にある def checker():
の関数で生成して返してくれる、という仕掛けなのですが、なかなかおもしろいなぁと思います。
@pytest.fixture def checker(): return Checker() def test_same_two_numbers(self, checker): assert checker.has_pair(1,1) == True
あともう一つ。pytest のコードは class で括ってグルーピングできるようです。うまく使えばいい感じでテストコードの可読性をあげられそうですね。
class Test_one_pair: class Test_one_pair: def test_same_two_numbers(self, checker): assert checker.has_pair(1,1) == True class Test_no_one_pair: def test_different_two_numbers(self, checker): assert checker.has_pair(1,2) == False
この辺りの話はやっとむさんが監修した本にも書かれているようですので、興味があればこちらもどうぞ。
- 作者: Brian Okken,株式会社クイープ,安井力
- 出版社/メーカー: 翔泳社
- 発売日: 2018/08/29
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
そして気がつけば、今回も予定の2時間はあっという間に過ぎてました。 出来上がったコードは殆ど機能が実装できてなかったのですが、参加者にとっては得られたものはたくさんあった気がします。
今回も終電の時間があるので最後までいられなかったのが残念でした。
まとめ
「ペアで・モブで、プログラミングを楽しむイベントです。お酒をたしなみながらテスト駆動開発にノンビリ取り組んでいきます。」というコンセプトの通り、今回も雰囲気もよく楽しくテスト駆動を体験することができました。テスト駆動開発というのはリズムがあって、それをいい感じで回せるようになるとすごく楽しいし心地良いというのが、体感できる良い勉強会だなぁと思いました。
2ヶ月に1回位のペースで開催されているようなので、興味がある方は テスト駆動飲み会 - Test Driven Drinking - のメンバーになって、イベントの通知メールをチェックするか、Facebook グループの テスト駆動飲み会 に参加申請を出して情報をチェックしてください!
自分はできればまた参加したいです。
参加した皆様、今回もありがとうございました!