倧èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³çšã«æ©èœãšã¹ãããå®çŸ©ã®ã¹ã±ãŒã©ãã«ãªæ§é ãäœæããããšããŠããŸããæåã®ã·ã§ããã¯ã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
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ãšåãããã«ããã«ã¯ã©ãããã°ããã§ããïŒ
倧èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³çšã«æ©èœãšã¹ãããå®çŸ©ã®ã¹ã±ãŒã©ãã«ãªæ§é ãäœæããããšããŠããŸããæåã®ã·ã§ããã¯ã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ã®åçããããšãããããŸãã
ã¹ã³ãŒãä»ãã¹ãããå®çŸ©ã®çç±ã¯æ¬¡ã®ãšããã§ãã
ç§ãã¡ã®åé¡ã解決ããããã«ã次ã®ã¢ãããŒãããããŸãã
glue
ãäœæããŸã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ã®å©ãã«æè¬ããŸãã
ãã®ã¹ã¬ããã¯ãéããããåŸãæè¿ã®ã¢ã¯ãã£ããã£ããªããããèªåçã«ããã¯ãããŠããŸãã é¢é£ãããã°ã«ã€ããŠã¯ãæ°ããåé¡ãéããŠãã ããã
æãåèã«ãªãã³ã¡ã³ã
IMOã¹ã³ãŒãã³ã°ã¯ééããªãå¿ èŠã§ãã ã¢ããªã±ãŒã·ã§ã³ã倧ãããªãã«ã€ããŠãæ©èœã®æ°ãå¢ããããŸããŸãªã³ã³ããã¹ãã§èª¬æã競åããããšã«ãªããŸãã
ç§ã®äŒç€Ÿã§ã¯ãåœç€Ÿã®è£œåã«ã¯æ°çŸã®æ©èœããããQAã«ã¯10äžã®ç¯å²ã®ãã¹ãã±ãŒã¹ããããŸãã
cucumber
ã䜿çšãããšãééããªããã®åé¡ãçºçããŸããã¯ããã¹ã³ãŒãã§ã¯ãªãã³ã³ããã¹ããèæ ®ããå¿ èŠããããšæããŸãã
ãã¹ãŠã§ã¯ãªãã«ããŠããã»ãšãã©ã®ã¹ãããå®çŸ©ãããã©ã«ãã®ã³ã³ããã¹ãïŒãŸãã¯ã³ã³ããã¹ããªãïŒã«å«ããããšãã§ããŸãããã«ã¹ã¿ã DSLãå¿ èŠãšããã«ã³ã³ããã¹ããæå®ããæ¹æ³ãããã¯ãã§ãã
ãããã®ãã¹ããäœæããã®ã¯BAãšQAã§ãããã«ã¹ã¿ã DSLã¯æ··ä¹±ãšæµæãçã¿åºãããšã«ãªããŸãã
æ©èœ/ã·ããªãªã¯ãã§ã«å®çŸ©ã«ããã³ã³ããã¹ããæäŸããŠãããããGherkinæ§æã«ã¯ã€ã³ãã³ãããããŸãã
ã¿ã°ãšã«ã¹ã¿ã DSLã®è¿œå ã¯ããœãªã¥ãŒã·ã§ã³ã§ã¯ãªããå®è£ å¶éïŒã€ãŸããããã¯ãIMOïŒã®åé¿çã§ãã
https://github.com/cucumber/cucumber-js/issues/745ãæ€èšããªããããããæ€èšã§ãããããããŸããã
defineStep
Scenario
ãæ¡åŒµãã{Given, When, Then}
ãã³ãŒã«ããã¯ã«æž¡ãã®ã¯ã©ãã§ããïŒããªãã¡ïŒ