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

Kubo100903

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