๐ ์ด๋ฐ ๋ถ๊ป ์ถ์ฒํฉ๋๋ค
- Playwright๋ก E2E ํ ์คํธ๋ฅผ ์ฒ์ ๋ฐฐ์ฐ๊ณ ์ถ์ ๋ถ
- ๋ก๊ทธ์ธ๋ถํฐ ์ฃผ๋ฌธ ์๋ฃ๊น์ง์ ์ ์ฒด ํ๋ก์ฐ๋ฅผ ํ ์คํธํ๊ณ ์ถ์ QA ์์ง๋์ด
- Selenium์์ Playwright๋ก์ ์ ํ์ ๊ฒํ ์ค์ธ ๋ถ
- Python์ผ๋ก E2E ํ ์คํธ๋ฅผ ๊ตฌํํด๋ณด๊ณ ์ถ์ ๊ฐ๋ฐ์ยทํ ์คํธ ์์ง๋์ด
โ ์ด ๊ธ์ ์ฝ์ผ๋ฉด ์ ์ ์๋ ๊ฒ
- Playwright์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ Selenium๊ณผ์ ์ฐจ์ด์
- E2E ํ ์คํธ์ ๊ฐ๋ ๊ณผ ์ค๋ฌด์์์ ํ์ฉ ๋ฐฉ๋ฒ
- Playwright ร Python ์ ์ ๋ฐฉ๋ฒ
- ๋ก๊ทธ์ธ๋ถํฐ ์ฃผ๋ฌธ ์๋ฃ๊น์ง ์ ์ฒด 10๊ฐ ์ผ์ด์ค๋ฅผ ์๋ํํ๋ ๋ฐฉ๋ฒ
๐จโ๐ป ์์ฑ์ ์๊ฐ
QA ์์ง๋์ด๋ก์ ์ค๋ฌด์์ PlaywrightยทSelenium์ ํ์ฉํ ์๋ํ ํ ์คํธ๋ฅผ ๋ด๋นํ๊ณ ์์ต๋๋ค. ๋ณธ ๊ธ์์ ์๊ฐํ๋ ์คํฌ๋ฆฝํธ๋ GitHub์ ๊ณต๊ฐ๋์ด ์์ผ๋ฉฐ, ์ค์ ๋ก ๋์ ํ์ธ์ด ์๋ฃ๋ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ํด์คํฉ๋๋ค.
E2E ํ ์คํธ๋ผ๊ณ ํ๋ฉด “์ด๋ ค์ธ ๊ฒ ๊ฐ๋ค”, “์ค์ ์ด ๋ฒ๊ฑฐ๋กญ๋ค”๊ณ ๋๋ผ๋ ๋ถ๋ ๋ง์ ๊ฒ์ ๋๋ค. ํ์ง๋ง Playwright๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ์ค์น๋ถํฐ ํ ์คํธ ์คํ๊น์ง ๋๋ผ์ธ ์ ๋๋ก ๊ฐ๋จํ๊ฒ ์คํํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ ํ ์คํธ ์๋ํ ์ฐ์ต์ฉ ๋ฐ๋ชจ EC ์ฌ์ดํธ๋ก ์ ๋ช ํ SauceDemo๋ฅผ ๋์์ผ๋ก, ๋ก๊ทธ์ธ โ ์ํ ์ถ๊ฐ โ ์ฅ๋ฐ๊ตฌ๋ ํ์ธ โ ์ฒดํฌ์์ โ ์ฃผ๋ฌธ ์๋ฃ โ ๋ก๊ทธ์์๊น์ง์ ์ ์ฒด ํ๋ก์ฐ๋ฅผ Playwright ร Python์ผ๋ก ์๋ํํ๋ ๋ฐฉ๋ฒ์ ์ด๋ณด์๋ ์ฝ๊ฒ ๋ฐ๋ผํ ์ ์๋๋ก ํด์คํฉ๋๋ค.
Playwright๋?
Playwright๋ Microsoft๊ฐ ๊ฐ๋ฐํ ๋ธ๋ผ์ฐ์ ์๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ChromiumยทFirefoxยทWebKit์ ์ธ ๊ฐ์ง ๋ธ๋ผ์ฐ์ ์์ง์ ๋์ํ๋ฉฐ, PythonยทJavaScriptยทTypeScriptยทJavaยทC# ๋ฑ ์ฌ๋ฌ ์ธ์ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Selenium๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ธ๋ผ์ฐ์ ๋ฅผ ์กฐ์ํ์ฌ ํ ์คํธ๋ฅผ ์คํํ์ง๋ง, ์ ์ ์ด ์๋์ ์ผ๋ก ๊ฐ๋จํ๊ณ ๋๊ธฐ ์ฒ๋ฆฌยท๋ นํ ๊ธฐ๋ฅ ๋ฑ์ด ํ์ค ํ์ฌ๋์ด ์๋ ๊ฒ์ด ํฐ ํน์ง์ ๋๋ค.
| ๋น๊ต ํญ๋ชฉ | Selenium | Playwright |
|---|---|---|
| ์ ์ | ChromeDriver ๋ณ๋ ํ์ | playwright install ํ ์ค๋ก ์๋ฃ |
| ๋๊ธฐ ์ฒ๋ฆฌ | WebDriverWait ํ์ | wait_for_url๋ก ๊ฐ๋จํ๊ฒ |
| ์คํ ์๋ | ๋ณดํต | ๋น ๋ฆ |
| ๋ นํ ๊ธฐ๋ฅ | ์์ | โ ํ์ค ํ์ฌ |
| slow_mo ๊ธฐ๋ฅ | ์์ | โ ํ์ค ํ์ฌ |
E2E ํ ์คํธ๋?
E2E ํ ์คํธ๋ End-to-End ํ ์คํธ์ ์ฝ์๋ก, ์ค์ ์ฌ์ฉ์๊ฐ ์กฐ์ํ๋ ์ผ๋ จ์ ํ๋ฆ์ ๊ทธ๋๋ก ์๋ํํ์ฌ ํ ์คํธํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ๋จ์ ํ ์คํธยทํตํฉ ํ ์คํธ์ ๋ฌ๋ฆฌ ์ค์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์กฐ์ํ์ฌ “๋ก๊ทธ์ธ โ ์ํ ์ ํ โ ๊ตฌ๋งค ์๋ฃ”์ ๊ฐ์ ์ค์ ์ฌ์ฉ์ ์กฐ์์ ์ฌํํฉ๋๋ค.
- ๋จ์ ํ ์คํธ๏ผํจ์ยท๋ฉ์๋ ๋จ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ํ์ธ
- ํตํฉ ํ ์คํธ๏ผ์ฌ๋ฌ ๋ชจ๋์ ์กฐํฉํ์ ๋์ ๋์์ ํ์ธ
- E2E ํ ์คํธ๏ผ์ฌ์ฉ์ ์กฐ์์ ์ ์ฒด ํ๋ก์ฐ๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฒฝ์ ๋ก ํ์ธ โ ์ด ๊ธ์์ ๋ค๋ฃจ๋ ๋ด์ฉ
E2E ํ ์คํธ๋ ๋ฆด๋ฆฌ์ค ์ ์ต์ข ํ์ธ์ด๋, ๋ฐฐํฌ๋ง๋ค ๊ธฐ๋ณธ ํ๋ก์ฐ๊ฐ ๋ง๊ฐ์ง์ง ์์๋์ง๋ฅผ ์๋์ผ๋ก ์ฒดํฌํ๋ ํ๊ท ํ ์คํธ๋ก ํนํ ํจ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
ํ ์คํธ ๋์ ์ฌ์ดํธ๏ผSauceDemo๏ผ
SauceDemo๋ Sauce Labs๊ฐ ์ ๊ณตํ๋ E2E ํ ์คํธ ์ฐ์ต์ฉ ๋ฐ๋ชจ EC ์ฌ์ดํธ์ ๋๋ค. ๋ก๊ทธ์ธยท์ํ ๋ชฉ๋กยท์ฅ๋ฐ๊ตฌ๋ยท์ฒดํฌ์์ ๋ฑ EC ์ฌ์ดํธ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด ๊ฐ์ถฐ์ ธ ์์ด ํ ์คํธ ์๋ํ ์ฐ์ต์ ์ต์ ์ ํ๊ฒฝ์ ๋๋ค.
| ์ฌ์ฉ์ ์ด๋ฆ | ๋น๋ฐ๋ฒํธ | ํน์ง |
|---|---|---|
standard_user | secret_sauce | ์ผ๋ฐ ์ฌ์ฉ์๏ผ๋ฉ์ธ ํ๋ก์ฐ์์ ์ฌ์ฉ๏ผ |
locked_out_user | secret_sauce | ๋ก๊ทธ์ธ ๋ถ๊ฐ๏ผ๋ค๊ฑฐํฐ๋ธ ํ ์คํธ์ฉ๏ผ |
problem_user | secret_sauce | UI ๋ฒ๊ทธ ์์ |
performance_glitch_user | secret_sauce | ์๋ต์ด ์๋์ ์ผ๋ก ๋๋ฆผ |

