SlideShare una empresa de Scribd logo
1 de 44
Cucumber
Cucumberの概要
•   Cucumberの構成

    •   フィーチャ

    •   cucumberコマンド

    •   ステップ定義

•   実行の順序

    •   cucumberコマンドの実行
        →各シナリオのステップを解析し、ステップ定義にマッピング
        →対応するステップ定義が見つかったら、ステップ定義が処理を行う
フィーチャを構成する要素


• タイトル


• ナラティブ


• シナリオ
フィーチャを構成する要素


• タイトル


• ナラティブ


• シナリオ
Feature: 在庫管理者が在庫品目を追加する

Feature: 暗号解読者が推測を送信する

Feature: 新規に会員登録する
フィーチャを構成する要素


• タイトル


• ナラティブ


• シナリオ
•   ナラティブ

    •   物語

    •   Gherkinキーワードで始まる行が含まれてはならない

•   Connextraフォーマットで記述する(従わないといけない訳ではない)

    •   英語
        As a <role>
        I want <feature>
        So that <business value>

    •   日本語
        <だれだれ>が
        <なになに>したい
        なぜなら<こういうことをしたい>からだ
フィーチャを構成する要素


• タイトル


• ナラティブ


• シナリオ
Gherkinキーワード

• Feature              • Given

• Background           • When

• Scenario             • Then

• Scenario   Outline   • And

• Scenarios            • But

• Examples             •|   |、” ”、#
$ cucumber --i18n ja
    | feature      | "フィーチャ", "機能"                                       |
   | background        | "背景"                                |
   | scenario        | "シナリオ"                                    |
   | scenario_outline | "シナリオアウトライン", "シナリオテンプレート", "テンプレ", "シナリオテンプレ" |
   | examples         | "例", "サンプル"                                  |
   | given          | "* ", "前提"                 |
   | when            | "* ", "もし"                    |
   | then           | "* ", "ならば"                        |
   | and            | "* ", "かつ"                 |
   | but            | "* ", "しかし", "但し", "ただし"                               |
   | given (code)     | "前提"                             |
   | when (code)       | "もし"                                |
   | then (code)      | "ならば"                                    |
   | and (code)       | "かつ"                             |
   | but (code)       | "しかし", "但し", "ただし"                                       |
シナリオの書き方

Feature: Traveler books room
 ln order to reduce staff
 As a hotel owner
 l want travelers to book rooms on the web

 Scenario: Successful booking

 Scenario: Hotel is full

 Scenario: visitor forgets to enter email
シナリオの書き方
# language:en
Feature: Traveler books room
 ln order to reduce staff
 As a hotel owner
 l want travelers to book rooms on the web

 Scenario: Successful booking
  Given a hotel with “5” rooms and “0” bookings
$ cucumber
# language:en
Feature: Traveler books room
 ln order to reduce staff
 As a hotel owner
 l want travelers to book rooms on the web

 Scenario: Successful booking                      # features/book_room.feature:7
  Given a hotel with “5” rooms and “0” bookings # features/book_room.feature:8
1 scenario (1 undifined)
1 step (1 undefined)
0m0.001s


You can implement step definitions for undefined steps with these snippets:


Given /^a hotel with “([^”])” rooms and “([^”])” bookings$/ do |arg1, arg2|
 pending # express the regexp above with the code you wish you had
end
$ cucumber features/book_room.feature:7
   指定した行のシナリオのみ実行
Given、When、Then
•   Given

    •   シナリオにおいて事実として受け入れるもの

    •   事前条件ではない(満たさなくても先に進める)

    •   例:

        •   預金口座の残高が20ドルであるとすれば

        •   今日が休日であるとすれば
Given、When、Then
•   When

    •   シナリオにおけるイベントを示す

    •   どのシナリオでもイベントは1つであるのが理想

    •   例:

        •   15ドルを引き出した

        •   部屋の掃除をした
Given、When、Then

• Then

 • 期待される結果を示す


 • 例:


   • 残高は5ドルである
シナリオの記述の仕方
•   宣言型

    •   シナリオごとにカスタマイズされる傾向

    •   開発者がビジネス開発やテストする場合に向く

•   命令型

    •   少ないステップ定義でより多くのシナリオが書ける

    •   テキストシナリオを扱えるビジネスアナリストがいる場合に向く

•   同じプロジェクト内で命令形のシナリオと宣言型のシナリオの
    バランスを保つのが重要
    →最初のテストは命令形、確認済の事と同じような事をする場合は宣言型 等
命令型のシナリオ
Scenario: transfer money (imperative)
 Given I have $100 in Checking
 And I have $20 in savings
 When I go to the transfer form
 And I select "Checking" from "Source Account"
 And I select "Savings" from "Target Account"
 And I fill in "Amount" with "15"
 And I press "Execute Transfer"
 Then I should see that l have $85 in checking
 And I should see that l have $35 in savings
宣言型のシナリオ

