๋๊ท๋ชจ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ๊ธฐ๋ฅ ๋ฐ ๋จ๊ณ ์ ์์ ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๊ณ ์์ผ๋ฉฐ ์ฒซ ๋ฒ์งธ ์ฅ๋ฉด์ ์ฌ๋ฌ ๋จ๊ณ ์ ์์ ๋์ผํ ๋จ๊ณ ํจํด์ ์ฌ์ฉํ ์ ์๋๋ก 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์์ ๊ธฐ๋ฅ๊ณผ step_definitions๋ฅผ ์ฐ๊ฒฐํ๋ glue
์์ฑ์ ์ง์ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ ๊ฐ ์ฐพ๊ณ ์๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ค์ด-js์์๋ ๊ทธ๋ ์ต๋๋ค. ์๋ฐ์ ์:
@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{
}
์ค์ด-js๋ฅผ ์ฌ์ฉํ์ฌ cucumbr-jvm๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
๋๊ท๋ชจ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ๊ธฐ๋ฅ ๋ฐ ๋จ๊ณ ์ ์์ ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๊ณ ์์ผ๋ฉฐ ์ฒซ ๋ฒ์งธ ์ฅ๋ฉด์ ์ฌ๋ฌ ๋จ๊ณ ์ ์์ ๋์ผํ ๋จ๊ณ ํจํด์ ์ฌ์ฉํ ์ ์๋๋ก step_definition ํ์ผ์ ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด์์ต๋๋ค.
๋งค์ฐ ํฅ๋ฏธ๋ก์ด. ์ค์ด-js๋ ๋น์ ์ด ์ ๊ณตํ ์ค์ด-์๋ฐ ์์ ์ฒ๋ผ ๋ด์ฅ๋ ๊ฒ์ด ์์ต๋๋ค. ์ ๊ฐ ์ด๋ฐ ์ ํ์ ๋ํด ์ข์ํ๋ ์์ด๋์ด๋ ์ด ๋ ผ๋ฆฌ ์ ํ์ ์ธ๊ณ ์ค์ ๋๋ ์ธ์คํด์ค๋ก ๋ฐ์ด ๋ฃ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ชฝ์ด๋ ๋จ ํ๋์ ๋จ๊ณ ์ ์๋ก ๋๋ฉ๋๋ค. ์ง์ ์ฝ๋๋ฅผ ์ ์ํ ๋ ์ ํํ๋ ์ฌ๋ฌ ์ธ๊ณ ์ ์๋ฅผ ๊ฐ์ง๊ฑฐ๋ ์ปจํ ์คํธ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ๋ ธ์ถํ๋ ๋จ์ผ ์ธ๊ณ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ํ์ฌ ํ์ฌ ์๋๋ฆฌ์ค์ ํ์ผ์ ์คํ ๋จ๊ณ์ ๋ ธ์ถํ์ง ์์ง๋ง ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์คํธ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ค์ ๋ก ์ด๊ฒ์ ํ์๋ก ํฉ๋๋ค. ์ฐ๋ฆฌ๋ nightwatch-cucumber ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ๋ ํ ์คํธ๋ฅผ ์คํํ๊ณ ์์ผ๋ฉฐ ํ์ฌ๋ก์๋ ๊ฐ ๋จ๊ณ์ ์ ๋์ฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ์ผํ ํด๊ฒฐ์ฑ ์ ๋๋ค.
Given [comp1] I click on "Open dialog"
๋
Given [comp2] I click on "Open dialog"
์ด๋ ๋ชจํธํ ๋จ๊ณ ์ ์๋ฅผ ํผํ๋ ๋ฐ ๋์์ด ๋์ง๋ง ์ค์ ๋ก ์ฝ์ ์ ์๋ ๊ธฐ๋ฅ ํ์ผ๋ก ์ด์ด์ง๋๋ค.
์ค์ด.js ์์ค๋ฅผ ์์ ํด ๋ณด์์ง๋ง ์ด ๊ธฐ๋ฅ์ ๋ํ ์ง์์ ์ถ๊ฐํ ์ข์ ํํธ๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
์ด๊ฒ์ ์ผ๋ถ ํํฌ ๋๋ ๋์ ์ธ๊ณ๋ก ์คํ๋ ์ ์์ต๋๊น?
@leipert ์ด๋ค ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ํ๊ณ ์์ต๋๊น? ๋๋ ์ด ๋ ผ๋ฆฌ๊ฐ ์ธ๊ณ์ ์กด์ฌํ๊ฑฐ๋ ์ฌ๋ฌ ์ธ๊ณ ๊ฐ์ฒด๋ฅผ ์ง์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋จ๊ณ ์ ์๋ ์์ ์ค์ด ์ผ์น ํญ๋ชฉ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ ์ ํ ์ธ๊ณ ํจ์์ ์ ๋ฌํ๋ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ์ฉํ ์ธ๊ณ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ธฐ ์ํ CLI ์ต์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ํ์ฌ๋ก์๋ ๋ค์ค ์ธ๊ณ/๋จ๊ณ ์ ์๋ฅผ ๊ฐ๊ณ ์ถ๋ค๋ฉด ์ฝ๋๋ฅผ ๋ณ๋์ ํด๋์ ๋ฃ๊ณ ์คํํ ๋๋ง๋ค ํ๋๋ง ์๊ตฌํ๋ฉด ๋ฉ๋๋ค(--require CLI ์ต์ ์ฌ์ฉ).
์, "์ค์ด ์ฑ "์ ํนํ ์ด๋ฌํ ๋ฐฉ์์ ๋จ๊ณ ์ค๊ณ๋ฅผ ๊ถ์ฅํ์ง ์์ต๋๋ค. ๋จ๊ณ๋ ์ค๊ณ์ ์๋๋ฆฌ์ค ๊ฐ์ ๊ณต์ ๋๋ฉฐ ๋์ผํ ๋ฌธ์ฅ์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์๋ ๋ถ๊ตฌํ๊ณ ์ผ๊ด๋ ์๋ฏธ๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ๋จ๊ณ์ ๋ฒ์๋ฅผ ์๊ฐํ๋ฉด ์ธ์ด ํจ์ ์ ๋ง๋๋ ๊ฒ์ ์ ๋ง ์ฝ์ต๋๋ค.
์ง๊ธ๊น์ง๋ cucuber.js์์ ํ๊ทธ๋ง ๋ชฉ์ ์ ๊ฐ๊น์ต๋๋ค. ๊ทธ๋ฌ๋ ํํฌ๋ง ํ๊ทธ์๋ง ํด๋นํ๋ค๊ณ ์ ์ธํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ ์ฌ๋๋ค์ ์ํ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ์ ํ๋ ๊ฒฝ์ฐ ๋จ๊ณ ํจํด์์ [๊ธฐ๋ฅ ์ด๋ฆ]๊ณผ ๊ฐ์ด ๊ฐ๋จํ DSL์ ๋ฐ๋ช ํ ์ ์์ต๋๋ค.
@pinxue ๊ฐ์ฌํฉ๋๋ค. ๋งค์ฐ ์ ์ฉํ ์๋ต์ ๋๋ค. ๊ทธ๋ฌ๋ ์ดํดํ ์ ์์ต๋๋ค.
์, "์ค์ด ์ฑ "์ ํนํ ์ด๋ฌํ ๋ฐฉ์์ ๋จ๊ณ ์ค๊ณ๋ฅผ ๊ถ์ฅํ์ง ์์ต๋๋ค.
๊ฐ์ ํ๋ ๋ฌธ๊ตฌ๊ฐ ๋ค๋ฅธ ๋งฅ๋ฝ์์ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ํ์ง๋ง ๊ด์ฐฎ์. ๋ด๊ฐ ๊ฐ์ง ์ต์ ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌ์ค, ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ทธ๊ฒ์ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ด๋ถ DSL์ ๋ฐ๊ณ ์์ต๋๋ค.
์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
@pinxue ๋ฐ @robsonrosa์ ๋ํ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ฒ์ ๋จ๊ณ ์ ์์ ๋ํ ๋ด ์ถ๋ก ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ ๋ด ๋๋ค.
glue
์์ฑcucumber.js
์ ๊ธฐ๋ฅ ํจ๋ฆฌํฐ์ฆ, ์ค์ด.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://fitness.org/ ์์ BDD๋ฅผ ๋ฐฐ์ฐ๋ฏ๋ก ์ค์ด ์ปค๋ฎค๋ํฐ์์์ ๋ค๋ฅด๊ฒ BDD๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
ํ์ด์ง @richardlawrence
์ด๊ฒ์ ์ค์ด๊ฐ ํนํ ๋ ๋จ์ ์ธ ์์ญ์ ๋๋ค. ์ด๋ ํ์ด ์ ๋น์ฟผํฐ์ค ์ธ์ด๋ฅผ ์ฑ์ฅ์์ผ์ผ ํ๋ค๋ ๋ฏฟ์์ ๋ฐํ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค. ์ฌ๊ธฐ์ ๋จ์ด์ ๊ตฌ๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งฅ๋ฝ์์ ์ ํํ ํ ๊ฐ์ง๋ฅผ ์๋ฏธํ๊ณ ์ผ๊ด๋๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. defs global์ ์ ์งํ๋ ๊ฒ์ ๋ชจํธ์ฑ์ ํผํ๊ธฐ ์ํด ๊ธ์ ์ ์ธ ์๋ ฅ์ ์ ์งํฉ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ๊ฐ์ ๊ณ ์ ํ ๊ฒฝ๊ณ ์ปจํ ์คํธ๊ฐ ์๋ ๋๋ฌธ ๊ฒฝ์ฐ(DDD ์ฉ์ด๋ก), ์์ฉ ํ๋ก๊ทธ๋จ์ด ํด๋น ๊ฒฝ๊ณ๋ฅผ ๋ฐ์ํ๋๋ก ๋ถํ ๋ ๊ฒ๊ณผ ๋์ผํ ๋ผ์ธ์ ๋ฐ๋ผ Cucumber ์ ํ๊ตฐ์ ๋๋๋ฉด ๊ฐ ๊ฒฝ๊ณ ์ปจํ ์คํธ ๋ด์์ ๋จ๊ณ ์ ์๊ฐ ์ ์ญ์ ์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
Cucumber๋ก ์์ ํ๊ณ ๊ฒฝ๊ณ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธฐ์ฌ์ ๋๋ค. ์ด ํ์ด์ง์ ์์ด๋์ด ์ค ์ผ๋ถ๋ฅผ ๊ตฌํํ์ง๋ง @richardlawrence ๊ฐ ๋จ๊ณ ์ ์๋ฅผ ์ํด ํ๋์ ํน์ ํด๋์ค์ ์ง์คํ๋๋ก Cucumber๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค๊ณ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ํ๋ฅญํ ์๋ฃจ์ ์ ์ ์ํ์ง๋ ์์ต๋๋ค. http://confessionsofanagilecoach.blogspot.com/2017/05/teaching-cucumbers-about-boundaries.html
@leipert ๊ฐ ๋งํ๋ฏ์ด ์ ์ญ ๋ณ์๋ ๋์ฉ๋๋ค. CucumberJVM ์ธ๊ณ์ ์๋ ์ฌ๋๋ค์ ์ด์ผ๊ธฐ์ ์ ๋ฐ๋ง ์ดํดํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Cucumber (non JVM)๋ Scenario ๊ธฐ๊ฐ ๋์ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ธ ๊น๋ํ World ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค. ์๋๋ฆฌ์ค๊ฐ ์คํ๋ ํ ํ๊ดด๋ฉ๋๋ค. ์ด๊ฒ์ ์ข์ ํด๊ฒฐ์ฑ ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ํ์ง๋ง... CucumberJVM์์ ์ด ํจํด์ ์ข์ ๊ตฌํ์ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๋ฐ๋ผ์ Cucumber๊ฐ ๋จ๊ณ ์ ์๋ฅผ ์ํ ํ๋ซ/๊ธ๋ก๋ฒ ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ๋๋ก ํ๊ณ CucumberJVM์ด World ํจํด์ ๊ตฌํํ๊ธฐ ์ํ ๋ช ํํ ๋์์ธ ํจํด์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ ๋ ์กฐ๊ธ ๋ ํ๋ณตํฉ๋๋ค. ์ฌ๊ธฐ๊น์ง๋ CucumberJVM + World pattern == ์ง๋์น๊ฒ ๋ณต์กํ ์๋ฃจ์ ์ด์์ต๋๋ค. ์ง๊ธ๊น์ง ๋ด๊ฐ ๋ณธ ๋ชจ๋ ๊ฒ์ ๋จ์ํ ์ด๋ค ๋จ๊ณ ๊ธฐ๋ฅ์ด ์ด๋ค ๊ธฐ๋ฅ ํ์ผ๊ณผ ํจ๊ป ๊ฐ์ง ์ ์ดํ๋๋ก ํ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค. ์ง๊ธ๊น์ง ๋ด๊ฐ ๋ณธ ๋์์ ๋ชจ๋ ๋ ธ๋ ฅ/๋ณต์ก์ฑ์ ๋ํด ์ด๋ณด๋ค ๋ ๊ฐ์น ์๋ ๊ฒ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ ํ์ ์ค์ด์๋ ๋ ๋์ ์ธ๊ณ ์๋ฃจ์ ์ด ์์ต๋๋ค.
๊ถ๊ทน์ ์ผ๋ก World ํจํด์ ์ฌ์ฉํ๋๋ผ๋ ๊ธฐ๋ฅ ํ์ผ์์ ๋จ๊ณ๋ก ์ด๋ํ ๋ ์ ๋ณด ์์ค์ด ์๋ค๋ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ๋ถํํฉ๋๋ค. ๋ด ๊ธฐ๋ฅ ํ์ผ์ ์ข์ ์กฐ์ง์ ๋ฐฐ์นํ๊ณ , ๊ธฐ๋ฅ ํ์ผ ์ด๋ฆ์ ์ ๋ง๋ค๊ณ , ๊ธฐ๋ฅ์ ํ๋ช ํ๊ฒ ์ ์ธํ๊ณ , ์๋๋ฆฌ์ค ์ด๋ฆ์ ํ๋ช ํ๊ฒ ์ง์ ํ๋ฉด ๋ชจ๋ ์ปจํ ์คํธ๊ฐ ์ฐฝ ๋ฐ์ผ๋ก ๋์ ธ์ง๊ณ ๊ฐ์ ๋ก ์ ์ญ ๋จ๊ณ ์ ์ ๋ค์์คํ์ด์ค์ ํจ๊ป ์๋ํฉ๋๋ค.
์์คํ ์ ํจ์ฑ ๊ฒ์ฌ์์ ๊ด๊ณ๋ฅผ ์ ์งํ๊ณ ํ ์คํธ ๊ฒฝ๋ก์ ์์ผ๋์นด๋๋ฅผ ์ถ๊ฐํ๊ณ ์ผ๋ถ ์คํ ์์ค ํ๋ ์์ํฌ๋ฅผ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์๋ํ๋๋ก ํ๋ ๊ฒ๋ง ์๊ฐํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ ๊ธฐํ๋ฅผ ์ค ์ ์์ต๋๋ค.
๊ทํ์ ๋ชฉํ๋ ์ดํดํ์ง๋ง ๊ถ์ฅํ์ง ์์ต๋๋ค.
๋ํ ๋ฐฐ๊ฒฝ ์ค๋ช
์ด๋ ์ด๋ฅผ ๋ช
์์ ์ผ๋ก ๋ง๋๋ ์ถ๊ฐ Given ๋จ๊ณ์ ํจ๊ป ๋ช
์์ .feature ํ์ผ์ ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋ ๋ ๊ฐ์ ๋ค๋ฅธ ๊ตฌ์ฑ ํ์ผ์ ๋ง๋ค ์ ์์ต๋๋ค.
ํ๋๋ ์ํ ์ฉ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ์์ ์ฉ์
๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ๋จ๊ณ ํด๋๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค.
@robsonrosa @leipert ๋น์ ์ ์๊ฒฌ์ ๊ณต์ ํฉ๋๋ค
์๋ ๊ฒ์๋ฌผ ์ดํ ๊ฑฐ์ 2 ๋
...
๊ทธ๋ก ์ธํด ์ง์ ์ด ์์์ต๋๊น? ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@cristianmercado19 ์ฃ์กํฉ๋๋ค. ์๋๋๋ค. ๋๋ ๋ ์ด์ ์ค์ด js๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
Up... ์ ๋ ๋จ๊ณ์ ๊ตฌํ๊ณผ ์์ ํ ๋ถ๋ฆฌ๋ ๊ธฐ๋ฅ ํ์ผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ข์ํฉ๋๋ค.
_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}
๋ฅผ ์ฝ๋ฐฑ์ ์ ๋ฌํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?์ฆ: