Cypress๋ฅผ ํตํ E2E ํ ์คํธ
๐ ํ๋ฃจ๋ง์ Cypress๋ก ์์ฑํ๋ JS E2E ํ ์คํธ ์ฝ๋
์ด ๊ธ์ ๋ฉ์ด์ปค์ค-ํ๋ฃจ๋ง์ Cypress๋ก ์์ฑํ๋ JS E2E ํ
์คํธ ์ฝ๋๋ฅผ ์๊ฐ ํ ์์ฑํ ๊ธ์
๋๋ค. ๊ฐ์์ ์ง์ ์ ์ธ ๊ด๊ณ๊ฐ ์๋ ์ ๋ณด๋ ์ต๋ํ ๋ฐฐ์ ํ์์ต๋๋ค.
๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์ด๋ป๊ฒ Cypress๋ฅผ ๋ค๋ฃจ๋์ง, ์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋์ง ๋ฑ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
E2E Test๋?
End-to-End
ํ
์คํธ์ ์ฝ์๋ก ๋ง๊ทธ๋๋ก ์ฌ์ฉ์์ ์ค์ฌ์์ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฒ์๋ถํฐ ๋๊น์ง ๊ทธ ํ๋ฆ์ ํ
์คํธํ๋ ์ํํธ์จ์ด ํ
์คํธ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค. E2E ํ
์คํธ๋ฅผ ํตํด ์ค์ ์ ์ ์๋๋ฆฌ์ค๋ฅผ ์๋ฎฌ๋ ์ด์
ํ๊ณ ์ด๋ฅผ ํตํด ์ดํ๋ฆฌ์ผ์ด์
๊ตฌ์ฑ ์์์ ํตํฉ ๋ฐ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
Cypress๋ ๋ญ๊น?
๊ฐ๋ฐ์๋ Cypress๋ฅผ ํตํด E2E ํ ์คํธ๋ฅผ ํจ์ฌ ํธํ๊ฒ ๊ตฌํํ๊ณ ๋ค๋ฃฐ ์ ์์ต๋๋ค. ์ดํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ ์ ๊ฐ ์ทจํ ์ ์๋ ๋ค์ํ ํ๋ ๋ฐฉ์๊ณผ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ํ ์คํธ ์ฝ๋๋ก ์์ฑํ๊ณ ๊ฒ์ฆํจ์ผ๋ก์จ, ํ ์คํธ์ ๋ค์ด๊ฐ๋ ์๊ฐ์ ๋งค์ฐ๋งค์ฐ๋งค์ฐ ์๋ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ํ, Cypress๋ GUI๋ฅผ ํตํด ๋ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๊ณ , E2E๋ฟ ์๋๋ผ ํตํฉ, ๋จ์ ํ ์คํธ๊น์ง ์ง์ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋จ์, ํตํฉ ํ ์คํธ๋ ๋ ๋ญ์ง?
- ๋จ์ ํ ์คํธ : ๊ฐ์ฅ ์์ ๋จ์์ ํ ์คํธ๋ก, ์ฃผ๋ก ๋ชจ๋ ์ฆ, ํจ์์ ๋ํ ํ ์คํธ๋ฅผ ๋งํฉ๋๋ค. ์์ฑ ๋น์ฉ์ด ์ ๊ณ ์คํ ์๋๊ฐ ๋น ๋ฆ ๋๋ค. ์๋ฌด๋๋ ๋จ์๊ฐ ๊ฐ์ฅ ์๊ธฐ์, ๋น ๋ฅด๊ฒ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ํด๊ฒฐํ ์ ์์ต๋๋ค.
function example = (a, b) => a + b;
// ์ด ๋, 1๊ณผ 2๊ฐ ๋ณ์๋ก ๋ค์ด๊ฐ์ ๋, 3์ด ๋์ค๋์ง ํ
์คํธ -> ๋จ์ ํ
์คํธ
-
ํตํฉ ํ ์คํธ : ๋ชจ๋๊ณผ ๋ชจ๋ ๊ฐ์ ๊ด๊ณ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋จ์ ํ ์คํธ๋ณด๋ค ์์ฑ์ด ์ด๋ ต๊ณ ์๋๊ฐ ๋๋ฆฝ๋๋ค. ์คํจ ์์, ์ด๋ค ๋ชจ๋์์ ์คํจํ๊ฑด์ง ํน์ ๋ชจ๋ ๊ฐ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ์ด๋ค ์ํธ์์ฉ์์ ๋ฌธ์ ๊ฐ ์๊ธด ๊ฒ์ธ์ง ๋ฑ๋ฑ ๋ค์ ์ ํํ ๋ฌธ์ ์์ธ์ ํ์ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
-
E2E ํ ์คํธ : ํตํฉ ํ ์คํธ๋ณด๋ค ๋ ํฐ ๊ฐ๋ ์ผ๋ก, ์ ์ ์ ํ๋์ ๋ฐ๋ผ ์ด๋ค์ง๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์๊ณผ ๋๊น์ง์ ํ ์คํธ์ ๋๋ค.
Cypress ๋ค๋ฃจ๊ธฐ
๋จผ์ Cypress๋ฅผ ์ค์นํด์ผํฉ๋๋ค. ๋ญ๊ฐ ๋๋ , ์ฒ์ ๋ฐฐ์ธ ๋๋ ๊ผญ๊ผญ๊ผญ ๊ณต์๋ฌธ์(cypress)๋ฅผ ๋ค์ด๊ฐ์ ์ด์ฌํ getting started๋ฅผ ์ฐพ์์ ๋๋ฌ๋ณด๋๋ก ํฉ๋๋ค!!
๊ธฐ์กด ํ๋ก์ ํธ root ๋๋ ํ ๋ฆฌ์์ ์๋์ ๋ช ๋ น์ด๋ก cypress๋ฅผ ์ค์นํฉ๋๋ค.
# ๊ฐ๋ฐ ์์กด์ฑ์ผ๋ก ์ค์น
npm install cypress --save-dev
# cypress ์คํ(2๊ฐ์ง ๋ชจ๋ ๊ฐ๋ฅ)
npx cypress open
./node_modules/.bin/cypress open
์ดํ cypress ํด๋ -> e2e ํด๋ ๋ด๋ถ์ appName.cy.js
์ ๊ฐ์ด appName์ด๋ผ๋ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ํ ํ
์คํธ ํ์ผ์ ์์ฑํฉ๋๋ค.
๊ณต์๋ฌธ์๋ฅผ ํตํด ๋ ๋ค์ํ ํจ์์ ์ปค๋งจ๋๊ฐ ์์ง๋ง, ์์ฃผ ๊ฐ๋จํ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
describe('์ด๋ค ์ดํ๋ฆฌ์ผ์ด์
์ธ์ง ์ ์ด์ฃผ์ธ์.', () => {
// ์ดํ๋ฆฌ์ผ์ด์
์ ์ง์
ํฉ๋๋ค.
beforeEach(() => {
cy.visit('์ดํ๋ฆฌ์ผ์ด์
์ url ์ฃผ์๋ฅผ ์ ์ด์ฃผ์ธ์.');
});
it('๋ฒํผ์ ํด๋ฆญ ์, 0์ด ์
๋ ฅ๋ฉ๋๋ค.', () => {
cy.get('.button').click();
cy.get('.answer').invoke('text').should('eq', String(0));
});
});
์ฌ์ค ๊ตฌ์ฒด์ ์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ง๋ง, ๋๋ถ๋ถ์ e2e ํ ์คํธ ์ฝ๋๋ ์์ ๊ฐ์ ์์์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
- ์ดํ๋ฆฌ์ผ์ด์ ์ ์ง์
- ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ํ ์คํธ์ธ์ง ์ ์
- ํ ์คํธ๋ฅผ ์ํด ์ด๋ค ์์๋ฅผ ์ ํํ๊ณ ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ์ง ์์ฑ
- 3๋ฒ์ ๊ณผ์ ์ ํตํด ์ด๋ค ์์์ ๊ฐ์ด ์ด๋ค ๊ฐ์ ๊ฐ์ง๋ฉด ๋๋์ง ๊ฒ์ฆ
๊ทธ๋์ ๊ตณ์ด Test๋ฅผ ํด์ผํ๋ ์ด์ ๊ฐ ์๋?
์ฒ์์ ์ ๋ ๊ฒฐ๊ตญ์ ๋ ์ฝ๋๋ฅผ ์ง๋ ์ผ์ธ๋ฐ, ๊ตณ์ด ํ
์คํธ๋ฅผ ํด์ผํ๋๊ฑด๊ฐ?
์ถ์์ต๋๋ค. ์์ ๊ฐ๋จํ ํ
์คํธ์ผ, ์ ๊ฐ ์ง์ ์ ์ ์ ์
์ฅ์ด ๋์ด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ๋ณด๊ณ ์ด๊ฒ์ ๊ฒ ์๋ฆฌ์กฐ๋ฆฌ ๋ง์ ธ๋ณด๋ฉด ๋ ํ
๋๊น์! ํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์
๋ฌด๋ฅผ ์งํํ๋ฉด์ ๊ธฐํ์, QA, ์ ์ ๋ฑ๋ฑ์๊ฒ ๋งค๋ฒ ์๋์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์
์ด ๋ฌธ์ ๊ฐ ์์์ ๋ณด์ฌ์ค ์๋ ์์ต๋๋ค.(๋๋ฌด๋ ๋ง์ ์๊ฐ ์๋น). ๊ฐ๋ฐ์๋ ์๊ณ ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์๋ํ๋ฅผ ํด์ผํ๋ ๋ฒ..! ์ด๋ ๊ฒ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ ๊ฐ๋จํ ์ฝ๋ ๋ช์ค๋ก ๋จ์๊ฐ์ ์ฌ๋ฌ๋ฒ ๋๋ ค๋ณผ ์ ์๊ณ , ๋ฌด์๋ณด๋ค ๊ฐ๋ฐ์ ๋ณธ์ธ๋ ๋ณธ์ธ์ ์ฝ๋์ ๋ํ ํ์ ๊ณผ ์์ ๊ฐ์ ์ป์ ์ ์๊ธฐ์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํด์ผํฉ๋๋ค.(ํ์ ํ์) ๋จ, ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ํฌ๋ฉด ์๋๋ฏ, ๋๋ ค ๊ฐ๋จํ ๊ธฐ๋ฅ์ ๋ํด์ ํ๋ํ๋ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์คํ๋ ค ๋ ๋นํจ์จ์ ์ธ ์ํฉ์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํจ์ผ๋ก์จ ๊ฐ์ฅ ํฌ๊ฒ ํจ์จ์ ์ป์ ์ ์๋ ์ ๋นํจ์ ๊ฐ์ง๋ ๊ฒ๋ ์ค์ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ข์ ํ ์คํธ๋ ๋ญ๊น?
- ์คํ ์๋๊ฐ ๋น ๋ฅผ ๊ฒ
- ๋ณธ ์ฝ๋๊ฐ ๋ฆฌํฉํ ๋ง๋์ด๋ ํ ์คํธ๋ ๊ทธ๋๋ก ์ ์๋๋ ๊ฒ
- ๋๋ฒ๊น ์ด ๊ฐ๋ฅํ ๊ฒ
- ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ํญ์ ์ผ์ ํ๊ณ ์์ ์ ์ผ ๊ฒ
- ํ ์คํธ์ ์๋(์ฌ๋์ด ๋ณด๋ ๊ฒ)๊ฐ ๋ช ํํ ๊ฒ