hachiNote

勉強したことをメモします。

TDDBC札幌2.1に参加してきました

TDD Boot Camp札幌2.1に参加してきました! 今回で3回目の参加です。
前回まではJavaで参加していましたが、今回は最近やり始めたRubyで参加してみました。

講演内容の(主観的な)メモと、感じたことをまとめます。

講演内容メモ

@sue455さんの講演 appengineのお話
  • jubeat++を作ってます
  • spin upと戦う
    • ライブラリの依存を減らす
    • JSPは使わない
    • Ajaxを使うのが一番いいんじゃないか
  • Slim3
    • Kotori Web JUnit Runner。appengine上でJUnitを実行できる。本番環境をテストできるのはいい
    • Scenic3。PirkaEngine。なんと @shuji_w6e さん作
@giginetさんの講演 はてなインターンのお話
  • Perlはテストの文化
    • テストがないとCPANでの評価が下がって淘汰される
  • はてなはだいたいPerlで動いている
    • 仕様書はなくてもテストはたっぷりある
@shuji_w6eさんの講演 "ユースケースからテスト駆動開発へ"
  • "どれくらい事前設計すべきでしょうか。何を構築すべきかわかるまでです"
    • 正しい答えだがいまいちわからないよね
  • TDDは開発手法
    • 良いプログラムはできるが、良いシステムを開発できるわけではない
  • 良いシステム=顧客の要件を満たすステム
  • ユースケースは実装を始めるとき(TDDの)の出発点となる。これをTDDでDeveloper's Testを行って行く
  • 利点
    • 受け入れテストが設計時に明確
    • 適切な粒度の「何を構築すべきか?」
    • ユースケースの個数で進捗報告しやすい
@mrknさんの講演 Introduction to ATDD with Cucumber and RSpec
  • Acceptance Test Driven Development (受入テスト駆動開発
  • The Cucumber Book という本があるよ。日本語なら はじめる!Cucumberもおすすめ
  • Demonstration

演習メモ Ruby on Railsコース

Cucumber + RSpec を使ったTDDの大まかな手順
  • ユースケースをCucumberの features/*.feature ファイルに書く。1つのユースケースに1個のfeatureくらいのイメージ。featureの中にscenarioは複数書ける
  • rake cucumberでまず実行。すると、ステップ定義がないというエラーとともにサンプルコードが表示されるので、それをコピーしておく
  • features/step_definitions/*_steps.rb ファイルに失敗するステップ定義を書く。取りかかるのはエラーになった先頭の一つだけ。さっきコピペしたものを使うと楽。cabybaraさんの便利メソッド使うと「〜画面が表示されている」のような前提条件も楽々書ける
  • またrake cucumber実行。ステップ定義が正しく書けたなら、テストNGの状態になる(いわゆるRedの状態)
  • RSpecに移行する。失敗するテストを記述する
  • rspec specで実行。Redになったことを確認したらプロダクトコードを書く
  • rspec specで実行。Greenになったらリファクタリング
  • 全部Greenであることを確認したら、Cucumberに戻る
  • rake cucumberを実行し、次の行のエラー(またはNG)に取りかかる。以下繰り返し
  • 早い話、ユースケースをfeatureとscenarioに落としたら、あとはとにかくrake cucumberしてOKでなかったところを上から順番に書いて行けばいいだけ。手順はCucumberを実行したら教えてくれる
その他雑多なメモ
  • CucumberとRSpecは二重の円の外側と内側。Cucumberから先に入り、Cucumberのステップ定義(テスト)で足りない部分が生じたらRSpecに入る。
  • Cucumberのfeatureに書いたシナリオの一つに @wip をつけて rake cucumber:wip とすると、つけたシナリオだけが実行される。wipとは work in progress のことらしい
  • vimの操作も覚えなきゃいかん
  • capybaraがとにかくすごい。visit "/" とか click_link "アンカー名" とかで画面遷移を含めたテストが簡単に書ける。これはすごい!

全体を通じた感想

Cucumberを使った Acceptance TDD はすごかった

前回までのBoot Campとは違い、テストケースの書き方や手順を覚えるというよりも、プロジェクトが開始してからどのようにTDDによる開発につながっていくか、というところに重きを置いたBoot Campだったと感じました。

とくに私が入ったRubyチームはCucumberを利用したことによりそれが顕著でした。ユースケースから直接Cucumberに落とし込むことができるので、そこをTDDの起点にすることで、顧客の要求から乖離していってしまうことを防ぐことができます。

一番感動したのは、Cucumberを実行することによって、次に自分が何をすればいいのかCucumberが勝手に知らせてくれるということです。シナリオの中でまだテストや実装が終わっていないところは色がついて表示されます。

しかもそれは確実な要件であり、かつ程よく具体的に書かれた日本語の文章です。それを上から順番に片付けて行くだけです。「次になにするんだっけ」→ rake cucumber → テスト&実装 → 「次になにするんだっけ」→ rake cucumber → テスト&実装 ……
超シンプルです。 迷わない。導いてくれる感がすごいです。

でもCucumberを現場に導入できるだろうか?

でもCucumberを現場に導入できるか? と考えたら、難しいですね。

Cucumberのメリットは、顧客が一緒になってfeatureファイルを作成してくれるときにもっとも効果を発揮するものだと思います。一緒じゃなくても少なくとも継続的に確認してもらえる状況でなければいけませんが、顧客はこれをメリットと感じで取り組んでくれるでしょうか。

受入テストを顧客が実施している場合、「これをちゃんと書いておけば、受入テストが自動化できますよ」と言えばアピールにはなると思います。どちらにしても顧客のやる気にかかってきます。このへんは「どれだけ顧客を巻き込めるか」というアジャイル的な課題に近い気がします。

開発者にとっても、メリットだけあるとは言えないと思います。featureファイルのメンテナンスは何よりも優先してやっていかなければ意味がなくなってしまうし、負担が増えると感じる人もいることでしょう。

Boot Campの時間内では残念ながらこのあたりの答えは出せずに終わりましたので、もう少し勉強を続けて可能性を探りたいと思います。

最後に

毎回多大な時間をかけて準備してくださる @shuji_w6e さん、TAのみなさま、本当にありがとうございます!

そして、TDDBC参加3回目にしてやっとグリーンバンドを手に入れた……。感動です! これからも、acts as professional でいきます!

(vimをもうちょっと覚えないといけないな・・・)