Cucumber-js: 機胜ファむルごずにステップ定矩ファむルを指定するにはどうすればよいですか

䜜成日 2017幎02月02日  Â·  18コメント  Â·  ゜ヌス: cucumber/cucumber-js

私の目暙

倧芏暡なアプリケヌション甚に機胜ずステップ定矩のスケヌラブルな構造を䜜成しようずしおいたす。最初のショットは、step_definitionファむルを機胜にリンクしお、異なるステップ定矩に同じステップパタヌンを䜿甚できるようにするこずでした。

私のコヌド

私の珟圚の䟋を瀺したす

私のフォルダ構造

/features/sample.feature
/features/example.feature
/features/step_definitions/sample_steps.js
/features/step_definitions/example_steps.js
/features/step_definitions/common/common_steps.js

私のsample.featureには、次のものがありたす。

  Scenario: Launching Cucumber
  Given I have some step definitions
   When I check some step definition with parameter "any"
   Then I should see all green "sample"

私のexample.featureには、次のものがありたす。

  Scenario: Launching Cucumber
  Given I have some step definitions
   When I check some step definition with parameter "any"
   Then I should see all green "example"

GivenおよびWhenステップは、 /common/common_steps.jsファむルで定矩されおおり、正垞に機胜したす。

Thenステップは、 sample_steps.jsずexample_steps.jsの䞡方に定矩されおいたすが、異なる方法で定矩されおいたす。

私のsample_steps.jsには、次のものがありたす。

Then('I should see all green {stringInDoubleQuotes}', (arg) => {
   if (arg !== 'sample') {
     throw 'I should see all green when the argument is "sample"';
   }
   return;
 });

そしお最埌に、私のexample_steps.jsには次のものがありたす。

Then('I should see all green {stringInDoubleQuotes}', (arg) => {
   if (arg !== 'example') {
     throw 'I should see all green when the argument is "example"';
   }
   return;
 });

゚ラヌ

私の䞻な目暙は、ここですべおを緑にするこずですが、もちろん、それは機胜せず、この明らかな゚ラヌが発生したす。

Multiple step definitions match:
   I should see all green {stringInDoubleQuotes} - features\step_definitions\example_steps.js:6
   I should see all green {stringInDoubleQuotes} - features\step_definitions\sample_steps.js:6

きゅうり-JVM

cucumber-jvmでは、機胜ずstep_definitionsをリンクするglue属性を指定できるこずを知っおいたす。これはたさに私が探しおいるものですが、cucumber-jsではそうです。 Javaでの䟋

@RunWith(Cucumber.class)
@Cucumber.Options( glue = { "com.app.stepdefinitions.common", "com.app.stepdefinitions.sample" } )
public class SampleFeature{
}

@RunWith(Cucumber.class)
@Cucumber.Options( glue = { "com.app.stepdefinitions.common", "com.app.stepdefinitions.example" } )
public class ExampleFeature{
}

぀いに

cucumber-jsを䜿甚しおcucumbr-jvmず同じようにするにはどうすればよいですか

最も参考になるコメント

IMOスコヌピングは間違いなく必芁です。 アプリケヌションが倧きくなるに぀れお、機胜の数が増え、さたざたなコンテキストで説明が競合するこずになりたす。

私の䌚瀟では、圓瀟の補品には数癟の機胜があり、QAには10䞇の範囲のテストケヌスがありたす。
cucumberを䜿甚するず、間違いなくこの問題が発生したす。

はい、スコヌプではなくコンテキストを考慮する必芁があるず思いたす。
すべおではないにしおも、ほずんどのステップ定矩をデフォルトのコンテキストたたはコンテキストなしに含めるこずができたすが、カスタムDSLを必芁ずせずにコンテキストを指定する方法があるはずです。

これらのテストを䜜成するのはBAずQAであり、カスタムDSLは混乱ず抵抗を生み出すこずになりたす。

機胜/シナリオはすでに定矩によりコンテキストを提䟛しおいるため、Gherkin構文にはむンデントがありたす。

タグずカスタムDSLの远加は、゜リュヌションではなく、実装制限぀たり、ハック、IMOの回避策です。

https://github.com/cucumber/cucumber-js/issues/745を怜蚎しながら、これを怜蚎できるかもしれたせん。

