TDDBC Tokyo 2018-09 に参加してきました。
とても知が深まり、とても楽しめて刺激的な時間を過ごすことができました。
当初は TDD は開発手法の一種だというくらいの認識だったのですが、人間を考えた深いものだったと気づきました。
事前に「テスト駆動開発」を読んでいったのですが、やはり実践で学べるものは桁違いでした。
- 作者: Kent Beck,和田卓人
- 出版社/メーカー: オーム社
- 発売日: 2017/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
こんなことやったよ
- 基調講演
- ペアプロデモ
- ペアプロ(1回目)
- コードレビュー
- ペアプロ(2回目)
- コードレビュー&休憩
- 質問コーナー&クロージング
朝から夜までTDDに浸れました。長いなんて思う暇もなく一瞬で時が過ぎていきます。
#tddbc で当日の興奮が見れます。
3行でまとめ
長い記事なってしまったので先に3行でまとめます。
- TDD = 開発手法 ≠ テスト技法
- TDDはテストを書くことが目的ではない
- TDDは人間の問題にフォーカスしている
基調講演
@yattom さんによる基調講演です。
聴けば聴くほどTDDはただの開発手法ではないということに気付かせてくれます。
TDDが人間にフォーカスしてきていることをじわりと感じてきた。 #tddbc
— daisuke sato/さとうだいすけ (@dskst9) 2018年9月29日
人間の問題
変更容易性の問題
テストの自動化と回帰テスト
不安に立ち向かう
命綱を編む
TDDについてのお話
テスト駆動開発はふつうの開発です。
まずは動くようにする、そしてきれいにする。というアプローチをとっているだけ。
テストを書いてプロダクトコードを正しいか確認をすると考えた時に、テストが正しいことはどうやって確認するのでしょうか?
それは、シンプルなプロダクトコードで確認する、プロダクトコードを使ってテストコードをテストすることです。
Red, Green, Refactoring を1サイクルとして、まずはテストに失敗し、テストを通るようにして、 Refactoring をします。テストが間違っていないかすばやく実行して次のステップに向かいます。
TDDは小さなステップで進めていきます。 TODOリストを作り、ユーザー視点から設計を考え、仮実装、三角測量、そしてリファクタリングします。
いいテストとは
- 高速である
- 独立している
- 再現性がある
- 自己検証可能
- 適時性がある
TDDと人間
TDDで動作するきれいなコードを目指す、それはチームにとってお互いが信頼できるコードを作ることができます。
以下のような問題に立ち向かい、チームの健康、ソフトウェアの健康を守ってくれます。
- 人間の問題
- 変更容易性の問題
- テストの自動化と回帰テスト
- 不安に立ち向かう
- 命綱を編む
Tips
テストの増やし方
テストを増やす方法は2通りあります。
- 1つのテストケースにテスト増やす
- テストケースそのものを増やす
1つのテストケースにテストを増やすことよりも、テストケースそのものを増やす方が良いとされています。なぜなら、1つ目の assert でエラーになると、2つ目の assert がどうなったのかわかりません。
挙動はフレームワークによっても異なりますが、基本的にはテストケースを増やのをセオリーと考えましょう。
フレーキーテストはやっかい
外部のサービスに依存していたり、並列で安定していないなど再現性が低いテストはやっかいです。 そのテストを維持するためにコストが非常にかかってしまいます。
TDDはテスト技法ではないので、本当に必要なテストを、開発を進めるテスト書いていきましょう。
ややこしいロジック
ややこしいロジックを書くときは、こんなやり方もありなようです。
- まずはテストロジック内にメソッドを作って仮実装
- 固まってきたらプロダクトコードに落とし込む
ペアプロデモ 素因数分解
以下、実演とスライドから気になったワードをピックアップしました。
- きれいを保つのがリファクタリング
- 設計も見直し、プロダクトコードも見直す
- 常にやり続ける
- 「動くコード」を保証するテストが前提
- 1つずつ一歩ずつ、段を小さく
- 複数を相手にしない。ひとりずつ対処する。
- すばやくまわす
- 自分が最初のユーザ
- 不安をテストに
- 祈るではダメ
- 命綱を編む
ペアプロ
【お題】
自動販売機のロジックを作成します。
プログラミングのお題: 自動販売機 (設計進化重視バージョン) · GitHub
ボタンを押すとコーラが出る、お金を払う、烏龍茶追加、、、、のようにお題が増えるにつれて複雑になっていきます。 これを TDD + ペアプロ で作っていきました。
以下、ペアプロ中の気づいたことです。
- 三角測量ですでに同じようなテストがあるときはどうするのか
- 正解はないが自明な場合は書かないというのもあり
- テストを進めることで重複が明確にわかることがあり、そのタイミングリファクタリングをやるのがベスト
- ペアプロで頭に浮かんだものを書き留めるところがあるといい
- テストコードもリファクタリングするから、その過程でテストコードを削除することも多々あった
- TDDのサイクルが回った瞬間があり、その瞬間はものすごく気持ちいくてノリノリになる
なんだかんだ、一瞬で時間は経ちました。
アウトプット
タスク一覧をTrelloで管理していたので公開しておきます。
見返すと雑なタスクリストですが、タスクリストで頭を整理しながら実装するのはなかなかいいですね。
実際のソースは下記にアップしました。ペアプロでの時間終了で中断されているので、リファクタリングが中途半端になっていますが、コミットログからコードがどんどん変わっていく様が見れるかと思います。
(Gitのログイン忘れてて daisuke-sato という名前でコミットされちゃってますが)
書いているときは、先のことを考えて実装しようと思ってしまいますが、その気持をグーっと抑えて最小限のコードで書くようにしていました。
まずは動くようにする、そしてきれいにするですね。(まだきれいになってないけど、このまま冷凍保存しておきます)
ペアになっていただいた @sister__clown さん、ありがとうございました!
質問コーナー
TDDで書いているとどうしてもDDDが脳裏に浮かんでValueObjectとか、Modelを作りたくなってきてしまう。TDD本のよういにヌルっとDDDが反映されていくのむずいな。 #tddbc
— daisuke sato/さとうだいすけ (@dskst9) 2018年9月29日
と思っていたことを、みなさんはどうしているか聞いてみました。
TDDをやる上でDDDはどのタイミングでどうやるべきなのか #tddbc
— daisuke sato/さとうだいすけ (@dskst9) 2018年9月29日
- 最初に軽くモデル設計、クラス設計をやったりする
- でも作った上で結構違うこともあるので、作り変えることもよくある
- Valueオブジェクトとかはナチュラルに作ったりしたりもする
- TDDを進めてコードの声が聞こえたら入れていく
「コードの声を聞く」というのがすごくいい #tddbc
— daisuke sato/さとうだいすけ (@dskst9) 2018年9月29日
なるほどなるほど。と勉強になります。コードの声いいですね。
Q: 「TDD を進める上で、いつドメイン分析をやるべきか。Kent Beck みたいにぬるっとできなかった」
— Kuniwak@A man using Vanilla DI/Mock (@orga_chem) September 29, 2018
A: 「ネタバラシしますが、Kent Beck の例は 3 回目ぐらいにやり直しているやつなので、一度めからはできないです」 #tddbc
Kent Beck が3回目だというのはびっくりしたw
まとめ
以下の一言に付きます!素晴らしい勉強会でした。
#tddbc は単にTDDを学べるだけではなく、ペアプロからチーム作りや、文化を創るということまで学ぶことができるんですね
— daisuke sato/さとうだいすけ (@dskst9) 2018年9月29日
集合写真も撮りました!
ありがとうございました! #tddbc pic.twitter.com/yXGi6CDDbJ
— せとあず 10/8技術書典5う02 (@setoazusa) September 29, 2018
懇親会にでれなかったけど、懇親会も盛り上がっていたようですね!
jsで素因数分解してたらいつのまにかテスティングフレームワークを作り始めている #tddbc pic.twitter.com/drg7BWng6u
— YASUI Tsutomu (@yattom) September 29, 2018
#tddbc 懇親会でモブプロで作った素因数分解のTDDをするために作ったテスティングフレームワーク on Cyber-Dojo! https://t.co/bIhGUKPLix
— YASUI Tsutomu (@yattom) September 29, 2018