E2E Test

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • E2E Test

  • E2E Test Tool

    • Puppeteer

      • Headless Chrome

      • Headless Browser

    • Playwright

    • CodeceptJS

E2E Test

๐Ÿ“– E2E Test

  • End To End ํ…Œ์ŠคํŠธ์˜ ์•ฝ์ž

  • ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์œผ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ๋ฆ„์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

  • ์‹ค์ œ ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ†ตํ•ฉ ๋ฐ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ

โ‡’ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ๊ด€์ ์œผ๋กœ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™์ž‘ ํ๋ฆ„์„ ํ…Œ์ŠคํŠธ

E2E Test Tool

๐Ÿ› ๏ธ Puppeteer

  • Headless Chrome ํ˜น์€ Chromium ๋ฅผ ์ œ์–ดํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Node 6 ์ด์ƒ ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, Chrome ํ˜น์€ Chromium ์˜ DevTools ํ”„๋กœํ† ์ฝœ ์„ ํ†ตํ•ด ๊ฐ Chrome ํ˜น์€ Chromium ์˜ API ์ œ์–ดํ•œ๋‹ค.

๐Ÿค– Puppeteer๋ฅผ ํ†ตํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…

  • ํŽ˜์ด์ง€์˜ ์Šคํฌ๋ฆฐ์ƒท ๋ฐ PDF๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • SPA(Single-Page Application)๋ฅผ ํฌ๋กค๋งํ•˜์—ฌ ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง๋œ ์ฝ˜ํ…์ธ (์ฆ‰, "SSR"(Server-Side Rendering).์–‘์‹ ์ œ์ถœ, UI ํ…Œ์ŠคํŠธ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๋“ฑ์„ ์ž๋™ํ™” ํ•œ๋‹ค.

  • ์ตœ์‹  ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค. ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋กฌ์˜ ์ตœ์‹  ๋ฒ„์ „์—์„œ ์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  • ์‚ฌ์ดํŠธ์˜ ํƒ€์ž„๋ผ์ธ ์ถ”์ ์„ ์บก์ฒ˜ํ•˜์—ฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํฌ๋กฌ ํ™•์žฅ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“– Headless Chrome

  • ํ—ค๋“œ๋ฆฌ์Šค ํ™˜๊ฒฝ์—์„œ Chrome ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • Chrome ์—†์ด Chrome์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“– Headless Browser

  • ๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(GUI)๊ฐ€ ์—†๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €

  • CLI(Command Line Interface)์—์„œ ๋™์ž‘ํ•˜๋Š”๊ฑธ ๋œปํ•œ๋‹ค.

๐Ÿ› ๏ธ Playwright

  • ์›น ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ E2E ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๋„๊ตฌ

  • ํ•˜๋‚˜์˜ API๋กœ ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €(ํฌ๋กœ๋ฏธ์›€, ํŒŒ์ด์–ดํญ์Šค, ์›นํ‚ท)์—์„œ ๋น ๋ฅด๊ณ , ์•ˆ์ •์ ์ธ ์ž๋™ํ™”๋ฅผ ์ง€์›ํ•˜๋Š” MS์—์„œ ๋งŒ๋“  ์ž๋™ํ™” ๋„๊ตฌ (Edge๋‚˜ IE11์€ ์ง€์›ํ•˜์ง€ ์•Š์Œ)

โš™๏ธ ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์„œ๋ฒ„ ์‹คํ–‰

npm start 
npx nodemon app.ts
  • Playwright ํŒจํ‚ค์ง€ ์„ค์น˜

npm i -D @playwright/test eslint-plugin-playwright
  • playwright.config.ts ํŒŒ์ผ ์ƒ์„ฑ

import { PlaywrightTestConfig } from '@playwright/test';

const config: PlaywrightTestConfig = {
 testDir: './tests',
 retries: 0,
 use: {
  channel: 'chrome',
  baseURL: 'http://localhost:8080', //ํ…Œ์ŠคํŠธ ํ•  URL
  headless: !!process.env.CI, 
  screenshot: 'only-on-failure', // ์‹คํŒจ์‹œ 
 },
};

export default config;

โœ… headless: !!process.env.CI CI ํ™˜๊ฒฝ์ด ์žกํ˜€์žˆ์„ ๊ฒฝ์šฐ ํ—ค๋“œ๋ฆฌ์Šค๋กœ ๋„์šฐ๊ธฐ(์•„๋‹Œ ๊ฒฝ์šฐ ๊ทธ๋ƒฅ ๋„์›€)

  • ๐Ÿ“ tests/.eslintrc.js ํŒŒ์ผ ์ƒ์„ฑ

mkdir tests

touch tests/.eslintrc.js
module.exports = {
    env: {
        jest: false,
    },
    extends: ['plugin:playwright/playwright-test'],
    rules: {
        'import/no-extraneous-dependencies': 'off',
    },
};
  • ๐Ÿ“ tests/home.spec.ts ํŒŒ์ผ ์ƒ์„ฑ

import { test, expect } from '@playwright/test';

test('Filter products', async ({ page }) => {
 await page.goto('/');

 await expect(page.getByText('Apple')).toBeVisible();

 const searchInput = page.getByLabel('Search');

 await searchInput.fill('a');

 await expect(page.getByText('Apple')).toBeVisible();

 await searchInput.fill('aa');

 await expect(page.getByText('Apple')).toBeHidden();
});

test('Click the โ€œIncreaseโ€ button', async ({ page }) => {
 await page.goto('/');

 const count = 13;

 await Promise.all((
  [...Array(count)].map(async () => {
   await page.getByText('Increase').click();
  })
 ));

 await expect(page.getByText(`${count}`)).toBeVisible();
});
  • .gitignoreํŒŒ์ผ์— ์—๋Ÿฌ ์ƒํ™ฉ์˜ ์Šคํฌ๋ฆฐ์ƒท ๋“ฑ์ด ๋‹ด๊ธฐ๋Š” test-results ๋””๋ ‰ํ„ฐ๋ฆฌ ์ถ”๊ฐ€

/test-results/

๐Ÿค– ํ…Œ์ŠคํŠธ ์‹คํ–‰

npx playwright test

# headless๋กœ ์‹คํ–‰(๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋„์šฐ์ง€ ์•Š์•„ ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.)
CI=true npx playwright test 

๐Ÿ› ๏ธ CodeceptJS

  • ์ธ๊ฐ„ ์นœํ™”์ ์ธ E2E ํ…Œ์ŠคํŒ… ๋„๊ตฌ

  • Playwright ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โš™๏ธ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ๋ฐฉ๋ฒ•

๐Ÿ”— ์ฐธ๊ณ 

Last updated