Scenario: transfer money (declarative)
 Given I have $100 in checking
 And I have $20 in savings
 When I transfer $15 from checking to savings
 Then I should have $85 in checking
 And I should have $35 in savings
フィーチャの構成
features         $ cucumber features
  insurance      $ cucumber features/insurance
    medical      $ cucumber features/insurance/medical
    dental       $ cucumber features/insurance/ dental
    life         $ cucumber features/insurance/ life
    disability   $ cucumber features/insurance/ disability
  pto            $ cucumber features/pto
    accrual      $ cucumber features/pto/accrual
    usage        $ cucumber features/pto/usage
タグ

• タグのつけ方

@approved @iteration_12
Feature: patient requests appointment

 @wip
 Scenario: patient selects available time

• 実行方法

$ cucumber --tags @wip
複雑なタグ式
$ cucumber --tags @foo,@bar
→@foo || @var

$ cucumber --tags @foo --tags @bar
→@foo && @var

$ cucumber --tags ~@dev
→!@dev

$ cucumber --tags @foo,~@bar --tags @baz
→(@foo || !@var) && @baz
タグ式のその他の用途

•   特定の環境のみで実行されるシナリオ

•   ワークフローとビジネスルールなど、さまざまな種類の
    テストを表すシナリオを示す

•   高速に実行されるシナリオだけを実行する

•   フィーチャセットまたはテーマに関連するシナリオを実
    行する
Cucumberの詳細
ステップ定義


• 定義されていないStepを含むfeatureを実行すると、

cucumberはStep Definifionのひな形を出力してくれる。

• 正規表現を通してステップに引数を渡す場合は、

すべてStringとして渡される。
Worldオブジェクト

• 全てのシナリオはWorldオブジェクトのコンテキストで

実行される

• WorldオブジェクトはデフォルトではObjectクラスのイ

ンスタンス
(Object以外のインスタンスにする方法は後述)
ヘルパーメソッド
module MyHelper
 def some_helper
  ・・・
 end
end

World(MyHelper)
WorldをObject以外にする
          class MyWorld
            def some_helper
             ・・・
           end
          end

          World do
           MyWorld.new
          end

• cucumber-railsは、WorldをActionController::IntegrationTest

 のインスタンスとして設定している
ステップ定義から
   ステップ定義を呼び出す
When I select checking as the source account
And I select savings as the target account
And I set $20.00 as the amount
And I click transfer



When I transfer $20.00 from checking to savings
When /I transfer (.*) from (.*) to (,*)/ do |amount, source, target|
 When "I select #{source} as the source account"
 When "I select #{target} as the target account"
 When "I set #{amount} as the amount"
 When "I click transfer"
end

When /I transfer (.*) from (.*) to (.*)/ do |amount, source, target|
 steps %Q{
   When I select #{source} as the source account
   And I select #{target} as the target account
   And I set #{amount} as the amount
   And I click transfer
 }
end
• ステップ定義からステップ定義を呼び出すとDRYには

なるが、間接化が1段増える

• 階層が増えると、失敗の原因を特定しづらくなる


• ステップ定義ごとに異なる抽象化


• feature→ステップ


• feature→ステップ→ステップ→ステップ


• 結局は読みやすさと保守性のバランスを見てどうする

か決めるしかない
フック
•   featuresディレクトリの下にあるRubyファイルで設定できる
    features/support/hooks.rbに書くのがおすすめ?

•   フックはいくつあってもよい

•   Cucumberのフックは3種類

    •   Before

        •   すべてのシナリオの前に実行される

    •   After

        •   すべてのシナリオの後に実行される

    •   AfterStep

        •   すべてのステップの後に実行される
タグ付きフック

Before("@foo") do
 puts "This will run before each scenario tagged with @foo"
end



Before("@foo,~@bar", "@zap") do
 puts "This will run before each scenario tagged with @foo or not @bar AND @zap"
end
バックグラウンド

•   フックはRubyファイルに書くため、技術者以外の人にはイミフ

•   featureファイルにBeforeフックのようなものを明示したい場合
    はバックグラウンドを用いる

•   バックグラウンドは与えられたfeature内の全てのシナリオの前
    に実行される

•   Beforeフックはバックグラウンドより前に実行される
Feature: Invite friends
 Background: Logged in
  Given I am logged in as "Aslak"
  And the following people exist:
    | name | friend? |
    | David | yes |
    | Vidkun | no      |

 Scenario: Invite someone who is alreadv a friend

 Scenario: Invite someone who is not a friend

 Scenario: Invite someone who doesn't have an account
マルチラインテキスト
Scenario: pending implementation
 Given a file named "example_without_block_spec.rb" with:
  """
  describe "an example" do
    it "is a pending example" end
  """
 When I run "rspec example_without_block_spec.rb"
 Then the exit code should be 0
 And the output should contain "1 example, 0 failures, 1 pending"
 And the output should contain "Not Yet Implemented"
 And the output should contain "example_without_block_spec.rb:2"
複数行のテキストは正規表現でキャプチャする必要はない。
正規表現に含まれなかった文字列はブロックの最後の引数に入る。