โฒ SauceDemo ๋ก๊ทธ์ธ ํ๋ฉด. ํ๋ฉด ํ๋จ์ ํ ์คํธ ์ฌ์ฉ์ ๋ชฉ๋ก๊ณผ ๊ณตํต ๋น๋ฐ๋ฒํธ๊ฐ ํ์๋๋ค
ํ๊ฒฝ ๊ตฌ์ถ๏ผPythonใปPlaywright๏ผ
์ค์น
Playwright ์ ์ ์ ๋ช ๋ น์ด 2์ค๋ก ์๋ฃ๋ฉ๋๋ค. ChromeDriver์ ์๋ ๊ด๋ฆฌ๋ ์ ํ ํ์ ์์ต๋๋ค.
pip install playwright
playwright install chromiumํด๋ ๊ตฌ์ฑ
์ด๋ฒ์๋ ๊ฐ๋จํ 1ํ์ผ ๊ตฌ์ฑ์ ๋๋ค. ์คํฌ๋ฆฐ์ท ํด๋๋ ์คํ ์ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
project/
โโโ test_saucedemo.py # ๋ฉ์ธ ํ
์คํธ ์คํฌ๋ฆฝํธ
โโโ screenshots/ # ์คํ ์ ์๋ ์์ฑ
โโโ ss_01_login_input.png
โโโ ss_02_after_login.png
โโโ ss_03_locked_user_error.png
โโโ ...๐ก Tip๏ผscreenshots/ ํด๋๋ ์คํฌ๋ฆฝํธ ์คํ ์ os.makedirs()๋ก ์๋ ์์ฑ๋ฉ๋๋ค. ๋ฏธ๋ฆฌ ์๋์ผ๋ก ๋ง๋ค ํ์๋ ์์ต๋๋ค.
์ฝ๋ ํด์ค
์ฝ๋์ ํต์ฌ ๋ถ๋ถ์ ๋ฝ์์ ์ด๋ณด์๋ ์ดํดํ ์ ์๋๋ก ํ ์ค์ฉ ์์ธํ ํด์คํฉ๋๋ค. “์ฝ๋๋ ์ฝ์ ์ ์๋๋ฐ ๋ฌด์์ ํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค”๋ ๋ถ๋ถ์ ์์ ๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค.
โ ํผ์ ๊ฐ ์ ๋ ฅํ๊ธฐ๏ผfill()
page.fill("#user-name", "standard_user")
page.fill("#password", "secret_sauce")fill()์ ์
๋ ฅ ํผ์ ๋ฌธ์๋ฅผ ์
๋ ฅํ๋ Playwright ๋ฉ์๋์
๋๋ค. #user-name์ ๋ก๊ทธ์ธ ํ๋ฉด์ ์ฌ์ฉ์ ์ด๋ฆ ํ๋์ CSS ์
๋ ํฐ๋ก, HTML์ id="user-name"์ ๊ฐ๋ฆฌํต๋๋ค. Selenium์ send_keys()์ ํด๋นํ์ง๋ง ํ๋ ์ด๊ธฐํ์ ์
๋ ฅ์ ์๋์ผ๋ก ํจ๊ป ์ฒ๋ฆฌํด์ค๋๋ค.