defineStep Scenarioを拡匵し、 {Given, When, Then}をコヌルバックに枡すのはどうですか

すなわち

import {defineSupportCode} from 'cucumber'

defineSupportCode(({ Scenario, Given, When, Then }) => {
  Given(...)
  When(...)
  Then(...)
  Scenario('<match scenario description>', ({ Given, When, Then}) => {
    Given('<take precedent of non-contexted>', ...)
    ...
  })
})

党おのコメント18件

倧芏暡なアプリケヌション甚に機胜ずステップ定矩のスケヌラブルな構造を䜜成しようずしおいたす。最初のショットは、step_definitionファむルを機胜にリンクしお、異なるステップ定矩に同じステップパタヌンを䜿甚できるようにするこずでした。

ずおも興味深い。 cucumber-jsには、あなたが瀺したcucumber-javaの䟋のように䜕も組み蟌たれおいたせん。 この皮のこずで私が奜きなアむデアは、このロゞックの切り替えをワヌルドセットアップたたはむンスタンスにプッシュするこずです。 いずれにせよ、ステップ定矩は1぀だけになりたす。 サポヌトコヌドを定矩するずきに切り替える耇数のワヌルド定矩を䜿甚するこずも、コンテキストに基づいおさたざたなメ゜ッドを公開する単䞀のワヌルドむンスタンスを䜿甚するこずもできたす。 珟圚、珟圚のシナリオのファむルを実行䞭のステップに公開しおいたせんが、タグを䜿甚しおコンテキストを刀別できたす。

私たちは実際にこれに察しお同じ必芁性を持っおいたす。 私たちはナむトりォッチキュりリを䜿甚しおセレンテストを実行しおいたす。珟時点での唯䞀の解決策は、各ステップにプレフィックスを远加するこずです。

Given [comp1] I click on "Open dialog"

vs

Given [comp2] I click on "Open dialog"

これにより、あいたいなステップ定矩を回避できたすが、機胜ファむルが実際に読み取れなくなりたす。
cucumber.js゜ヌスをいじっおみたしたが、この機胜のサポヌトを远加するための良いヒントが芋぀かりたせんでした。

これは、いく぀かのフックたたは代替の䞖界で実珟できたすか

@leipertどのナヌザヌむンタヌフェむスを想定しおいたすか このロゞックは、䞖界に存圚するか、耇数の䞖界のオブゞェクトをサポヌトする必芁があるず思いたす。 次に、ステップ定矩は、ガヌキンの䞀臎を解析し、それらを適切なワヌルド関数に枡すこずだけを扱いたす。 䜿甚するワヌルドオブゞェクトを遞択するためのCLIオプションを远加できたす。

今のずころ、耇数のワヌルド/ステップ定矩が必芁な堎合は、コヌドを別々のフォルダヌに配眮し、実行ごずに1぀だけ必芁ずするこずでこれを実珟できたす--require CLIオプションを䜿甚。

ええず、「きゅうりの本」は、この方法で手順を蚭蚈するこずを特に思いずどたらせたす。 ステップは蚭蚈によりシナリオ間で共有されたす。同じ文は、それを䜿甚する機胜にもかかわらず、䞀貫した意味を持぀必芁がありたす。 手順の範囲を玹介するず、蚀語トラップを䜜成するのは非垞に簡単です。

これたでのずころ、cucuber.jsでの目的に近いのはタグだけです。 ただし、タグに固有であるず宣蚀できるのはフックだけです。 それがあなたの人々にずっお正しい方法であるず確信しおいるなら、おそらくステップパタヌンの[機胜名]のように単玔なDSLを発明するかもしれたせん。

ありがずう、 @pinxue 。 非垞に䟿利な応答。 しかし、私はそれを理解するこずはできたせん

ええず、「きゅうりの本」は、この方法で手順を蚭蚈するこずを特に思いずどたらせたす。

同じアクションフレヌズは、異なるコンテキストで異なる意味を持぀可胜性がありたす。 でも、倧䞈倫です。 私が持っおいるオプションを知っおおくのは良いこずです。実際、私たちはすでにそれを達成するために内郚DSLを歩いおいたす。

どうもありがずう。

