Kubo100903

21
株株株株株株株株株株株株株株株 株株株株株株株株株株株株株株株 技技技技技技技 技技技技技技技 技技 技技 技技 技技 C Copyright Live Revolution Co.,Ltd. All rights reserved. 株株株株株株株株 RSpec 技技技技技技技技

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.

16

Rspec の使い方テストを実行

( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.

17

Rspec の使い方

( 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 は設計技法で開発の進め方

✿一度にひとつずつ

✿感情をテストにする 不安だ 何かがおかしい これでいい 退屈だ⇒テストの構造化・書くのをやめる

✿リズムとフィードバック

 テスト→コーディング→リファクタリング

早くできるようになるまで簡単なものを繰り返し行う。

( C ) Copyright Live Revolution Co.,Ltd. All rights reserved.

21

結論

Rspec は素晴らしい