BeforeFeature/AfterFeature κΈ°λ₯ νν¬κ° μλ μ΄μ λ₯Ό μ΄ν΄ν©λλ€. ν μ€νΈλ μ΄μμ μΌλ‘ 격리λμ΄μΌ ν©λλ€. κ·Έλ¬λ μ€μ©μ μΈ μ±λ₯μμ μ΄μ λ‘ λ°μ΄ν°λ² μ΄μ€ κ³ μ μ₯μΉμ κ°μ κ²μ κΈ°λ₯λΉ ν λ² μ€μ νλ κ²μ΄ λ λμ μ μμ΅λλ€.
#614μ μ§μ λ ν΄κ²° λ°©λ²μ λ€μκ³Ό κ°μ μ΄μ λ‘ λΆμ μ ν©λλ€.
3.0.0 μ΄μ μλ registerHandler('BeforeFeatures')μ 첫 λ²μ§Έ μΈμλ‘ μ λ¬λ 컨ν μ€νΈλ₯Ό μ¬μ©νμ¬ μ΄ κΈ°λ₯μ ν΄νΉν μ μμμ΅λλ€.
μ΄ κΈ°λ₯μ λν PRμ μλ½νκ±°λ 3.0μμ μ μ¬ν 컨ν μ€νΈλ₯Ό μ 곡νμ¬ μ΅μν ν΄νΉμ λ€μ κ°λ₯νκ² νλ κ²μ λν μκ°μ΄ μμ΅λκΉ?
μ°μλ κΈ°λ₯μ λμΌν νκ·Έκ° μλ κ²½μ° Afterλ₯Ό νΈμΆνμ§ μμ΅λλ€.
μ΄ν΄κ° μ λΌμ. μ΄κ²μ λν΄ λ μμΈν μλ €μ£Όμ€ μ μμ΅λκΉ? μ‘΄μ¬ μ¬λΆμ κ΄κ³μμ΄ νκ·Έμ κ΄λ ¨λ After
νν¬λ₯Ό μμ±ν μ μμ΅λλ€. ν΄λΉ ν΄κ²° λ°©λ²μ΄ μ 곡λ μ΄ν νκ·Έ κ΅¬λ¬Έμ΄ λ³κ²½λμμ΅λλ€.
νκ·Έκ° μ§μ λ κΈ°λ₯μ΄ λΉλμ λ§μ§λ§ ν μ€νΈμΈ κ²½μ° Afterλ₯Ό νΈμΆνμ§ μμ΅λλ€.
μ΄λ²μλ μ΄ν΄κ° μ μκ°μ μ€λͺ μ’ λΆνλ립λλ€. After νν¬λ₯Ό μ¬μ©ν μ μμ΄μΌ νμ§λ§ μ΄κ²μ΄ λ§μ§λ§ νν¬μΈμ§ μ¬λΆμ λν 컨ν μ€νΈλ₯Ό μκ² λ©λλ€. μ΄μμ μΌλ‘λ μ¬κΈ°μ λΆν΄λ₯Ό μνν νμκ° μμ΅λλ€.
λν λΉμ μ λλ΄νλ μλ리μ€λ₯Ό μ°κ²°νλ €κ³ λ Έλ ₯νκ³ μμ΅λλ€. λ€μ μ€ νλλ₯Ό μ μν©λλ€.
λͺ νν νμλ©΄, λ΄κ° μΈκΈνλ ν΄κ²° λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
this.Before({ tags: ['<strong i="6">@featurehook</strong>'] }, function () {
// log user in (if needed)
})
this.Before({ tags: ['~<strong i="7">@featurehook</strong>'] }, function () {
// log user out (if needed)
})
λͺ κ°μ§ κΈ°λ₯μ κ³ λ €νμμμ€.
<strong i="11">@featurehook</strong>
Feature: feature 1
Scenario: scenario 1
<strong i="12">@featurehook</strong>
Feature: feature 2
Scenario: scenario 2
Feature: feature 3
Scenario: scenario 3
<strong i="13">@featurehook</strong>
Feature: feature 4
Scenario: scenario 4
μμ μμλ‘ μ€ννλ©΄ κΈ°λ₯ 1κ³Ό κΈ°λ₯ 2 μ¬μ΄μ λΆν΄κ° λ°μνμ§ μμ΅λλ€. κΈ°λ₯ 4 μ΄νμλ λΆν΄κ° λ°μνμ§ μμ΅λλ€. μλνλ©΄ λ€λ₯Έ ν μ€νΈ μΌμΉκ° μκΈ° λλ¬Έμ λλ€ ~ @featurehook (μ΄κ²μ λ€μμΌλ‘ κ³ μΉ μ μμ΅λλ€. κ²°κ΅).
μ λ μλ리μ€λ₯Ό μ°κ²°νλ €κ³ νμ§ μμ΅λλ€. μ μκ²λ 격리μ μ±λ₯ κ°μ κ· νμ μμ λ‘κ² κ²°μ ν μ μμ΅λλ€.
λ€μν ꡬμ±μΌλ‘ ν μ€νΈ SMTP μλ²λ₯Ό μ€μ νλ ν μ€νΈμ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
<strong i="20">@smtpConfig1</strong>
Feature: ....
<strong i="21">@smtpConfig2</strong>
Feature: ....
μλ리μ€λ₯Ό λΆν΄νμ§ μμμΌλ‘μ¨ μλλ¦¬μ€ κ°μ λΆμμ©μ΄ μμ μ μμ§λ§ μ΄ κ²½μ° μλμ μ±λ₯ μ¬μ΄μ μ μΆ©μ΄ κ°μΉκ° μμ μ μμ΅λλ€.
μ£μ‘νμ§λ§ μ΄κ²μ μ§μλμ΄μΌ νλ€κ³ μκ°νμ§ μμ΅λλ€. λλΆλΆμ κ²½μ°λ₯Ό λ€λ£¨λ λ¨μΌ μλ리μ€μ λͺ¨λ μλ리μ€μμ μνλ₯Ό 곡μ νλ κΈ°λ₯μ΄ μμ΅λλ€. @featurehookμ΄ μλ λ§μ§λ§ μ£Όμμ μλ μ΄μ¨λ BeforeFeature/AfterFeatureλ₯Ό μ¬μ©νμ¬ ν΄κ²°λμ§ μμ΅λλ€.
BeforeFeature/AfterFeature νν¬μ κ²½μ° +1
ν
μ€νΈ 격리μ μ±λ₯μ κ· νμ μ μ§ν΄μΌ νλ€λ λ° λμν©λλ€. νμ¬ νλ μμν¬κ° ꡬμΆλ λ°©μμ λ°λ³΅λλ λ°°κ²½ λ¨κ³λ₯Ό μ μΈνκ³ λ¨μΌ κΈ°λ₯μΌλ‘ μλ리μ€λ₯Ό μ°κ²°νλ κ²μ΄ κ±°μ μμ΅λλ€. μ΄λ€ κ²½μ°μλ λ°°κ²½ λ¨κ³κ° λ°λ³΅λλ κ²μ μνμ§ μμ μ μμ΅λλ€. μ€νλ € κΈ°λ₯ μμ μ ν λ²λ§ λ°μνκ³ λͺ¨λ μλ리μ€κ° μλ£λ νμλ§ μμ λλλ‘ ν μ μμ΅λλ€.
νμ λλ¦¬κ³ μμ νκΈ° νλ Browserstackκ³Ό κ°μ μλΉμ€λ₯Ό μ¬μ©νκΈ° λλ¬Έμ(Saucelabsμ κ°μ λ€λ₯Έ μ격 μλ² κ³΅κΈμλ λ§μ°¬κ°μ§μ λλ€) μΌλ°μ μΌλ‘ BeforeFeature λ° AfterFeature μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μ¬μ©νμ¬ κΈ°λ₯ νμΌλΉ μ λ λ μΈμ λ° λΆν΄λ₯Ό μ€μ ν©λλ€.
λ°λΌμ λ΄ νμΌμ μΈκΈλ ν΄λΉ κΈ°λ₯κ³Ό κ΄λ ¨λ μλ리μ€κ° ν¨κ» μ€νλκ³ κ° μλ리μ€μ κ²μλ₯Ό μλ‘ μμνκΈ° μν΄ λΈλΌμ°μ νλ©΄μ μλ‘ κ³ μΉκ³ ν μ€νΈλ₯Ό μν΄ μ± μνλ₯Ό μλ‘ κ³ μΉ©λλ€. λ°λΌμ μ΄λ€ λ©΄μμλ 격리λκ³ ν μ€νΈ μ±λ₯μλ μν₯μ λ―ΈμΉμ§ μμ΅λλ€.
μ΄λ μμμ μ μν λ°μ κ°μ΄ κΈ°λ₯ νμΌλ³λ‘ μ€μ΄jsλ₯Ό μ€ννλ κ²λ³΄λ€ Before/After κΈ°λ₯ νν¬λ₯Ό λ€μ μ¬μ©νλλ‘ νλ κ²½μ°λ‘ κ°μ£Όλμ΄μΌ ν©λλ€.
BeforeFeature/AfterFeature
νν¬λ e2e/uat/bdd/call-it-whatever-you-want μ€μ΄κ° λ§λ€μ΄μ§λ ν
μ€νΈμ νμμ μ
λλ€.
Cucumberμ μ£Όμ "κ²½μμ"λ ν΄νΉ μμ΄ μ΄λ₯Ό μ§μν©λλ€(μ: JBehave, RobotFramework). μ΄λ νλ μμν¬μ μ μ ν κΈ°λ₯μ λλ€.
μ΄ λ¬Έμ λ νμ€ν Cucumber μ¬μ©μ λν μ°¨λ¨μ λλ€.
μλ νμΈμ... μ΄μ κ΄λ ¨λ λ¬Έμ μ μ§λ©΄ν΄ μμ΅λλ€. μ κ²½μ°μλ νκ·Έκ° μ§μ λ Before λ° After νν¬λ₯Ό μ¬μ©νμ¬ UIλ₯Ό ν μ€νΈνλ λ° μ¬μ©ν λ°μ΄ν°λ₯Ό μμ±/μμ ν©λλ€. Before νν¬μμ API λμ μ λλ₯΄κ³ λ°μ΄ν°λ₯Ό μμ±νκ³ After νν¬μμ λ€λ₯Έ API λμ μ λλ¬ μμ ν©λλ€(μμ± μλ΅μμ λ°νλ κ°μ²΄μ IDλ₯Ό μ μ₯ν λ€μ ν΄λΉ IDλ‘ μμ νμ΄λ‘λλ₯Ό λΉλν©λλ€. )
λ¬Έμ λ ν΄λΉ λ°μ΄ν°λ₯Ό μ¬μ©νκ³ νν¬λ₯Ό νΈλ¦¬κ±°νλ μλ리μ€κ° λ§μ§λ§μΌλ‘ μ€νλ λ νν¬κ° νΈλ¦¬κ±°λμ§ μλλ€λ κ²μ λλ€...
μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ°©λ²μ΄ μλμ??
κ°μ¬ ν΄μ
κΈ°λ₯ μ νμ +1.
μ°λ¦¬μ μ¬μ© μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€. λ€λ₯Έ λΈλΌμ°μ μλ λνλμ§ μλ νΉμ λΈλΌμ°μ μ λ²κ·Έλ₯Ό μ°Ύμ΅λλ€.
λ€μκ³Ό κ°μ΄ κΈ°λ₯μ νκ·Έλ₯Ό μ§μ νλ €κ³ ν©λλ€.
@ie-8-only
Business Need: IE8 should have limited functionality, but what is displayed, should be displayed correctly
@no-access @ssl-insecurity <strong i="8">@security</strong> @BUG-1876
Scenario: No access
Given I am on the home page
When I see that my browser is not supported
Then I should not be able to access the core site functionality
@formatting-issue <strong i="9">@bugs</strong> @BUG-1210
Scenario: The menu should not be formatted like a staircase
For the users to be able to navigate to the about us / contact us area of the site, the site navigation should be active
Given I am on the home page
When I see the menu
Then it should be displayed in a line
μ΄λ κ² νλ©΄ λΈλΌμ°μ λ₯Ό λ«κ³ BeforeFeature νν¬μμ IEλ₯Ό μ΄ μ μμΌλ©° AfterFeature νν¬μμ λλ¨Έμ§ μ νκ΅°μ μ¬μ© μ€μΈ λΈλΌμ°μ λ₯Ό λ€μ μ΄ μ μμ΅λλ€. λͺ¨λ μλ리μ€μ λν΄ λΈλΌμ°μ λ₯Ό λ«μλ€κ° λ€μ μ¬λ λ° λ§μ μκ°μ΄ 걸리λ―λ‘ μ¬μ©νκΈ°μ μ’μ κΈ°λ₯μ λλ€.
λ©λͺ¨:
λλ μΈκ³ κ°μ²΄λ₯Ό ν¬ν¨νλ λμμ΄ μλ€λ κ²μ μκ³ μμ΅λλ€(νμ¬ λΈλΌμ°μ λ₯Ό κ±°κΈ°μ μ€μ νκ³ λΈλΌμ°μ κ° μ΄λ€μ λν beforeAll Hookμμ νμν κ²μ΄ μλ κ²½μ°μλ§ λ«μ). μ΄λ―Έ νν¬μμ μλ£λκ±°λ Seleniumμ μ λ°μ μκ° λμ νμ νμ λμ§ κ²μ΄λΌκ³ κ²°μ ν©λλ€.
μ΄ κΈ°λ₯μ΄ μ μ©ν λ λ€λ₯Έ μμΈ BeforeFeature Hookμμ κΈ°λ₯μ λν μΆκ° μ€λͺ μΌλ‘ κΈ°λ₯μ ν μ€νΈλ₯Ό 첨λΆνλ €λ κ²½μ°κ° μμ΅λλ€.
νΉμ μ νμ ν
μ€νΈμμλ κΈ°λ₯ νν¬ μ /νκ° μ μ©ν κ²μ΄λΌκ³ μκ°ν©λλ€. μλ₯Ό λ€μ΄ .NETμ© Cucumber λΌμ΄λΈλ¬λ¦¬μΈ Specflowμλ λ€μμ΄ κ΅¬νλμ΄ μμ΅λλ€.
https://specflow.org/documentation/Hooks/
μ΄ μ€λ λλ λ«ν ν μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ κ²Όμ΅λλ€. κ΄λ ¨ λ²κ·Έμ λν μ λ¬Έμ λ₯Ό μ¬μμμ€.
κ°μ₯ μ μ©ν λκΈ
BeforeFeature/AfterFeature νν¬μ κ²½μ° +1
ν μ€νΈ 격리μ μ±λ₯μ κ· νμ μ μ§ν΄μΌ νλ€λ λ° λμν©λλ€. νμ¬ νλ μμν¬κ° ꡬμΆλ λ°©μμ λ°λ³΅λλ λ°°κ²½ λ¨κ³λ₯Ό μ μΈνκ³ λ¨μΌ κΈ°λ₯μΌλ‘ μλ리μ€λ₯Ό μ°κ²°νλ κ²μ΄ κ±°μ μμ΅λλ€. μ΄λ€ κ²½μ°μλ λ°°κ²½ λ¨κ³κ° λ°λ³΅λλ κ²μ μνμ§ μμ μ μμ΅λλ€. μ€νλ € κΈ°λ₯ μμ μ ν λ²λ§ λ°μνκ³ λͺ¨λ μλ리μ€κ° μλ£λ νμλ§ μμ λλλ‘ ν μ μμ΅λλ€.