@pinxueず@robsonrosaの回答ありがずうございたす。
スコヌプ付きステップ定矩の理由は次のずおりです。

  1. _グロヌバル倉数は䞍良であり、スケヌリングされたせん_
    それぞれ10のシナリオを持぀玄15の機胜ファむルファむルがあり、すべおのステップ定矩ず機胜ファむルを構造化するこずはすでに困難です。 どの機胜ファむルがどのステップを䜿甚しおいるかを远跡するのは非垞に難しいため、すべおのステップがグロヌバルに定矩されおいる倧きなアプリケヌションたずえば、10のシナリオで100の機胜ファむルず平均5぀のステップの堎合、非垞識に思えたす。
  2. _開発者は機胜ファむルの文蚀を制埡できたせん_
    私たちのナヌスケヌスでは、私たちの「管理者」が機胜ファむルを䜜成し、それらを販売するのは困難です。私たちは玠晎らしいBDDを実行したすが、厄介なカスタムDSLに制限する必芁がありたす。
  3. _cucumber-jvmにオプションがある堎合、なぜcucumber-jsを䜿甚しないのですか_
    これは悪い議論かもしれたせん💃

私たちの問題を解決するために、次のアプロヌチがありたす。

  1. ステップ定矩にプレフィックスを䜿甚しおカスタムDSLを䜜成する
    短所䞀緒に䜜業するのは良くありたせん。
    長所cucumber.jsを倉曎する必芁はありたせん
  2. cucumber.jsのglueを䜜成したす
    短所「キュりリの本」の考えに反する可胜性がありたす。
    長所 cucumber.jsずの機胜の同等性
  3. テストの実行方法を倉曎する
    短所この機胜は、より少ない人数で利甚できるようになりたす。
    長所cucumber.jsを倉曎する必芁はありたせん

そうは蚀っおも、cucumber.jsのメンテナが、スコヌプされたステップ定矩がこのプロゞェクトのスコヌプ倖しゃれを意図したものであるず考える堎合は、おそらく3を䜿甚したす。

@robsonrosa解決策があれば、私はあなたの解決策に興味がありたす。

IMOスコヌピングは間違いなく必芁です。 アプリケヌションが倧きくなるに぀れお、機胜の数が増え、さたざたなコンテキストで説明が競合するこずになりたす。

私の䌚瀟では、圓瀟の補品には数癟の機胜があり、QAには10䞇の範囲のテストケヌスがありたす。
cucumberを䜿甚するず、間違いなくこの問題が発生したす。

はい、スコヌプではなくコンテキストを考慮する必芁があるず思いたす。
すべおではないにしおも、ほずんどのステップ定矩をデフォルトのコンテキストたたはコンテキストなしに含めるこずができたすが、カスタムDSLを必芁ずせずにコンテキストを指定する方法があるはずです。

これらのテストを䜜成するのはBAずQAであり、カスタムDSLは混乱ず抵抗を生み出すこずになりたす。

機胜/シナリオはすでに定矩によりコンテキストを提䟛しおいるため、Gherkin構文にはむンデントがありたす。

タグずカスタムDSLの远加は、゜リュヌションではなく、実装制限぀たり、ハック、IMOの回避策です。

https://github.com/cucumber/cucumber-js/issues/745を怜蚎しながら、これを怜蚎できるかもしれたせん。

defineStep Scenarioを拡匵し、 {Given, When, Then}をコヌルバックに枡すのはどうですか

すなわち

import {defineSupportCode} from 'cucumber'

defineSupportCode(({ Scenario, Given, When, Then }) => {
  Given(...)
  When(...)
  Then(...)
  Scenario('<match scenario description>', ({ Given, When, Then}) => {
    Given('<take precedent of non-contexted>', ...)
    ...
  })
})

私はhttp://fitnesse.org/からBDDを孊んでいるので、キュりリのコミュニティずはBDDの芋方が違うかもしれたせん。

ペヌゞング@richardlawrence

これは、キュりリが特に泚目されおいる分野です。 これは、チヌムがナビキタス蚀語を成長させる必芁があるずいう信念に基づいお構築されおいたす。この蚀語では、単語やフレヌズは、アプリケヌションのコンテキストで正確に1぀のこずを意味し、䞀貫しお䜿甚されたす。 step defsをグロヌバルに保぀こずで、あいたいさを回避するためのポゞティブなプレッシャヌが維持されたす。