โฒ ์๋ชป๋ ์ฌ์ฉ์ ์ด๋ฆยท๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ์ ๋์ ์๋ฌ ํ์๏ผTC-03๏ผ
โก ๋ฒํผ ํด๋ฆญ๏ผclick()
page.click("#login-button")click()์ ์ง์ ํ ์
๋ ํฐ์ ์์๋ฅผ ํด๋ฆญํ๋ ๋ฉ์๋์
๋๋ค. #login-button์ ๋ก๊ทธ์ธ ๋ฒํผ์ ID์
๋๋ค. Playwright๋ ์์๊ฐ ํ์๋์ด ํด๋ฆญ ๊ฐ๋ฅํ ์ํ๊ฐ ๋ ๋๊น์ง ์๋์ผ๋ก ๋๊ธฐํ ํ ํด๋ฆญํ๋ฏ๋ก Selenium์ฒ๋ผ ๋ช
์์ ์ธ ๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ณ๋๋ก ์์ฑํ ํ์๊ฐ ์์ต๋๋ค.
โข ํ์ด์ง ์ ํ ๋๊ธฐ๏ผwait_for_url()
page.wait_for_url("**/inventory.html", timeout=8000)wait_for_url()์ URL์ด ์ง์ ๋ ํจํด์ผ๋ก ๋ฐ๋ ๋๊น์ง ๋๊ธฐํ๋ ๋ฉ์๋์
๋๋ค. **๋ ์์ผ๋์นด๋๋ก ๋๋ฉ์ธ ๋ถ๋ถ์ ์๋ตํ ์ ์์ต๋๋ค. timeout=8000์ 8์ด ์ด๋ด์ ์ ํ๋์ง ์์ผ๋ฉด ํ์์์ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ์ค์ ์
๋๋ค. Selenium์ WebDriverWait + expected_conditions ์กฐํฉ์ด ์ด ํ ์ค๋ก ๋์ฒด๋ฉ๋๋ค.
โฃ ์์ ํํฐ๋ง๏ผfilter()
item = page.locator(".inventory_item").filter(has_text="Sauce Labs Backpack")
item.locator("button").click()locator()๋ก ์์๋ฅผ ์ทจ๋ํ๊ณ filter(has_text=...)๋ก ํน์ ํ
์คํธ๋ฅผ ํฌํจํ ์์๋ง ์ถ๋ ค๋
๋๋ค. ์ํ๋ช
์ผ๋ก ๋์ ์์ดํ
์ ํน์ ํ ํ ๊ทธ ์์ ๋ฒํผ์ ํด๋ฆญํ๋ ํ๋ฆ์
๋๋ค. ์ฌ๋ฌ ์ํ์ด ๋์ด๋๋ ๋ชฉ๋ก ํ๋ฉด์์์ ์กฐ์์ ๋งค์ฐ ํธ๋ฆฌํ ํจํด์
๋๋ค.
โค ๋์์ ์ฌ๋ก์ฐ๋ชจ์ ์ผ๋ก๏ผslow_mo
browser = p.chromium.launch(
headless=False,
slow_mo=800, # ๊ฐ ์กฐ์์ 800ms ์ง์ฐ
)slow_mo๋ Playwright ๊ณ ์ ์ ์ต์
์ผ๋ก, ๊ฐ ์กฐ์ ์ฌ์ด์ ๋ฐ๋ฆฌ์ด ๋จ์์ ์ง์ฐ์ ์ฝ์
ํฉ๋๋ค. ๋๋ฒ๊น
์๋ ๋์ ํ์ธ ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋์ผ๋ก ์ซ์ ์ ์์ด ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. CI/CD ํ๊ฒฝ์์๋ slow_mo=0๏ผ๊ธฐ๋ณธ๊ฐ๏ผ, ๋ก์ปฌ ํ์ธ ์์๋ slow_mo=800์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค๋ฌด ํฌ์ธํธ์
๋๋ค.
๐ก ์ค๋ฌด Tip๏ผPage Object Model๏ผPOM๏ผ์ ๋ํด
์ค๋ฌด์์๋ Page Object Model๏ผPOM๏ผ์ ์ฌ์ฉํด ํ
์คํธ ์ฝ๋์ ํ์ด์ง ์กฐ์์ ๋ถ๋ฆฌํ๋ ์ค๊ณ๊ฐ ๊ถ์ฅ๋ฉ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ํจ์ ๊ธฐ๋ฐ์ ๊ฐ๋จํ ๊ตฌ์ฑ์ด์ง๋ง, ํ
์คํธ ์ผ์ด์ค๊ฐ ๋์ด๋๋ฉด LoginPage / CartPage ๋ฑ์ ํด๋์ค์ ์กฐ์์ ๋ชจ์๋๋ ๊ฒ์ผ๋ก ์ ์ง๋ณด์์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
ํ ์คํธ ์คํ ๋ฐฉ๋ฒ
์คํ ๋ช ๋ น์ด
python test_saucedemo.py๐ก Tip๏ผํค๋๋ฆฌ์ค ๋ชจ๋๏ผ๋ธ๋ผ์ฐ์ ๋นํ์๏ผ๋ก ์คํํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ ์ฝ๋ ๋ด์ headless=False๋ฅผ headless=True๋ก ๋ณ๊ฒฝํ์ธ์. CI/CD ํ๊ฒฝ์์๋ True๊ฐ ๊ถ์ฅ๋ฉ๋๋ค.
ํ ์คํธ ๊ฒฐ๊ณผ
์คํํ๋ฉด ํฐ๋ฏธ๋์ ์น์
๋ณ ๊ฒฐ๊ณผ๊ฐ ์ค์๊ฐ์ผ๋ก ์ถ๋ ฅ๋๊ณ , ๋ง์ง๋ง์ ์ ์ฒด ํ
์คํธ์ ์์ฝ์ด ํ์๋ฉ๋๋ค. ์คํฌ๋ฆฐ์ท์ screenshots/ ํด๋์ ์๋ ์ ์ฅ๋ฉ๋๋ค.
==================================================
SauceDemo Automated Test Suite [Playwright]
Executed: 2025-07-01 10:00:00
==================================================
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
TC-02: Login Failure - Locked User
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Error message: Epic sadface: Sorry, this user has been locked out.
๐ธ screenshots/ss_03_locked_user_error.png
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
TC-09: Order Completion
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Completion message: Thank you for your order!
๐ธ screenshots/ss_10_order_complete.png
==================================================
Test Result Summary
==================================================
โ
PASS TC-02: Locked User Login Failure
โ Epic sadface: Sorry, this user has been locked out.
โ
PASS TC-03: Wrong Password Login Failure
โ Epic sadface: Username and password do not match...
โ
PASS TC-01: Login Success
โ //www.saucedemo.com/inventory.html
โ
PASS TC-04: Product List Display (6 items)
โ 6 items displayed
โ
PASS TC-05: Add 2 Items to Cart
โ Badge=2
โ
PASS TC-06: Cart Contents Verification
โ Cart=2 / Added=2
โ
PASS TC-07: Checkout Information Input
โ //www.saucedemo.com/checkout-step-two.html
โ
PASS TC-08: Order Summary Verification
โ 2 items / Total: $19.42
โ
PASS TC-09: Order Completion
โ Thank you for your order!
โ
PASS TC-10: Logout
โ Redirected to login page
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Total: 10 โ
10 Passed โ 0 Failed
Result: โ
All Tests PASSED ๐
==================================================์ ์ฒด 10๊ฐ ์ผ์ด์ค๊ฐ PASS๊ฐ ๋๋ฉด ์ฑ๊ณต์
๋๋ค. screenshots/ ํด๋์๋ 11์ฅ์ ์คํฌ๋ฆฐ์ท์ด ์๋ ์ ์ฅ๋์ด ์์ ๊ฒ์
๋๋ค.

