λ¨κ³ μ μμμ λ¨κ³ νΈμΆμ νμ©ν©λλ€.
https://github.com/cucumber/cucumber/wiki/Calling-Steps-from-Step-Definitions
μ΄κ²μ΄ ꡬνλλ©΄ μ€μ΄-rbμμ μ΄ μμ
μ μννκΈ° μν΄ #steps
μ΄μΈμ λͺ¨λ κ²μ λ μ΄μ μ¬μ©νμ§ μμ κ³νμμ λͺ
μ¬νμμμ€. https://github.com/cucumber/cucumber/issues/68 μ°Έμ‘°
λ§· κ°μ¬ν©λλ€. -jsλ steps()λ§ μ§μν©λλ€.
μ’μμ!
μ΄μ λν μ§μ μ΄ μμ΅λκΉ? μλΉν μ€μν κΈ°λ₯μΈ κ² κ°μ΅λλ€.
μ΄κ²μ νμ¬ λ§μΌμ€ν€(0.3)μ μΌλΆλ‘ κ³νλμ§ μμμ΅λλ€. 0.4μ μΌλΆμ¬μΌ _ν΄μΌ ν©λλ€_.
@mattwynne step()
λ μ§μνκ³ μΆμ΅λλ€. λ λ§μ?
@jbpros μΆμΈ‘ν©λλ€. #step
λ‘ μμν μλ μμ΅λλ€. Gherkinμ ꡬ문 λΆμνλ λμ λ¨κ³λ₯Ό νΈμΆνκΈ° λλ¬Έμ ꡬνμ΄ λ κ°λ¨ν©λλ€.
λλ κ°μΈμ μΌλ‘ μ΄ κΈ°λ₯ μμ΄ Cucumberλ₯Ό μ¬μ©νλ κ²μ κΈ°μκ² μκ°ν©λλ€. λλ κ·Έκ²μ μ¬μ©νμ§ μμΌλ©° κ·Έκ²μ λμ μ΅κ΄μ΄λΌκ³ μκ°ν©λλ€. λλ νμ λμ λ©μλμ μμνλ κ²μ μ νΈν©λλ€.
κΆκ·Ήμ μΌλ‘ μ°λ¦¬κ° μ΄κ²μ μ§μνλ €λ©΄ Gherkinμμ ꡬνλλ κ²μ λ³΄κ³ μΆμ΅λλ€. λ°λΌμ λ€λ₯Έ μ¬λ¬ νμ μμ€ λ¨κ³μ 맀νλλ 맀ν¬λ‘ λ¨κ³λ₯Ό μ μνλ λ°©λ²μ΄ μμ΅λλ€. κ·Έλ° λ€μ Cucumberλ νμ μμ€μ νΈμΆνλΌλ μ§μλ₯Ό λ°κ³ μ§ν μ€μΈ 맀νμ΄ μλμ§ κ±°μ μ νμκ° μμ΅λλ€. κ·Έκ² λ΄ μ·¨ν₯μΌ κ²μ΄λ€.
TL;DR: Cucumber.js(λ° -jvm, -ruby 2 λ±)μ steps()
/ step()
λ₯Ό μ λ§λ‘ μΆκ°ν΄μΌ ν©λκΉ?
λ§·λ λ§μμ μ μ μΌλ‘ λμν©λλ€. _λΆννλ_ μ΄κ²μ νμ¬ Cucumber.jsμμ κ°μ₯ μνλ κΈ°λ₯μ λλ€.
λ΄κ° μ΄ν΄νλ ν λ§μ μ¬λλ€μ΄ λ¨κ³ μ μλ₯Ό _methods_ λλ _functions_μΌλ‘ κ°μ£Όν©λλ€. λ΄κ° 보기μλ μ μ°½ν μΈμ΄ λ¬Έμ₯κ³Ό νλ‘κ·Έλλ° μΈμ΄ μ½λ μ‘°κ° μ¬μ΄μ 맀νμΌ λΏ κ·Έ μ΄μμ μλλλ€. μ΄κ²μ μ°λ¦¬κ° κ·Έ μ§μΉμ λνλ λ°©λ²κ³Ό κΉμ κ΄λ ¨μ΄ μμ΅λλ€.
νλ‘κ·Έλλ¨Έμ κ΄μ μμ 보면 λ¨κ³ μ μλ λ©μλμ²λΌ 보μ λλ€. λλ κ·Έκ²μ΄ μ€λλ Cucumber_s_μ μ½μ μ΄λΌκ³ λ³Έλ€. λ¨κ³ μ μλ APIκ° μλλΌ λͺ μμ λ²μ 맡, λ§νμλ©΄ μ¬μ μΌλ‘ λ ΈμΆλμ΄μΌ ν©λλ€.
@msassak μ μ΄λ―Έ μ΄μ λν΄ ν₯λ―Έλ‘μ΄ μκ°μ νκ³ μμκ³ Cucumber 2.0μμ ν΄λΉ "맀ν"μ λ€μ λͺ¨λΈλ§νλ μμ μ νλ₯νκ² μννλ€κ³ μκ°ν©λλ€.
λλ μ§κΈ λ°λ‘ Cucumber.jsμμ μ΄ λ¬Έμ μ λν΄ μμ νκΈ°λ₯Ό 꺼립λλ€. λ°λ©΄μ λλ λ΄ κ°μΈμ μΈ μ·¨ν₯/μ견 λλ¬Έμ κΈ°λ₯ μ μ§λ₯Ό νκ³ μΆμ§ μμ΅λλ€.
:-1: :-1: :-1: :-1: :-1:
stepdefμμ λ¨κ³λ₯Ό νΈμΆνλ κ²μ Cucumber(-Ruby)μ μΆκ°νμ§ μμμΌλ©΄ νλ κΈ°λ₯ μ€ νλμ λλ€. Ruby stepdefλ λ€λ₯Έ κ³³μμ νΈμΆν μ μλ μ΅λͺ ν΄λ‘μ λ₯Ό μ¬μ©νκΈ° λλ¬Έμ λ°μνμ΅λλ€(ννλ₯Ό κ±°μΉμ§ μλ ν).
JavaScriptμμλ μν©μ΄ λ€λ¦ λλ€. λ¨κ³ μ μλ μΌκΈ κΈ°λ₯μ μ¬μ©ν©λλ€!
function x_is_something(x, cb) {
console.log('x', x);
cb();
}
Given(/x is (.*)/, x_is_something);
Given(/super x/, function(cb) {
x_is_something(97, cb);
});
CLOSED (WONTFIX)
: λ§μΉ:
μ¬κΈ°μμ κ°λ¨ν JS ν¨μ νΈμΆλ³΄λ€ step()
κ° λ λμ λ°©λ²μ μ΄ν΄νκ³ μλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. κ°μ μ°Έμ‘°μ μΆκ° λ μ΄μ΄(μ¦, μ¬μ ν JS ν¨μλ‘ λ³νλμ΄μΌ νλ νΉμ μ¬μ©μμκ² GET μμ²μ νκΈ° μν λ¨κ³ μ μ)λ₯Ό μ¬μ©νμ¬ μ΄μ¨λ νκ² λλ κ²μ΄ μλκ°μ?
λλ λΉμ μ΄ _μλ리μ€λ₯Ό λ°λν λ°©λ²μ΄ μκΈ° λλ¬Έμ_λΌκ³ μΌλ€λ κ²μ μμμ°¨λ Έμ΅λλ€. λ¨κ³ λ₯Ό μλ―Ένμ΅λκΉ μλλ©΄ μλμ μΌλ‘ μλλ¦¬μ€ μ λκΉ(νμμ κ²½μ°μλ λΉμ μ΄ λ¬΄μμ νλ €κ³ νλμ§ μ μ μμ΅λλ€).
μ¬μ ν λ°±κ·ΈλΌμ΄λμμ μ¬μ©μλ₯Ό μ μνκ³ When
λ¨κ³μμ λ°λ³΅ν μ μμ΅λλ€.
Feature:
Background:
Given a valid user called Simon
And a valid user called Sarah
And a valid user called Johnny
Scenario Outline:
When each valid user sends a GET request to /search<query>
Then everyone's request response code is 400
And everyone's request response body starts with <body>
Examples:
| query | body |
| ?foo=1 | ... |
κ·Έλ¦¬κ³ λ€, μ΄κ²μ μμ² μλ΅μ λ°°μ΄μ μ μ₯νκ³ λ°λ³΅νλ κ²μ μλ―Έν©λλ€. κ·Έλ κ² λμκ°μ?
μΌλΆ νλ¦(μ: 체ν¬μμ νλ¦)μ΄ μκ³ μ΅μ’
νμΈ νμ΄μ§λ‘ μ΄λνλ €λ κ²½μ° λ¨κ³ μ μμ μ μλ(μ΄λκ°) λ¨κ³λ₯Ό μνν μ μμ΅λλ€.
μ΄λκ°μ ν¨μλ₯Ό μ μνκ³ λ¨κ³ μ μμμ νΈμΆν μλ μλ€λ λ° λμν©λλ€. κ·Έλ¬λ λ¨κ³μμ κΈ°λ₯μΌλ‘ μ΄λνλ λ
Έλ ₯μ μ΅μνν©λλ€. BDD μ΄λκ°μμ νλ¦μ μ€λͺ
ν κ²½μ° λ³λμ λΌμ΄λΈλ¬λ¦¬λ‘ μ΄λνλ λ° μΆκ° μκ°μ ν μ ν νμκ° μμΌλ©° λ¨μν λ¨κ³ μ μλ₯Ό νΈμΆν μ μμ΅λλ€.
ν λ¨κ³λ₯Ό νΈμΆνλ κ²μ κ±°μ μΈλͺ¨κ° μμ΅λλ€. μ¬κΈ°μμ λͺ¨λ 루λΉμ λ¨κ³ κΈ°λ₯μ μ΄μν μκ°μ΄μμ΅λλ€. κ·Έλ¬λ λ΄ μμ²μ΄ λ§κ°λμ λλ κ·Έκ²μ μκ°μ ν μ νμ§ μμ κ²μ λλ€.
κ°μ¬ ν΄μ.
@cono κ° λ§νλ―μ΄ μ΄κ²μ μμ λμ§ μλλ€λ κ²μ΄ λ무 μνκΉμ΅λλ€. λ¨μΌ λ¨κ³λ₯Ό νΈμΆνλ κ²μ κ±°μ μΈλͺ¨κ° μμΌλ©° μ€μ μ¬λ‘λ λ 볡μ‘ν μμ μ λλ€.
μ΄κ²μ λͺ κ°μ§ μΈλΆνλ μλ리μ€λ₯Ό λ§λ λ€μ μ΄ μμ μ λ°λ³΅νλ λ€λ₯Έ μλ리μ€λ₯Ό λ§λλ λ° μ λ§ μ μ©ν©λλ€. νΉν λ¨κ³κ° λ μ΄μμ νμΌμ μ μλμ΄ μλ κ²½μ° ν¨μ μ¬μ¬μ© λμμ μ½μ§λ κΉ¨λνμ§λ μμ΅λλ€.
νμ΄! λλ λΉμ μ΄ μꡬνλ κ²μ μ νν μννλ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ§λ€μμ΅λλ€(λ€λ₯Έ λ¨κ³μμ ν λ¨κ³ νΈμΆ). μ¬κΈ°λ₯Ό μ΄ν΄λ³΄μμμ€: https://github.com/hackhat/cucumberry
νΌλλ°±μ νμν©λλ€!
@hackhat μ λ§ λ©μ§λ€μ. λλ μΌλ°μ μΌλ‘ λ¨κ³ μ μμ λκΈ°ν λΆλΆμ μ’μν©λλ€. μ€μ΄-νλ‘λ μ€μ΄.js μ μ© νλ¬κ·ΈμΈμΈκ°μ?
@jlin412 μ νλ μ λͺ¨λ₯΄κ² λλ° μ€μ΄ λμ°λ―Έ κ°λ€. νΌλλ°± κ°μ¬ν©λλ€
@hackhat λκΈ°ν λ¨κ³λ₯Ό μμ±νλ €λ©΄ λ€μ ꡬ문μ μ¬μ©ν΄μΌ ν©λλ€. this.addStep(...)? protractor.js/webdriver.js λμ μ λ λ λκΈ°νλ μ¬μ©ν΄μΌ ν©λκΉ?
@jlin412 λκΈ°ν νλ¬κ·ΈμΈλ§ μ¬μ©ν μ μμ΅λλ€. μ¬μ© λ°©λ²μ λ¬Έμλ₯Ό μ°Έμ‘°νμΈμ. μ κ° λͺ¨λ°μΌμ΄λΌ μ νν λ¨κ³λ₯Ό μλ €λ릴 μ μμ΅λλ€. λΉμ μ΄ κΈ°λ€λ¦΄ μ μλ€λ©΄ λλ 23h30 ν¬λ₯΄ν¬κ° μκ° μ£Όμμ λ μ μ€λͺ ν κ²μ λλ€.
@hackhat νλ‘μ νΈ μ΄λ¦μ λ€λ₯Έ μ΄λ¦μΌλ‘ λ³κ²½νμΈμ. hackhat/cucumber-pro#1 μ°Έμ‘°
@aslakhellesoy https://github.com/hackhat/cucumberry λ‘ μ΄λ¦ λ³κ²½
@aslakhellesoy κ·Έλ λ€λ©΄ λ¨κ³ νΈμΆμ μ°κ²°νλ λ°©λ²μ 무μμ λκΉ? νλ‘μ°μ²λΌ?
function x_is_something(x, cb) {
console.log('x', x);
this.x = x;
cb();
}
function y_is_something(y, cb) {
console.log('y', y);
this.y = y;
cb();
}
Given(/super z/, function(cb) {
x_is_something(97, cb);
y_is_something(8, cb);
});
y_is_something
x_is_something
κ° μ½λ°±μ νΈμΆνκΈ° λλ¬Έμ μ μλνμ§ μμ΅λλ€.
λν λ¨κ³κ° μΈκ³ 컨ν μ€νΈμ λ³μλ₯Ό μ μ₯νλ κ²½μ° ν¨μλ₯Ό νΈμΆν λλ§λ€ μ’ λ£λλ―λ‘ λ€μκ³Ό κ°μ΄ λ°μΈλ©ν΄μΌ ν©λλ€.
Given(/super z/, function(cb) {
x_is_something.bind(this)(97, cb);
y_is_something.bind(this)(8, cb);
});
λꡬλ μ§ μ΄λ¬ν λ¬Έμ μ λν ν΄κ²°μ± μ΄ μμ΅λκΉ?
λΉλκΈ°λ₯Ό μ¬μ©νκ³ λ³λ ¬ κΈ°λ₯μ μ¬μ©ν΄μΌ ν©λλ€. μ΄λ° μμΌλ‘ λΉμ μ μ ν
λ νμ νΈμΆμ΄ λͺ¨λ μλ£λ νμλ§ λ©μΈ cb.
λ°μΈλ©μ κ΄ν΄μλ μ΄κ²μ bindμ ν¨κ» μ¬μ©νκ±°λ ν΄λ‘μ λ³μλ₯Ό μ¬μ©ν μ μμ΅λλ€.
2015λ 5μ 14μΌ λͺ©μμΌ 00:15 Yun Jia [email protected] μ΄ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
@aslakhellesoy https://github.com/aslakhellesoy κ·Έλ° λ€μ μ²΄μΈ λ°©λ²
μ€ν μ½? νλ‘μ°μ²λΌ?ν¨μ x_is_something(x, cb) {
console.log('x', x);
this.x = x;
cb();
}ν¨μ y_is_something(y, cb) {
console.log('y', y);
this.y = y;
cb();
}μ£Όμ΄μ§(/μνΌ z/, ν¨μ(cb) {
x_is_something(97, cb);
y_is_something(8, cb);
});x_is_somethingμ΄ νΈμΆνκΈ° λλ¬Έμ μ μλνμ§ μμ΅λλ€.
y_is_somethingμ΄ μμ μ μλ£νκΈ° μ μ μ½λ°±ν©λλ€.λν λ¨κ³κ° μΈκ³ 컨ν μ€νΈμμ λ³μλ₯Ό μ μ₯νλ©΄ μ’ λ£λ©λλ€.
ν¨μλ₯Ό νΈμΆν λλ§λ€ λ€μκ³Ό κ°μ΄ λ°μΈλ©ν΄μΌ ν©λλ€.μ£Όμ΄μ§(/μνΌ z/, ν¨μ(cb) {
x_is_something.bind(μ΄)(97, cb);
y_is_something.bind(this)(8, cb);
});λꡬλ μ§ μ΄λ¬ν λ¬Έμ μ λν ν΄κ²°μ± μ΄ μμ΅λκΉ?
β
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ±°λ GitHubμμ νμΈνμΈμ.
https://github.com/cucumber/cucumber-js/issues/11#issuecomment -101845619
.
+1, μ΄κ²μ libμ μΌλΆμ¬μΌ ν©λλ€.
@mattwynne μ΄ μ μν κ²(μ½λ μ¬μ¬μ©μ±μ μ§μνλ μμ μ€μ΄ κΈ°λ₯ μΆκ°):
When a
Then x
When b
Then y
---------------------------------
Define x
Then p
And y
And q
---------------------------------
Step a
...
Step b
...
Step p
...
Step q
...
Step y
...
---------------------------------
@aslakhellesoy κ° μ μν κ²(볡μ λ μ½λλ₯Ό js ν¨μλ‘ μΆμΆ):
When a
Then x
When b
Then y
---------------------------------
Step a
...
Step b
...
Step x
...
Call f(p)
...
Step y
Call f(p)
---------------------------------
Function f(p)
...
---------------------------------
λ¨κ³ μ μμμ λ¨κ³ νΈμΆ
When a
Then x
When b
Then y
---------------------------------
Step a
...
Step b
...
Step x
...
Call y(p)
...
Step y
...
---------------------------------
μ λ λ€λ₯Έ λΆνμν μΆμν μμ€μ΄ νμνμ§ μμ§λ μ΄ν΄κ° λμ§ μμ΅λλ€. μ€λͺ μ΄ μμΌμ κ°μ?
@yunjia μ΄κ²μ κΈ°λ³Έ μ½λ°± μ΄λ‘ μ λλ€.
Given(/super z/, function(cb) {
x_is_something(97, function () {
y_is_something(8, cb);
});
});
λ°μΈλ© λ¬Έμ μ κ²½μ° ν΄λΉ ν¨μλ₯Ό World μ λ©μλλ‘ μ μν΄μΌ ν©λλ€.
function World(callback) {
this.x_is_something = function (x, callback) {
this.x = ...
};
this.y_is_something = function (y, callback) {
this.y = ...
};
callback(); // tell Cucumber we're finished and to use 'this' as the world instance
};
}
module.exports.World = World;
κ·Έλ° λ€μ λ¨κ³ μ μμμ:
Given(/super z/, function(cb) {
var self = this;
self.x_is_something(97, function () {
self.y_is_something(8, cb);
});
});
λν λκΈ° λ¨κ³ μ μλ Cucumber.js 0.5+μμ μ§μλ©λλ€.
Given(/super z/, function() {
this.x_is_something(97);
this.y_is_something(8);
});
@inf3rno λ¨κ³ μ μλ μΌλ° μμ΄μ JS μ½λ μ¬μ΄μ μμ λ²μ λ μ΄μ΄μ λλ€. λ¨κ³μμ νΈμΆ λ¨κ³λ₯Ό νμ©νμ¬ ν΄λΉ λ μ΄μ΄λ₯Ό λ λκ»κ² λ§λλλ€. λ¨κ³κ° μλ‘ μ°κ²°λμ΄ μ μ§ κ΄λ¦¬κ° λ§€μ° μ΄λ ΅μ΅λλ€.
λν μ¬λλ€μ΄ Gherkinμ μ ν μ¬μ©νμ§ μλ μ€ν¬λ¦½ν μΈμ΄λ‘ μ¬μ©νλλ‘ κΆμ₯ν©λλ€.
@inf3rno stepdef μμ μ½λλ₯Ό μ¬μ¬μ©νλ €λ©΄ stepdefμ λ³Έλ¬Έμ μΌλ° μλ° μ€ν¬λ¦½νΈ ν¨μλ‘ μ΄λνκ³ μ¬μ¬μ©νμμμ€.
@jbpros
λν μ¬λλ€μ΄ Gherkinμ μ ν μ¬μ©νμ§ μλ μ€ν¬λ¦½ν μΈμ΄λ‘ μ¬μ©νλλ‘ κΆμ₯ν©λλ€.
λΉμ μ plsλ₯Ό μμΈν μ€λͺ ν μ μμ΅λλ€. λλ λ¨κ³ μ μκ° μμ μ€μ΄μ μμ§ μκ³ ν μ€νΈ ν¨ν΄λ§ μ μ¬νκΈ° λλ¬Έμ μ°κ²°μ΄ 무μμΈμ§ μ΄ν΄νμ§ λͺ»ν©λλ€.
@inf3rno λ¨κ³μμ λ¨κ³λ₯Ό νΈμΆν μ μλ€λ©΄ "Gherkinland"λ‘ λ€μ μ ννλ κ²μ λλ€. λ¨κ³ μ΄λ¦μ ꡬ문 λΆμνκ³ μ€νν μ μλ λ¨κ³ μ μμ μΌμΉμμΌμΌ ν©λλ€. κΈ°λ³Έμ μΌλ‘ μμ μ€μ΄ λ΄μμ μμ μ€μ΄ μ€ν¬λ¦½νΈλ₯Ό μμ±νκ³ μμ΅λλ€(JS λ¨κ³ μ μ λ΄μ μ¨κ²¨μ Έ μμ§λ§ μ μ§ κ΄λ¦¬ POVμμ λ λλΉ μ§λ μΈλΆ μ¬νμ).
@aslakhellesoy @jbpros μμ΄λμ΄λ λ¨κ³κ° λμμ μ΄κ³ κ΅¬μ± κ°λ₯ν μ νμ΄μ΄μΌ νλ€λ κ²μ λλ€. κ·Έλ μ§ μμ΅λλ€.
@jbpros , λλ Java νλ‘κ·Έλλ°μ μ΅μνκ³ μ½μμ λν΄ κ±±μ νμ§ μκΈ° λλ¬Έμ κ·νμ μ루μ μ μ¬μ©ν κ²μ λλ€ :)
λ€λ₯Έ λ¨κ³μ κ΄μ μμ λ¨κ³λ₯Ό μ μνκΈ° μν΄ μ€μ΄λ₯Ό νμ₯ν μ¬λμ΄ μμ΅λκΉ? κ°μ κ²
Understand I log in to {site} as {user}, {pass}
I visit {site}
I log in as {user}, {pass}
μ΄κ²μ΄ μμ€ν μ ν΅ν κΈ΄ μ¬μ©μ μ¬μ μ λ μ μ€λͺ νκ³ μ ν κΈ°μ λ‘ μμ νλ κ²μ μ νΈνλ μ μ©ν νμ₯μΈμ§ μ¬λΆλ₯Ό μκ³ νκ³ μμ΅λλ€.
μ΄ μ€λ λλ λ«ν ν μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ κ²Όμ΅λλ€. κ΄λ ¨ λ²κ·Έμ λν μ λ¬Έμ λ₯Ό μ¬μμμ€.
κ°μ₯ μ μ©ν λκΈ
:-1: :-1: :-1: :-1: :-1:
stepdefμμ λ¨κ³λ₯Ό νΈμΆνλ κ²μ Cucumber(-Ruby)μ μΆκ°νμ§ μμμΌλ©΄ νλ κΈ°λ₯ μ€ νλμ λλ€. Ruby stepdefλ λ€λ₯Έ κ³³μμ νΈμΆν μ μλ μ΅λͺ ν΄λ‘μ λ₯Ό μ¬μ©νκΈ° λλ¬Έμ λ°μνμ΅λλ€(ννλ₯Ό κ±°μΉμ§ μλ ν).
JavaScriptμμλ μν©μ΄ λ€λ¦ λλ€. λ¨κ³ μ μλ μΌκΈ κΈ°λ₯μ μ¬μ©ν©λλ€!