๐ ๋ชฉ์ฐจ
- Introduction
- Gherkin ์ฌ์ฉ
- Gherkin + Cypress
- Vuex store mocking ํ๊ธฐ
- Conclusion
- Reference
๐ Introduction
์๋ ํ์ธ์! ์ค๋์ ์ง๋ ํฌ์คํ ์์ ๋ค๋ค๋ Gherkin์ ์ค์ ๋ก Cypress์ ์ ์ฉํ๋ ํฌ์คํ ์ ๋๋ค. ํด๋น ์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธ ํ์ค ์ ์์ต๋๋ค.
๐ง ํด๋น ํฌ์คํ
์ ์์ ๋ ๊ฐ๋จํ counter
๊ตฌํ์
๋๋ค.
๐ Gherkin ์ฌ์ฉ
Counter
๋ ์ธ๊ฐ์ง ์๋๋ฆฌ์ค์ ๋ํด์ ์๋์ด ํด์ผํฉ๋๋ค.
- count์ ์์ ๊ฐ์ 0์ ๋๋ค.
- ํ๋ฌ์ค ๋ฒํผ์ ๋๋ฅด๋ฉด count๊ฐ 1 ์ฆ๊ฐ ํด์ผํฉ๋๋ค.
- ๋ง์ด๋์ค ๋ฒํผ์ ๋๋ฅด๋ฉด count๊ฐ 1 ๊ฐ์ ํด์ผํฉ๋๋ค.
์ด์ ํด๋น ์๋๋ฆฌ์ค๋ฅผ Gherkin์ผ๋ก ์ฎ๊ฒจ๋ณด๊ฒ ์ต๋๋ค.
# Counter.feature
Feature: Counter
Background:
Given I am on the main page # ํญ์ main page('/')์์ ๋์์ ํด์ผํฉ๋๋ค.
# count์ ์์ ๊ฐ์ 0์
๋๋ค.
Scenario: Counter display
Then: I can see count display with 0
# ํ๋ฌ์ค ๋ฒํผ์ ๋๋ฅด๋ฉด count๊ฐ 1 ์ฆ๊ฐ ํด์ผํฉ๋๋ค.
Scenario: Click plus button
When I click plus button
Then count display should 1
# ๋ง์ด๋์ค ๋ฒํผ์ ๋๋ฅด๋ฉด count๊ฐ 1 ๊ฐ์ ํด์ผํฉ๋๋ค.
Scenario: Click minus button
When I click minus button
Then count display should -1
์ด๋ ๊ฒ Gherkin๋ฌธ๋ฒ์ผ๋ก ์ฎ๊ฒจ๋ดค์ต๋๋ค.
(๐จ ํด๋น Gherkin ๋ฌธ๋ฒ์ ์ด์ ์ ์๋ ค๋๋ ธ๋ ์ข์ ์์ ๋ ์๋๋๋ค. ์ผ์ธ์นญ์ ์จ์ฃผ์ธ์!)
๐ Gherkin + Cypress
์ด์ ์ด๋ฌํ ๋ฌธ๋ฒ์ ์ด์ Cypress๋ก ์ด๋์ ํด๋ณด๊ฒ ์ต๋๋ค.
// specs/Counter/index.js
const { visit, the } = cy;
// Background:
Given("I am on the main page", () => {
visit("/");
});
// Scenario: Counter display
Then("I can see count display with {int}", (countDisplay) => {
the("counter").contains(countDisplay);
});
// Click plus button
When("I click plus button", () => {
the("plus-button").click();
});
Then("count display should {int}", (countDisplay) => {
the("counter").contains(countDisplay);
});
// Click minus button
When("I click minus button", () => {
the("minus-button").click();
});
Then("count display should {int}", (countDisplay) => {
the("counter").contains(countDisplay);
});
๋๋ค๋ฅธ ์ ๊ธฐํ ์ ์ {int}์ ๋๋ค. Gherkin์์ ์ ์๋ ์ซ์๋ฅผ ์ธ์๊ฐ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
cy.the
๋ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์
๋๋ค.(๋ฐ๋ก commands๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด์ ํฌ์คํ
์ ์ฐธ๊ณ ํด์ฃผ์ธ์)
์๋ data-test-counter๊ฐ์ด cypress๋ฅผ ์ํ tag๋ฅผ ์ง์ ํ ๋ค์ the commands๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
<!-- App.vue -->
<div id="app">
<div data-test-counter>{{ count }}</div>
<div>
<button @click="increase" data-test-plus-button>+</button>
<button @click="decrease" data-test-minus-button>-</button>
</div>
<div data-test-todo>
{{ todos.title }}
</div>
</div>
๐ Vuex store mocking ํ๊ธฐ
Vuex store๋ฅผ mockํ๊ธฐ์ ์์ ์๋ก์ด ์๋๋ฆฌ์ค๋ฅผ ์ถ๊ฐ ํด๋ณด๊ฒ ์ต๋๋ค.
โญ๏ธ๋ง์ฝ count๊ฐ 100์ด๋ผ๋ฉด ํ๋ฌ์ค ๋ฒํผ์ ๋๋ ์๋ 101์ด ๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋์ ๋จผ์ Gherkin์ ์์ฑ ํด๋ณด๊ฒ ์ต๋๋ค.
Scenario: Click plus button when count is 100
Given Count is 100
When I click plus button
Then count display should 101
์ด์ cypress๋ก store๋ฅผ mock ํด๋ณด๊ฒ ์ต๋๋ค.
const { visit, the, getStore } = cy; // ๋จผ์ getStore๋ฅผ ๊ฐ์ ธ์ ์ฃผ์ธ์!
// Scenario: Click plus button when count is 100
Given("Count is {int}", (newCount) => {
getStore().setState("counter", "count", newCount); // counter module์ count ๊ฐ์ newCount๋ก ์ฌ์ ์ ํฉ๋๋ค.
});
When("I click plus button", () => {
// set state
the("plus-button").click();
});
Then("count display should {int}", (countDisplay) => {
the("counter").contains(countDisplay);
});
๐ Conclusion
์ด๋ ๊ฒ BDD๋ฅผ ํ๋ ๋ฒ์ ๋ํด์ ์์ ๋ดค์ต๋๋ค. ์์ฐ์ด๋ฅผ ์ด๋ค๋ ๊ฒ์ด ์ผ๋ง๋ ๋ง์ ์ด์ ์ ๊ฐ์ ธ๋ค ์ฃผ๋์ง ์ ์ ์์ต๋๋ค. Test code๋ฅผ ์ ๋ ๋ค๋ ๊ฒ์ด ๋จ์ testing์ ๋ชฉ์ ์ด ์๋ ๊ฒ์ด ์๋๋ผ ๋ฌธ์์ ์ญํ ์ ํ๊ธฐ๋ ํฉ๋๋ค. BDD๋ฅผ ํ๋๊ฒ์ด ์ผ๋ง๋ ํฐ ์ด์ ์ ์ฃผ๋์ง๋ ํ์ ์ ํ ๋ ๊ฐ์ฅ ๋ง์ ํ์ด ๋ฉ๋๋ค. ํด๋น ์ฝ๋๋ฅผ ๋ค๋ฅธ ์ฌ๋์ด ๋ด์ผํ ๋ ๊ธฐํ์๋ฅผ ๋ค์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๊ฒ ์ง์ฌ์ง Gherkin ์ฝ๋๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์๊ฒ๋ ๊ธฐํ์์ ๋ํ ์ดํด๋ฅผ ์ค๋๋ค. ๊ทธ๋์ BDD๋ฅผ ํ๋๊ฐ ๋ด ๋๋ค...๐ ๊ทธ๋ผ ๋ค์ ํฌ์คํ ์์๋ api๋ฅผ mock ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ํฌ์คํ ํ๊ฒ ์ต๋๋ค~~
๐ Reference
'Vue BDD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vue BDD - Cypress Mock Api (0) | 2020.10.13 |
---|---|
Vue BDD - Gherkin (0) | 2020.10.06 |
Vue BDD - Setting (0) | 2020.10.06 |
Vue BDD - Intro (0) | 2020.10.05 |