19-B-6 実践Cucumber 〜ユーザの視点でシステムの振る舞いをテストしよう/諸橋恭介

自分はCucumberを知っていたのでいいのですが、知らない人向けには簡単なデモとかあればもっと伝わったのではないかと思いました。時間が短いので難しいのかもしれませんが。

以下適当なメモ。嘘かいてあるかもしれません。

  • Ruby x Agileへの取り組みと新しい課題
  • Cucumberのお客様と開発者、それぞれへのうれしさ
  • Cucumberから見える未来への期待

まとめ

  • お客様と開発者を結ぶCucumber
  • 自然言語xRubyをキメると気持ちいい
  • Cucumberは

Ruby x Agile

Ruby x Agile

  • リードタイムが短くなった
  • "生産性"があがった
  • "動作するソフトウェア"でコミュニケートする姿勢が身についた

ごく自然に毎週お客さんにデモできる

現実には難しさもある

Ruby x Fragile?

  • 変更は積極的になった。でも本当にデグレがないか不安
  • TDDで楽しく開発。でもテストが増えすぎて辛い。
  • すべてはデモできない。抜けていないか気になる。

変化を抱擁し続けるために

  • RubyAgileから、”変化を法要”する意志を受け取った。
  • 意志を保ち、不安に立ち向かいたい。
  • そのカギのひとつがCucumber

Cucumberとはなにか

  • プレインテキストでかかれたテキストのふるまいが検証できる
  • 自然言語で仕様を記述し実行するためのテスティングフレームワーク
  • End to end のテストが書ける
  • View に対するユーザーの入力を契機にテストをはじめてユーザーにどういうレスポンスが返ったかをテストできる

WebのテストのためのDSL

  • 最初からバンドルされている
    • リンクをクリックする
    • フォームに入力する
    • 表示内容を確認する

("画面を目視"…ってあったのが気になりました。なんだろう…自動ではできないこと?)

抽象度をあげて定義することもできる

  • 「トップページにいってユーザー名とパスワードをいれてクリックする」
Given /.../ do
  Given ...
  Given ...
end

表が使える

  • パラメータのみを変更して繰りかえして実行したい

用語集

  • 厳密に定義しないといけない場合
  • ”昨日”を出すのは難しい。動的なので。
  • "昨日"を Date.yesterday に置き換える
  • 「"登録日"として"3日前の日付"を入力する」
Transform /(\d+)日前(?:の日付)/ do |n|
  Integer(n).days.ago
end

3. お客様への価値

  • お客様=ミッションがプログラミングでない人
  • エンドユーザーだったりプロダクトオーナーだったり

お客様が読める

  • 理解できる
  • 書くのは開発者 お客様もかけるかもしれないけど…
  • 彼らの望むシステムに近づくための会話ができる

動かなくても価値はある

  • お客様に読んでもらえる詳細な仕様があることに価値がある
  • 進捗報告もしやすい

コミュニケーションのための言語

  • 開発者とお客様が会話できる言語
  • 実行できなくてもいいけど、実行できればより良い

メンテナンスされつづける仕様書

  • 仕様書が古くなった…というのがおこりづらい
  • 開発者としてはエラーになっていたら直したくなる
  • 仕様書を直すか、実装を直すか
  • 開発者の内的な動機として Cucumber で書いてある仕様書を直したくなる
  • 開発者にとってもお客様にとってもうれしい

4. 開発者への価値

仕様書に書いてあることをテストとして実行できる

Ruby

  • Cucumberはシンプル
  • 正規表現でマッチするだけ
  • パラメータを取ってきた後は Ruby でなんとでもできる
  • step間のデータの受け渡しはインスタンス変数で。

資産価値の高いテスト

  • 変化を支えられないテスト
    • ちょっと直したらテストが全部落ちた
    • テストに時間がかかる
    • 変更していないのに落ちるテスト
  • こんなテストは消したい
  • でも不安
  • Cucumberが助けてくれる
  • 一番外側からアプリケーションの振る舞いを確認する
  • 一つのテストあたりのカバレッジが高くできる
  • Cucumber からテストできている部分の Unit Test は捨てられる
  • TDD で必要なテストと、メンテに必要なテストは違う
  • Cucumber で外側からカバーすることで不要なテストを安心して捨てられる
  • アプリケーションの中身は感知しない
  • リファクタリングしたらテストが落ちまくったという事態もふせげる
  • RSpecプログラマー用
  • ユーザー視点のテストは Cucumber

お客間が読み書きできる語彙をつくるフレームワーク

  • 新しい機能を素早く正確に記述できる
  • 限定された自然言語
  • DHH「制約が自由をもたらす」
  • 適切に制限することで、思考をシンプルかつ明確にできる
  • お客様と開発者が Cucumber で作った語彙で話していくと、新しい機能をいれるときもその語彙を使って話すようになる
  • RESTの思想を取り入れてRailsはより洗練された

豊かと言ってもすべては語れない

  • 新しく語彙を生み出す必要がある
  • お客様と合意できる語彙
  • お客様と開発者のコミュニケーションが加速
  • Cucumberの一つの効果
  • 共通言語を持てる
  • Rubyで実行可能なテストになっている

Cucumber はお客様と会話する仕組みを作る
作ろうという動機付けになるフレームワーク

まとめ

  • お客様と話したことが実行可能なテストになる
  • 開発者として自分が成長する
  • お客さんによろこんでもらえる
  • というサイクルが早くなればいい