「テスト駆動開発(TDD)オンライン勉強会」にオンライン参加してきました。
はじめに
久しぶりの更新です。
5/4(月)、テスト駆動開発(TDD)オンライン勉強会 #1 「ライブコーディングで体感するTDD基礎」にオンライン参加してきました。
参加動機とか
今僕が携わってるプロジェクトでは、コードを追加した際はそのユニットテスト用コードも添えてPRを出す、という原則で開発が進められてます。
が、具体的な進め方まで明示されたわけではないので、その辺は各人任せな感じです。
僕自身も、コードを作り切ってからテストを書くのがメインで、その段階になってテストのしづらい(=切り出すべき)箇所に気づく…といった苦い経験をしてきました。
また、先述した原則もレビューなどで徹底されているわけではなく、期日に間に合わないなどで省略したり、メインコードを修正してもテストコードを修正し忘れたりといったことが頻発してます。
誰かが気づいても修正コストの大きさから手を出しづらく修正されないまま、徐々にユニットテストがきちんと回されなくなり・・・結果、今となってはユニットテストが形骸化している感が否めません。
僕自身も不慣れだったので、進め方の雛形をある程度決めておくべきだったなぁと反省してます。 で、次はそうしたいという思いと、「そもそもどう実装を進めるとメリットを得やすいのか」というあたりが気になっていました。
そんな中、「ライブコーディングを含むTDDのオンライン勉強会が開催される」という情報を得たので、早速申し込みました。
新型コロナは早く収束して欲しいですが、その影響でオンライン開催の勉強会が増え、大都会岡山在住の僕でも日本全国あちこちの勉強会に参加できるようになったのは嬉しいところです。
いざ勉強会
勉強会はYouTube Liveにて、松岡さん(@little_hand_s)による講義形式で行われました。
初学者でもわかりやすいFizzBuzzコードの作成を題材に、レッド・グリーン・リファクタリングの3ステップを踏みながら徐々にメインコードとテストコードを作っていく様子を実演されていました。
入力値が1の場合にテストが転ぶところ(レッド)からスタートし、
- 入力値1の時のテストが通るよう、メインコードを書く (グリーン)
- 入力値2の時のテストを書く(まだ対応するメインコードがないので転ぶ) (レッド)
- 入力値2の時のテストが通るよう、メインコードを書く (グリーン)
- 入力値3の時のテストを書く(まだ対応するメインコードがないので転ぶ) (レッド) ・・・
といった感じ。
(あくまでもTDDの進め方を掴んでもらうための刻み方なので、1ステップのサイズはケースバイケースのようです)
コードを追加後すぐに失敗がわかるので、原因箇所の特定・修正がしやすいことが実装の様子からも分かりました。
なお、レッドとグリーンの繰り返しでは、テストを通すことを目的としているので、コードが多少汚いのは気にしなくて良いようです。ある程度出来たところで行うリファクタリングでその辺は綺麗にします。
2つ目のライブコーディング(peingへ届いた質問をGitHubのissueに登録する際の本文作成プログラム)では、レッド・グリーンでは文字列連結でゴリゴリに戻り値を作成していましたが、リファクタリングでそこをテンプレート構文に直して読みやすくしていました。
設計はリファクタリングで。レッド・グリーンでは、多少汚くてもいいからテストを通るコードを優先する。 #tdd_online
— コバえもん (@koba_emon) May 4, 2020
途中のYouTube視聴者コメントで出ていましたが、TDDで進めていると仕様の考慮漏れに気づけるタイミングが多くある、というメリットもあるようですね。
TDDしてると仕様の抜け漏れを見つけやすくなる。FizzBuzzなら、「-1の時に何を返すかの仕様が定まってない」など #tdd_online
— コバえもん (@koba_emon) May 4, 2020
また、スライドでは、「自動テスト」と「TDD」の違いについても言及されてました。
以下自分メモ
- 自動テスト
- TDD
- メインコードとテストコードがセットで増えていくので、十分なテストが書かれやすい
- テストを書こうとした段階で、テストを書きにくい設計であることに気づける
- 最初からクラスの呼び出しを意識できるので、自然と高凝集・低結合なクラスを作れる
- TDDは自動テストを含むが、その逆は必須ではない(自動テストを進める手法自体はTDDでなくても良い)
- Clean(綺麗なコード)とWorks(きちんと動作するコード)は自動テストだけでも頑張ればできるが、TDDはその実現を加速させる
(こうしてみると、今携わってるプロジェクトは「自称:自動テスト」なんだなぁと。本当に反省です・・・)
参加してみて
TDDはワード程度にしか知らなかったので、進め方などの思想を知ることができたのは大きいです。ライブコーディングがあるのも理解の助けになりますね。
まずは自分担当分の開発で取り入れて行きたいと思います。手応えあれば、チーム全体としても取り入れて行きたいところです。
また、オンライン勉強会初参加でしたが、何かしながらでも話は聞けるのは良いですね。
ワイヤレスヘッドホンで聴講していたので、そのままお手洗いに行っても、軽く家事してても聞いてられます。
もし聞き逃しても、シークバーを戻せば聞きなおせます。
YouTube Liveだと、他人のコメントが参考になる、理解の助けになるというあたりもメリットです。
(TDDで有名?なサバンナの人こと和田さん(@t_wada)も参加されており、コメントが非常に参考になりました)
岡山界隈だとハッシュタグつきでTwitterにツイートする文化が強い印象ですが、それに近いものを感じました。
逆に、リアル勉強会のような「会場の空気」が形成されないので、自分が登壇者だとしたらその辺り少し不安になるかなと感じました。ボケがスベった時のダメージは抑えられるかも
今日の話を見越して実は買ってあったのじゃ
— コバえもん (@koba_emon) May 4, 2020
読むで#tdd_online pic.twitter.com/vKCIQ31b0X