โฒ ์ฅ๋ฐ๊ตฌ๋์ 2๊ฐ์ ์ํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ถ๊ฐ๋ ๊ฒ์ ํ์ธ๏ผTC-06๏ผ

โฒ ์ฃผ๋ฌธ ์์ฝ ํ๋ฉด. ์ํ ์ยท์๊ณยท์ธ๊ธยทํฉ๊ณ ๊ธ์ก์ ์๋ ๊ฒ์ฆ๏ผTC-08๏ผ

โฒ ใThank you for your order!ใ๊ฐ ํ์๋์ด ์ฃผ๋ฌธ ์๋ฃ๋ฅผ ํ์ธ๏ผTC-09๏ผ
๋ ๋ฐ์ ์ํค๋ ์์ด๋์ด
โก pytestํํ์ฌ ๋ณ๋ ฌ ์คํ
pytest-playwright์ ์กฐํฉํ๋ฉด ๋ณ๋ ฌ ์คํยทํ๋ผ๋ฏธํฐํ๊ฐ ๊ฐ๋จํ๊ฒ ์คํ๋ฉ๋๋ค.
๐น ๋์์ ๋ นํ ๊ธฐ๋ฅ
Playwright์๋ ํ์ค์ผ๋ก ๋
นํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. record_video_dir์ ์ค์ ํ๊ธฐ๋ง ํ๋ฉด ํ
์คํธ ์ ์ฒด๋ฅผ ๋์์์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
๐ Allure ๋ฆฌํฌํธ ์ฐ๋
allure-pytest๋ฅผ ์ฌ์ฉํ๋ฉด ์คํฌ๋ฆฐ์ท์ด ์ฒจ๋ถ๋ ๋ณด๊ธฐ ์ฌ์ด HTML ๋ฆฌํฌํธ๋ฅผ ์๋ ์์ฑํ ์ ์์ต๋๋ค.
๐ค CI/CD ์ฐ๋
GitHub Actions๋ Jenkins์ ํตํฉํด PR๋ง๋ค E2E ํ ์คํธ๋ฅผ ์๋ ์คํํ๋ ํ์ง ๊ฒ์ดํธ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๐ก ํ์ฉ ์๋๋ฆฌ์ค ๋ฐ ํ์ฅ ์์
- ๋งค ๋ฆด๋ฆฌ์ค ์ ํ๊ท ํ ์คํธ๋ก ์๋ ์คํ
- ์คํ ์ด์ง ํ๊ฒฝ์์์ ๊ตฌ๋งค ํ๋ก์ฐ ์ ์ฒด ์ ์ ๋์ ํ์ธ
- ์ฌ๋ฌ ์ฌ์ฉ์๏ผproblem_userใปperformance_glitch_user๏ผ์์์ ๋์ ๋น๊ต ํ ์คํธ
- ๋ นํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด ํ ์คํธ ์คํ ๋์์์ ์๋น๋์ค๋ก ์ ์ฅ
- pytestํํ์ฌ ํ ์คํธ ์ผ์ด์ค ํ๋ผ๋ฏธํฐํยท๋ณ๋ ฌ ์คํ์ผ๋ก ํ์ฅ
- Slack Webhook ์ฐ๋์ผ๋ก ํ ์คํธ ์คํจ ์ ์ฆ์ ์๋ฆผ
์ ๋ฆฌ
์ด ๊ธ์์๋ Playwright์ Python์ ์ฌ์ฉํด SauceDemo์ ๋ก๊ทธ์ธ๋ถํฐ ์ฃผ๋ฌธ ์๋ฃ๊น์ง์ E2E ํ ์คํธ๋ฅผ ์๋ํํ๋ ๋ฐฉ๋ฒ์ ํด์คํ์ต๋๋ค.
| ํฌ์ธํธ | ๋ด์ฉ |
|---|---|
| ํ ์คํธ ์ผ์ด์ค | ๋ค๊ฑฐํฐ๋ธ 2๊ฑด๏ผ๋ฉ์ธ ํ๋ก์ฐ 8๊ฑด ์ด 10์ผ์ด์ค |
| ๋๊ธฐ ์ฒ๋ฆฌ | wait_for_url๋ก ๊ฐ๋จํ๊ณ ํ์คํ๊ฒ ํ์ด์ง ์ ํ ๋๊ธฐ |
| ์คํฌ๋ฆฐ์ท | ์ ์ผ์ด์ค์์ ์๋ ์ ์ฅยทํ์ผ๋ช ์ผ๋ก ์ด๋ ํ๋ฉด์ธ์ง ํ๋์ ํ์ |
| ์์ฝ ์ถ๋ ฅ | results ๋ฆฌ์คํธ๋ก ์ ์ผ์ด์ค์ ํฉ๋ถ์ ์ผ๊ด ๊ด๋ฆฌยทํ์ |
| ์คํ ๋ชจ๋ | headless / slow_mo๋ก ๋ก์ปฌยทCI ํ๊ฒฝ์ ๊ตฌ๋ถํ์ฌ ์ฌ์ฉ |
์ค๋ฌด์์๋ ์ด E2E ํ ์คํธ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ๊ณ ๋ฐฐํฌ๋ง๋ค ๊ตฌ๋งค ํ๋ก์ฐ ์ ์ฒด๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋์ง ์๋ ๊ฒ์ฆํฉ๋๋ค. Playwright๋ Selenium๋ณด๋ค ๊ธฐ์ ์ด ๊ฐ๋จํ๊ณ , ๋ นํ ๊ธฐ๋ฅ์ด๋ slow_mo ๋ฑ ์ค๋ฌด์์ ์ ์ฉํ ๊ธฐ๋ฅ์ด ํ์ค ํ์ฌ๋์ด ์๋ ๊ฒ์ด ํฐ ๋งค๋ ฅ์ ๋๋ค.
์์ค ์ฝ๋๋ GitHub์ ๊ณต๊ฐ๋์ด ์์ผ๋ ๊ผญ ์ง์ ์คํํด๋ณด์ธ์๏ผ