Given /a file named "([^"]*)" with:/ do |filename, text|
 # ...
end

Then /the stdout should include/ do |text|
 # ...
end
ステップ内のテーブル

• cucumberは行の最初に   "|" を見つけたときにパースし
 て、Cucumber::Ast::Tableオブジェクトにする

• ステップ内でCucumber::Ast::Tableオブジェクトを用いる

 場合は、Cucumber::Ast::Table#hashesを使う

• CucumberはCucumber::Ast::Tableをステップ定義中の最後

 のブロック引数として渡す
シナリオアウトライン

• Scenariosキーワードで、Scenario   Outlineに流し込むデー
 タをテーブルで定義できる

• ScenariosのエイリアスとしてExamplesキーワードもある


• 複数行のテキストや、テーブルの値にもscenario          outline
 は使える
Scenario Outline:
 submit guess Given the secret code is "<code>"
 When I guess "<guess>"
 Then the mark should be "<mark>"
Scenarios: all numbers correct
 | code | guess | mark |
 | 1234 | 1234 | ++++ |
 | 1234 | 1243 | ++-- |
 | 1234 | 1423 | +--- |
 | 1234 | 4321 | ---- |
Scenario Outline:
  Given a discount of <discount> When I order the
following book:
    | title	

| price	

 |
    | Healthy eating for programmers | <price> |
 Then the statement should read:
    """
    Statement for David
    Total due:	

 <total>
    """
Scenarios:
  | discount | price | total |
  | 10%	

 | $29.99 | $26.99 |
  | 15%	

 | $29.99 | $25.49 |
プロファイル


• cucumberのオプションをあらかじめ書いておくための

ファイル

• cucumber.yml

• config/cucumber.yml
wip: --tags @wip features


$ cucumber -p wip

$ cucumber --tags @wip features

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

DatadogでAWS監視やってみた
DatadogでAWS監視やってみたDatadogでAWS監視やってみた
DatadogでAWS監視やってみた
 
AWS Black Belt Techシリーズ AWS IAM
AWS Black Belt Techシリーズ  AWS IAMAWS Black Belt Techシリーズ  AWS IAM
AWS Black Belt Techシリーズ AWS IAM
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjpAWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
The Twelve-Factor Appで考えるAWSのサービス開発
The Twelve-Factor Appで考えるAWSのサービス開発The Twelve-Factor Appで考えるAWSのサービス開発
The Twelve-Factor Appで考えるAWSのサービス開発
 
AWS Black Belt Techシリーズ Amazon Kinesis
AWS Black Belt Techシリーズ  Amazon KinesisAWS Black Belt Techシリーズ  Amazon Kinesis
AWS Black Belt Techシリーズ Amazon Kinesis
 
AWSでDockerを扱うためのベストプラクティス
AWSでDockerを扱うためのベストプラクティスAWSでDockerを扱うためのベストプラクティス
AWSでDockerを扱うためのベストプラクティス
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
20210126 AWS Black Belt Online Seminar AWS CodeDeploy
20210126 AWS Black Belt Online Seminar AWS CodeDeploy20210126 AWS Black Belt Online Seminar AWS CodeDeploy
20210126 AWS Black Belt Online Seminar AWS CodeDeploy
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Rootlessコンテナ
RootlessコンテナRootlessコンテナ
Rootlessコンテナ
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
 
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps 『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
 
AWS Black Belt Techシリーズ Amazon VPC
AWS Black Belt Techシリーズ Amazon VPCAWS Black Belt Techシリーズ Amazon VPC
AWS Black Belt Techシリーズ Amazon VPC
 
20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito
 
CircleCI vs. CodePipeline
CircleCI vs. CodePipelineCircleCI vs. CodePipeline
CircleCI vs. CodePipeline
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 

Similar a BDD勉強会 第6回

WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
Hishikawa Takuro
 
第3回BDD勉強会
第3回BDD勉強会第3回BDD勉強会
第3回BDD勉強会
zakihaya
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
pocketberserker
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
 
シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)
icchy
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
 

Similar a BDD勉強会 第6回 (20)

Haikara
HaikaraHaikara
Haikara
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
第3回BDD勉強会
第3回BDD勉強会第3回BDD勉強会
第3回BDD勉強会
 
Capistrano in practice - WebCareer
Capistrano in practice - WebCareerCapistrano in practice - WebCareer
Capistrano in practice - WebCareer
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)
 
130207 kyotorb
130207 kyotorb130207 kyotorb
130207 kyotorb
 
serverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Pythonserverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Python
 
㉗HTML5+jQueryでお絵かき
㉗HTML5+jQueryでお絵かき㉗HTML5+jQueryでお絵かき
㉗HTML5+jQueryでお絵かき
 
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript ファーストステップ ~ Any browser. Any host. Any OS. Open Source. ~
 
ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話ZabbixのAPIを使って運用を楽しくする話
ZabbixのAPIを使って運用を楽しくする話
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 

BDD勉強会 第6回

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n