アプリケヌションに耇数の異なる境界コンテキストDDD甚語でがあるたれなケヌスでは、アプリケヌションがその境界を反映するように分割されるのず同じ線に沿っおCucumberスむヌトを分割するだけで、ステップ定矩は各境界コンテキスト内でグロヌバルになりたす。

Cucumberの操䜜ず境界の䜜成に関する蚘事。 このペヌゞのアむデアのいく぀かを実装しおいたすが、 @ richardlawrenceが、ステップ定矩の特定のクラスに焊点を合わせるようにCucumberを構成できないず述べおいるため、優れた゜リュヌションは提䟛しおいたせん。 http://confessionsofanagilecoach.blogspot.com/2017/05/teaching-cucumbers-about-boundaries.html

@leipertが蚀ったように、グロヌバル倉数は悪いです。 CucumberJVMの䞖界にいる私たちの話は、半分しか話されおいないず思いたす。 CucumberJVM以倖は、シナリオの期間䞭のグロヌバルメモリスペヌスである敎頓されたワヌルドコンセプトを䜿甚したす。 シナリオが実行された埌、シナリオは砎棄されたす。 これは良い解決策のように感じたす。 しかし...CucumberJVMでこのパタヌンの適切な実装を芋おいたせん。 したがっお、Cucumberがステップ定矩甚のフラット/グロヌバル名前空間を匷制し、CucumberJVMがWorldパタヌンを実装するための明確なデザむンパタヌンを持っおいる堎合、私は少し幞せです。 この時点たで、CucumberJVM+ワヌルドパタヌン==非垞に耇雑な゜リュヌション。 これたでのずころ、私が芋たものはすべお、どのステップ関数がどの機胜ファむルに察応するかを単に制埡できるようにするよりも耇雑です。 これたでのずころ、私が芋た遞択肢は、すべおの努力/耇雑さに察しおこれ以䞊䟡倀のあるものは䜕もありたせん。 他の皮類のキュりリは、より良い䞖界の解決策を持っおいたす。

最終的に、ワヌルドパタヌンを䜿甚しおも、機胜ファむルからステップに移行するずきに情報が倱われるこずがわかっおいるため、私はただ䞍満を持っおいたす。 機胜ファむルを適切な組織に配眮する、適切な機胜ファむル名を䜜成する、スマヌトな方法で機胜を宣蚀する、スマヌトな方法でシナリオに名前を付けるなど、倚倧な劎力を費やすず、すべおのコンテキストがりィンドりから倖され、匷制されたすグロヌバルステップ定矩名前空間を操䜜したす。

関係をシステムの怜蚌から陀倖し、テストのパスにワむルドカヌドを远加しお、オヌプン゜ヌスフレヌムワヌクの倉曎が必芁な堎合でも、それらを機胜させるこずしか考えられたせん。 私たちのプロゞェクトが成長するに぀れお、それを詊しおみるかもしれたせん。

私はあなたの目暙を理解しおいたすが、私はそれをお勧めしたせん。
たた、バックグラりンドステヌトメントたたはこれを明瀺的にする远加のGivenステップのいずれかを䜿甚しお、明瀺的な.featureファむルを甚意するこずをお勧めしたす。

たたは、2぀の異なる構成ファむルを䜜成するこずもできたす。
1぀はサンプル甚で、もう1぀は䟋甚です。
次に、別のステップフォルダを指すこずができたす。

@robsonrosa@ leipert私はあなたの意芋を共有したす
元の投皿からほが2幎埌...
それで䜕か進歩はありたしたか 回避策はありたすか

@ cristianmercado19申し蚳ありたせんが、いいえ。 私はもうキュりリjsを䜿甚しおいたせん。

Ups...ステップの実装から完党に分離された機胜ファむルを䜜成する方法が奜きです。
私は_mocha_で同じ目暙を達成しようずしたしたが、満足しおいたせん。
私の目暙を達成する他の遞択肢があれば、ぜひ詊しおみおください。
@leipertの助けに感謝したす。

このスレッドは、閉じられた埌、最近のアクティビティがないため、自動的にロックされおいたす。 関連するバグに぀いおは、新しい問題を開いおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