Table of Content
- Introduction
- Usage of Cypress1
- Usage of Cypress2
- Usage of Cypress3
- Usage of Cypress4
- Conclusion
- Reference
๐ Introduction
์๋ ํ์ธ์. ์ด๋ฒ ํฌ์คํ ์์๋ e2e test๋ฅผ ์งํํฉ๋๋ค. Cypress๋ฅผ ์ด์ฉํ์ฌ ์งํํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๐ ์ด๋ฒ ํฌ์คํ ์ ๊ฐ๋จํ๊ฒ tdd-todo๋ฅผ ํตํ์ฌ 5๊ฐ์ todo๋ฅผ ์ถ๊ฐํด๋ณด๊ณ 5๊ฐ๊ฐ ์ ๋ง๋ก ์ถ๊ฐ๊ฐ ๋ฌ๋์ง์ ๊ดํ e2eํ ์คํธ๋ฅผ ์งํํ๋ ค๊ณ ํฉ๋๋ค.
๐จํด๋น ํฌ์คํ ์์๋ ์ค์น ๋ฐฉ๋ฒ์ ๋ํด์๋ ๋ค๋ฃจ์ง ์์ต๋๋ค. ๋ํ Cypress์ ๋ฌธ๋ฒ๊ณผ ๊ฐ์ ์์ธํ ๋ฐฉ๋ฒ์ ๋ค๋ฃจ์ง ์์ต๋๋ค.
๐ Usage of Cypress1
Cypress๋ฅผ ์ด์ฉํ๊ธฐ ์ ์ DOM ํ์ ํ ๋ ํญ์ ์ผ๋ํด์ผ ํ๋ ๊ฒ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๐ค๐ป DOM ํ์: ์๋ชป๋ ์
container.querySelector('.box > .value')
.querySelector('span.value')
.querySelector('.text.white')
container.children[0];
๐ค๐ป DOM ํ์: ์ฌ๋ฐ๋ฅธ ์
container.querySelector('.count-value')
๊ธฐ๋ฅ๋ง์ ์ํ ์๋ฏธ์๋ ํด๋์ค๋ช
์ฌ์ฉ
container.querySelector('[data-testid="count-value"]')
ํ
์คํธ๋ฅผ ์ํ ๋ณ๋์ ์์ฑ๊ฐ ์ฌ์ฉ
์ด๋ ๊ฒ ์ฌ์ฉ์ ํด์ฃผ๋ ์ด์ ๋ html๊ณผ ๊ฐ์ ์๊ฐ์ ์ธ ์์๊ฐ ๋ฐ๋์์๋ ํ ์คํธ๊ฐ ๊ธ๋ฐฉ ๊นจ์ง๋ ๊ฒ์ ๋ฐฉ์ง ํ๊ธฐ ์ํจ์ ๋๋ค.
๐ Usage of Cypress2
์ต๋ํ ์์ฃผ ์ฐ์ด๋ ๊ฒ๋ค์ command๋ก ๋ฑ๋กํด์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
// commands.js
Cypress.Commands.add('cget', (datacy) => cy.get(`[data-cy=${datacy}]`));
์ ๋ ํญ์ dom์ ๊ฐ์ ธ์ฌ๋ data-cy
๋ก ์ค์ ์ ํฉ๋๋ค. ์ ์ฒ๋ผ ๋จ์ถํค๋ฅผ ๋ฑ๋กํด์ฃผ์ง ์์ ์ํฉ์์๋ cy.get('[data-cy=${datacy}]')์ฒ๋ผ ๋ถ๋ฌ์ค๊ฒ ๋์ด์์ด ๊ท์ฐฎ์๋๊ฐ... ์์ต๋๋ค. ๊ทธ๋์ ํ๋ฒ์ cy.cget('datacy')๋ก ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ ์ด์ ๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋ณด๋ฉด ํ ์คํธ ์๋๊ฐ ๋ช ํํ๊ฒ ๋์์์ด์ผ ํ๋๋ฐ e2eํ ์คํธ ์ฝ๋๋ ๋๋ถ๋ถ ๊ทธ๋ ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ์ต๋ํ ์ผ์ ์ธ์ด(์ฌ๋์๊ฒ ํธ์ํจ์ ์ฃผ๋)์ผ๋ก ๋ commands๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฌํ ๋ถ๋ถ์ ์ค์ด๊ธฐ ์ํจ์ ๋๋ค.
๐ Usage of Cypress3
์ธ๋ฒ์งธ๋ ํ๊ฐ์ ๋์์ผ๋ก ๋ง์ ํ ์คํธ๋ฅผ ํ ์ ์๊ฒ ํด์ผํฉ๋๋ค.
์ด๋ ๊ฒ ์์ฑํ๋ ์ด์ ๋ ๊ฐ๊ฒฐ์ฑ์ ์งํค๊ธฐ ์ํด์ ์ ๋๋ค. e2e ์ฝ๋๋ ์ค์ ๋์์ ์ ์ธํ๋ ์ฝ๋๋ค๋ก ์ด๋ฃจ์ด์ ธ ์์ด์ ์์นซ ํ๋ฉด ์ฝ๋์ ๊ธธ์ด๊ฐ ๊ธฐํ๊ธ์ ์ ์ผ๋ก ๊ธธ์ด์ง๊ฒ ๋ฉ๋๋ค. ๋ํ ์ด๋ ๊ฒ ๊ธธ์ด์ง ์ฝ๋๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ฉฐ ์์ ์ธ๊ธํ๋ ์๋ ์กฐ์ฐจ ๋งค์ฐ ๋ถ๋ถ๋ช ํด์ง๊ฒ ๋ฉ๋๋ค. ๋ํ fail์ด ๋จ์ด์ง๊ฒ ๋์ด๋ debugํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ ์ง๋๋ค.(์ด๋ ๋์์์ ์ ํํ๊ฒ ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.) ๋ฐ๋ผ์ ํ๊ฐ์ ๋์์ ํ๋๋ผ๋ ์ต๋ํ ๋ง์ ํ ์คํธ๊ฐ ์๋ฐ๋์ด ์ง ์ ์๋๋ก ํด์ผํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์์ ๊ทธ๋ฆผ์์ ๋ค์ ๋ฒํผ์ ๋๋ฅธ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
๋ค์ ๋ฒํผ์ ๋๋ฅด๋ ํ์๋ ์ด 4๊ฐ์ง๋ฅผ ํ ์คํธ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
- ๋ํ๋ช ์ ์ ๋ ฅํ๋ผ๋ ๋ฉ์ธ์ง๊ฐ ์ ํํ๊ฒ ๋์ค๋์ง
- ์ฐธ๊ฐ์ ์๋ฅผ ์ ๋ ฅํ๋ผ๋ ๋ฉ์ธ์ง๊ฐ ์ ํํ๊ฒ ๋์ค๋์ง
- (์ฌ์ง์์๋ ๋์ค์ง ์์ง๋ง)ํ ์คํธ ๋ฉ์ธ์ง๊ฐ ์ ํํ๊ฒ ์ถ๋ ฅ์ด ๋๋์ง
- ํผ์ด ๋ค์ฑ์์ง์ง ์์ผ๋ฉด route ์ด๋์ด ๋์ง ์๊ฒ ํ๋์ง
์ด๋ฐ์์ผ๋ก ์ต๋ํ ํ๊ฐ์ ๋์์ผ๋ก ๋ง์ ๊ฒ์ ํ์ธํ ์ ์๋ ์ฝ๋๋ฅผ ์ฐ์ ์ ์ผ๋ก ์์ฑํ๊ณ ๊ทธ๋ค์ ์๋ฌ๊ฐ ๋ง์ด ๋ ๋ถ๋ถ์ ์ธ๋ถ์ ์ผ๋ก ์์ฑ์ ํ๋๊ฒ ์ข์ต๋๋ค.
๐ Usage of Cypress4
์ด์ ์ ๋ง ์ค์ ๋ก ์ฌ์ฉํ ๊ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
describe('Todo Cypress test', () => {
it('Add 5 Todos test', () => {
cy.visit('/'); // ๋ฉ์ธ '/'๋ก ๊ฐ๋๋ค. -> localhost:xxxx
for (let i = 1; i < 6; i += 1) { // ์ด 5๋ฒ for ๋ฌธ์ ๋๋๋ค.
cy.cget('todoInsertInput').type(`test${i}`); // test1, test2, test3 ....์ ์
๋ ฅํฉ๋๋ค.
cy.cget('todoAddBtn').fclick(); // ์ถ๊ฐํ๊ธฐ ๋ฒํผ ํด๋ฆญ
}
cy.cget('listTodo').should('have.length', 5); // ์ค์ ๋ก 5๊ฐ๊ฐ ์ถ๊ฐ๊ฐ ๋ฌ๋์ง ์ฒดํฌ๋ฅผ ํฉ๋๋ค.
});
});
๐ Conclusion
e2eํ ์คํธ๋ ์ง๋ ํฌ์คํ ์ฒ๋ผ storybook๊ณผ logicํ ์คํธ์ฒ๋ผ ์ ๊ฒฝ ์ธ ๊ฒ์ ๋ฑํ ์์ต๋๋ค. ํ์ง๋ง e2eํ ์คํธ๋ก ์ด๋ค ๋ถ๋ถ๊น์ง ํ ์คํธ๋ฅผ ํด์ผํ๋๊ฐ์ ๊ดํ ๋ถ๋ถ์ ํญ์ ๊ณ ๋ฏผ์ค๋ฝ์ต๋๋ค. (unit test์์ ๊ฑธ๋ฌ์ง ์๋ ์๊ณ storybook ํ ์คํธ์์๋ ๊ณตํต๋ ๋ถ๋ถ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ) ๊ทธ๋์ ์ ๊ฐ ์๊ฐํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- view์ ํํ๋ฅผ ๊ณ ์ณ๋ ์๋ฌ๊ฐ ์๋๋ ์ ๋์ ํ ์คํธ
- ์ต๋ํ ๋ง์ logic์ ๋๋์ผ๋ก ๋ฌถ์ด์ ํ ์คํธ(์ฒ์ ๋ถํฐ ๋๊น์ง ์๋์ ๊ฐ๋ ๊ฒ์ ๋ณด๊ธฐ ์ํจ)
์ฌ๊ธฐ์ ๋๋ฒ์งธ๋ ๊ทธ๋ ๋ค๊ณ ์น๋๋ผ๋ ์ฒซ๋ฒ์งธ๋ ๋๋์ฒด ์? ๋ผ๋ ์ง๋ฌธ์ด ๋ค์๋ ์์ต๋๋ค. ์ด๊ฒ์ ํ์ฌ ํ๋ก์ ํธ๋ ๋ง์ view๊ฐ ๋ฐ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. View์ ์ธ ๋ถ๋ถ๊น์ง ํ ์คํธ๋ฅผ ํ๋ค๋ณด๋ฉด 2์ฃผ๋ง๋ค ๋ฐ๋๋ view๋ฅผ ํ ์คํ ํ๊ธฐ์๋ ๋๋ฌด ๋ฒ ์ฐจ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ํญ์ ์ดํผ๋ผ๋ฏธ๋๋ ๊ธฐ์ตํ์ธ์. (snap shot ํ ์คํธ๋ storybook์ผ๋ก ๋์ฒด ๊ฐ๋ฅํฉ๋๋ค.)
๋ค์ ์๊ฐ์๋ TDD๋ฅผ ํ๋ฉด์ ๊ฒช๋ ์ ๋ก์ฌํญ๋ค๊ณผ ์ ์ ๊ดํ ์๊ฐ๋ค์ ์ ๋ฆฌํ๋ ํฌ์คํ ์ผ๋ก ๋ง๋์~~
๐ Reference
- Testing Vue.js Applications by Edd Yerburgh
- ์ค์ฉ์ ์ธ ํ๋ก ํธ์๋ ํ ์คํธ ์ ๋ต
- Cypress ๊ณต์ ํ
'Vue TDD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vue TDD - ํ๊ณ ํธ (0) | 2020.08.10 |
---|---|
Test code ์ฝ๊ฒ ์ฐ๊ธฐ - 1 (0) | 2020.08.06 |
Vue TDD - Storybook ํธ (0) | 2020.07.31 |
Vue TDD - Vuex ํธ (0) | 2020.07.30 |
Vue TDD - Component ํธ (0) | 2020.07.25 |