Kubo100903
Transcript of Kubo100903
株式会社ライブレボリューション株式会社ライブレボリューション
技術勉強会資料技術勉強会資料 久保 清久保 清隆隆
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
テスト駆動開発と RSpec
スはスペックのス
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
2
目次
Rspec とは
なぜ Rspec なのか メリットと Test::Unit との違い
テスト駆動開発
Rspec の使い方
Rspec と Cucumber
テストの高速化 Cucumber の並列処理ライブラリ
まとめ
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
3
Rspec とは
arr = []arr.empty?# ⇒ 振る舞いとして、 true を返す。
振る舞い
テスティングフレームワーク プログラムの振る舞い (behaviour) を記述するための
ドメイン特化言語 (DomainSpecificLanguage:DSL) を提供
✿テストが設計であることを強調
✿Ruby を使い、プログラムの振舞の本質に集中できる書き方
特徴
DSL特定の領域 ( ドメイン ) を記述するために設計された言語。
「開発対象のプログラムの振舞を記述する」という領域。
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
4
Rspec と Test::Unit の違い
Test::Unitクラスやメソッ ドを定義する
require 'test/unit' class ArrayTest < Test::Unit::TestCase def setup @empty_array = [] end
def test_empty? assert(@empty_array.empty?) end
def test_size assert_equal(0, @empty_array.size) end
def teardown @empty_array = nil end end
describe Array, "when empty" do before do @empty_array = [] end
it "should be empty" do @empty_array.should be_empty end it "should size 0" do @empty_array.size.should == 0 end
after do @empty_array = nil endend
RSpecブロック付きメソッド呼び出しなど、 Ruby スクリプトになっている
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
5
なぜ Rspec なのか Test::Unit との違い
Rspec は、統合テスティング環境であることを目指しているテスト駆動開発の考え、つまりテストは設計であるという考え方を全面に押し出している。
Test::Unit RSpec
「テストケース」 実行可能なサンプル (example)
「テストクラス」テストケースのまとまり 振舞 (behaviour)
アサート (assert)コードの検証 エクスペクテーション (expectation)
テストメソッド
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
6
まとめ
RSpec は以下のことを目指している
✿プログラマにテストコードが設計であることを明確に意識させること
✿プログラマがテストコードをスムーズに記述し実行できるようになること
✿振舞定義用の DSL を提供し、様々なテスト関連ライブラリや周辺ツールとの 連携を積極的に行い、「統合テスティング環境」となること
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
7
テスト駆動開発 (TDD) とは✿設計技法であり、開発の進め方
✿コーディングは設計であり、テスティングとデバッギングも設計の一部であり、私たちが一般的にソフトウェア設計と呼んでいるものもやはり設計の一部である
✿ソフトウェア設計は、コーディングが完了し、かつテストされるまでは完璧にならない
✿テスティングは、設計の検証と洗練を行うプロセスにおける基礎となる
✿TDD とは BDD であり、 BDD とは TDD である
TDD のプログラミングの進め方が「テストというよりは設計である」ということを強調する考え方を、振舞駆動開発 (Behaviour Driven Development:BDD)と呼ぶ
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
8
テスト駆動開発 (TDD) テストの分類
✿Developer Testing :
開発者が行う、開発促進のためのテストプログラマの、プログラマによる、プログラマのための、プログラムとして書く、プログラミングを進めていくための、テスト
✿Customer Testing :
お客様と機能の確認の為に用いる、進捗管理のためのテスト
✿QA Testing :
品質保証のためのテスト
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
9
テスト駆動開発 (TDD)
1つのゴール =
動くか不安
何かがおかしい
これでいいよね
めんどくさいって思ったときは、
テストを構造化するか、書くのをやめる。
1つのテーマ =
動作するきれいなコードを書くこと
感情をテストにする:
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
10
テスト駆動開発 (TDD)
① 設計の技法:
設計とはソースコードを書くこと。テストもデバッグも設計。
設計が終わるのは、コーディングが完了しかつテストが通るまで。
② 開発の進め方:
テストが開発を駆動する。テストが開発を引っ張る。
クは駆動のク。駆動っていうのが大切。
この2つを押さえておくだけで大丈夫
① テストに失敗したときだけコードを書く② 重複を取り除く
2つの主張
2つのルール:
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
11
テスト駆動開発
3つのモード + 1失敗→通過→きれいにRed : テストに失敗している状態Green : コードが動作している状態Refactoring : コードの意味を変えずに綺麗に。動いた状態を維持して中身を綺麗に
Think
作るための作戦などをまず考える。
そしてテストを書き、通るようにコードを書き、リファクタリングで綺麗にしてまた考える。
think → red → green → refactoring の繰り返し。
今、どのモードなのかを意識するのが大切
3つのモードでは明示されていない4つ目のモードがある。
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
12
テスト駆動開発
今、どのモードなのか意識
どんなルートをたどるか
順番に行い、理想を目指す
動く動かない
汚い
綺麗
Think
Red Green
Refactoring
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
13
テスト駆動開発
3つの技法 サイクルをまわす
✿Fake it :
いんちき。テストをだまして Green に持っていく
ボーリングで全部ガタ―で0点にする場合、メソッドが0を返すようにする
✿Triangulate :
二方向から挟み撃ち。2つのテストを書いて実装を決める
全部ガタ―と全部1ピンの両方が通るようにする
✿Obvious implementation :
ふつうに実装
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
14
テスト駆動開発 しっかり身につけるためには
コード=カタ
カタとは、空手などの型
単純な定型を反復する。素振りみたいなもの
体で覚えるまでやる
簡単なものができないと、難しいものはできない
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
15
Rspec の使い方
インストール$ sudo gem install rspec
describe Class, " コンテキスト ( どういう状態の時に )" do before(:each) do # コンテキストのお膳立て end
it "期待する振る舞いの名前 " do # ここに期待する振る舞いを書く endend
コード
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
18
Rspec と Cucumber
gem install cucumber webrat
インストール
顧客に対して「このアプリケーションは要求仕様を満たしています」と言うことは RSpec だけでは無理だったCucumber のテストコードは比較的自然語彙に近い形で記述できる
顧客の要望をほぼそのままテストコードに落とすことができる
基本的にはユニットテストなので,ある Model単体のテスト,ある Controller単体のテストとなるのが普通
内部仕様を RSpec で,外部仕様を Cucumber でテストする
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
19
テストの高速化
test/spec/cucumber を並列実行できるライブラリ parallel_tests
Ruby / Rails のテストが約 3倍速になって超快適に!!
( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.
20
まとめ✿TDD は設計技法で開発の進め方
✿一度にひとつずつ
✿感情をテストにする 不安だ 何かがおかしい これでいい 退屈だ⇒テストの構造化・書くのをやめる
✿リズムとフィードバック
テスト→コーディング→リファクタリング
早くできるようになるまで簡単なものを繰り返し行う。