Python API ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€์ด๋“œ๏ฝœpytestใƒปrequests๋ฅผ pip installํ•ด์„œ ๋™์ž‘ ํ™•์ธ๊นŒ์ง€

ํ…Œ์ŠคํŠธ ์ž๋™ํ™”

๐Ÿ“Œ ์ด ๊ธ€์€ ์ด๋Ÿฐ ๋ถ„๊ป˜ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค

  • Python์œผ๋กœ API ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹ถ์€ ๋ถ„
  • pip install๋กœ ๋ฌด์—‡์„ ์„ค์น˜ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๋ถ„
  • ๊ฐ€์ƒ ํ™˜๊ฒฝ๏ผˆvenv๏ผ‰์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ๋ถ„
  • pytestใƒปrequestsใƒปPlaywright๋ฅผ ์‚ฌ์šฉํ•œ API ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์€ ๋ถ„

โœ… ์ด ๊ธ€์„ ์ฝ์œผ๋ฉด ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • API ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„ค์น˜ ์ปค๋งจ๋“œ
  • ๊ฐ€์ƒ ํ™˜๊ฒฝ๏ผˆvenv๏ผ‰์„ ์‚ฌ์šฉํ•œ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ๋ฐฉ๋ฒ•
  • pytest.ini ์„ค์ •์œผ๋กœ HTML ๋ฆฌํฌํŠธ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์„ค์น˜ ํ›„ ๋™์ž‘ ํ™•์ธ๊นŒ์ง€์˜ ์ผ๋ จ์˜ ํ๋ฆ„

๐Ÿ‘จโ€๐Ÿ’ป ํ•„์ž ์†Œ๊ฐœ

QA ์—”์ง€๋‹ˆ์–ด๋กœ์„œ ์‹ค๋ฌด์—์„œ Pythonใƒปpytestใƒปrequests๋ฅผ ์‚ฌ์šฉํ•œ API ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ๊ธ€์—์„œ ์†Œ๊ฐœํ•˜๋Š” ํ™˜๊ฒฝ ๊ตฌ์ถ• ์ ˆ์ฐจ๋Š” ์‹ค์ œ ์—…๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, GitHub์— ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๊ณต๊ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Python์œผ๋กœ API ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ใ€Œpytest๋‚˜ requests๋Š” ๋ฌด์—‡์„ ์„ค์น˜ํ•˜๋ฉด ๋˜๋‚˜์š”?ใ€ใ€Œ๊ฐ€์ƒ ํ™˜๊ฒฝ์€ ํ•„์š”ํ•œ๊ฐ€์š”?ใ€๋ผ๊ณ  ๊ณ ๋ฏผํ•˜๋Š” ๋ถ„๋“ค์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋ง‰ํžˆ๊ธฐ ์‰ฌ์šด ๊ฒƒ์ด ํ™˜๊ฒฝ ๊ตฌ์ถ•์ž…๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Python์œผ๋กœ API ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๋ถ€ํ„ฐ ๋™์ž‘ ํ™•์ธ๊นŒ์ง€๋ฅผ ๊ผผ๊ผผํ•˜๊ฒŒ ํ•ด์„คํ•ฉ๋‹ˆ๋‹ค. ์ปค๋งจ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ํ™˜๊ฒฝ์ด ๊ฐ–์ถฐ์ง‘๋‹ˆ๋‹ค.


  1. 00. Python API ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ผ๋žŒ
  2. 01. ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ๏ผˆ๊ถŒ์žฅ๏ผ‰
    1. ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
  3. 02. pip install๋กœ Python API ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
    1. โ‘  requests ๊ธฐ๋ฐ˜์˜ ๊ฒฝ์šฐ๏ผˆ์‹ฌํ”Œ ๊ตฌ์„ฑ๏ผ‰
    2. โ‘ก Playwright ๊ธฐ๋ฐ˜์˜ ๊ฒฝ์šฐ๏ผˆUI+API ๋ชจ๋‘ ๋Œ€์‘๏ผ‰
  4. 03. ์„ค์น˜ ํ™•์ธ
    1. ๋ฒ„์ „ ํ™•์ธ ์ปค๋งจ๋“œ
    2. ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋œ ๊ฒฝ์šฐ์˜ ํ‘œ์‹œ
  5. 04. HTML ๋ฆฌํฌํŠธ ์ž๋™ ์ƒ์„ฑ์„ ์œ„ํ•œ pytest.ini ์„ค์ •
    1. ํด๋” ๊ตฌ์„ฑ
    2. pytest.ini ๋‚ด์šฉ
    3. ์„ค์ • ํ›„ ์‹คํ–‰ ๋ฐฉ๋ฒ•
  6. 05. ๋™์ž‘ ํ™•์ธ ํ…Œ์ŠคํŠธ
    1. ์„ฑ๊ณต ์‹œ ์ถœ๋ ฅ
  7. 06. ์ž์ฃผ ๊ฒช๋Š” ๋ฌธ์ œ & ํ•ด๊ฒฐ๋ฒ•
    1. โ‘  pip install ํ›„์— import ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
    2. โ‘ก ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™œ์„ฑํ™”๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฐ๋‹ค
    3. โ‘ข playwright install์„ ์žŠ์–ด์„œ ๋ธŒ๋ผ์šฐ์ € ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
    4. โ‘ฃ pytest-html ์—†์ด –html ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค
    5. โ‘ค requirements.txt๋กœ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•œ๋‹ค
  8. 07. ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ๏ผˆFAQ๏ผ‰
  9. 08. ์ •๋ฆฌ

00. Python API ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ผ๋žŒ

API ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํฌ๊ฒŒ 3์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—ญํ• ์šฉ๋„
requestsHTTP ํด๋ผ์ด์–ธํŠธAPI์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค
pytestํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ใƒป๊ด€๋ฆฌํ•œ๋‹ค
pytest-html๋ฆฌํฌํŠธ ์ƒ์„ฑHTML ๋ฆฌํฌํŠธ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค
playwright๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”UI ํ…Œ์ŠคํŠธ๏ผˆE2E ํ…Œ์ŠคํŠธ๏ผ‰๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. API ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ๋„ ์ด์šฉ ๊ฐ€๋Šฅ.
pytest-playwrightpytest ์—ฐ๋™Playwright๋ฅผ pytest์˜ Fixture๋กœ ์‚ฌ์šฉ

๐Ÿ’ก ํฌ์ธํŠธ๏ผšrequests์™€ Playwright๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ์œผ๋กœ OK์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ API ํ…Œ์ŠคํŠธ๋งŒ ํ•œ๋‹ค๋ฉด requests, UI ํ…Œ์ŠคํŠธ์™€ ์กฐํ•ฉํ•œ๋‹ค๋ฉด Playwright ๋ฅผ ์„ ํƒํ•˜์„ธ์š”.


01. ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ๏ผˆ๊ถŒ์žฅ๏ผ‰

๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋จผ์ € ์„ค์ •ํ•ด๋‘๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”

# ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ
python -m venv venv

# ํ™œ์„ฑํ™”๏ผˆWindows๏ผ‰
venv\Scripts\activate

# ํ™œ์„ฑํ™”๏ผˆMac/Linux๏ผ‰
source venv/bin/activate

ํ™œ์„ฑํ™”ํ•˜๋ฉด ํ„ฐ๋ฏธ๋„ ์•ž์— (venv) ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

(venv) PS C:\Users\HP\Desktop\upwork>

๐Ÿ’ก ํฌ์ธํŠธ๏ผš๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•œ ์ƒํƒœ์—์„œ ์„ค์น˜ํ•˜๋ฉด ๊ทธ ํ”„๋กœ์ ํŠธ์—๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๋Š” deactivate ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


02. pip install๋กœ Python API ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

โ‘  requests ๊ธฐ๋ฐ˜์˜ ๊ฒฝ์šฐ๏ผˆ์‹ฌํ”Œ ๊ตฌ์„ฑ๏ผ‰

pip install requests pytest pytest-html

โ‘ก Playwright ๊ธฐ๋ฐ˜์˜ ๊ฒฝ์šฐ๏ผˆUI+API ๋ชจ๋‘ ๋Œ€์‘๏ผ‰

pip install playwright pytest pytest-playwright pytest-html
playwright install chromium

โš ๏ธ ์ฃผ์˜๏ผšplaywright install chromium ์€ ๋ธŒ๋ผ์šฐ์ € ๋‹ค์šด๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ดˆ์—๋Š” ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. API ํ…Œ์ŠคํŠธ๋งŒ์ด๋ผ๋ฉด ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜์ค‘์— UI ํ…Œ์ŠคํŠธ์™€ ์กฐํ•ฉํ•  ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์„ค์น˜ํ•ด๋‘๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


03. ์„ค์น˜ ํ™•์ธ

๋ฒ„์ „ ํ™•์ธ ์ปค๋งจ๋“œ

# pytest ๋ฒ„์ „ ํ™•์ธ
pytest --version

# requests ๋ฒ„์ „ ํ™•์ธ
python -c "import requests; print(requests.__version__)"

# playwright ๋ฒ„์ „ ํ™•์ธ
playwright --version

์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋œ ๊ฒฝ์šฐ์˜ ํ‘œ์‹œ

pytest 9.0.2
2.32.3
Version 1.50.0

๐Ÿ’ก ํฌ์ธํŠธ๏ผš๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ์„ค์น˜ ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜จ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ ์„น์…˜์˜ ์ž์ฃผ ๊ฒช๋Š” ๋ฌธ์ œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.


04. HTML ๋ฆฌํฌํŠธ ์ž๋™ ์ƒ์„ฑ์„ ์œ„ํ•œ pytest.ini ์„ค์ •

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— pytest.ini ๋ฅผ ์ž‘์„ฑํ•ด๋‘๋ฉด ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋•Œ๋งˆ๋‹ค HTML ๋ฆฌํฌํŠธ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋˜์–ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํด๋” ๊ตฌ์„ฑ

project/
โ”œโ”€โ”€ pytest.ini        โ† ์—ฌ๊ธฐ์— ์ž‘์„ฑ
โ”œโ”€โ”€ test_api.py
โ””โ”€โ”€ report.html       โ† ์‹คํ–‰ ํ›„ ์ž๋™ ์ƒ์„ฑ๋จ

pytest.ini ๋‚ด์šฉ

# pytest.ini
[pytest]
addopts = --html=report.html --self-contained-html

์„ค์ • ํ›„ ์‹คํ–‰ ๋ฐฉ๋ฒ•

# ์ด ์ปค๋งจ๋“œ๋งŒ์œผ๋กœ HTML ๋ฆฌํฌํŠธ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค
pytest test_api.py -v

๐Ÿ’ก ํฌ์ธํŠธ๏ผš--self-contained-html ์„ ๋ถ™์ด๋ฉด CSS๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ HTML์— ๋‚ด์žฅ๋˜์–ด ํŒŒ์ผ ํ•˜๋‚˜๋กœ ์™„๊ฒฐ๋ฉ๋‹ˆ๋‹ค. GitHub๋‚˜ ํด๋ผ์ด์–ธํŠธ์™€์˜ ๊ณต์œ ๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.


05. ๋™์ž‘ ํ™•์ธ ํ…Œ์ŠคํŠธ

ํ™˜๊ฒฝ ๊ตฌ์ถ•์ด ์™„๋ฃŒ๋˜๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋กœ ๋™์ž‘ ํ™•์ธ์„ ํ•ด๋ด…์‹œ๋‹ค.

# test_check.py
import requests

def test_environment_check():
    """ํ™˜๊ฒฝ ๊ตฌ์ถ• ๋™์ž‘ ํ™•์ธ ํ…Œ์ŠคํŠธ"""
    response = requests.get("https://jsonplaceholder.typicode.com/users/1")

    assert response.status_code == 200
    assert response.json()["id"] == 1
    print("\nโœ… ํ™˜๊ฒฝ ๊ตฌ์ถ• ์„ฑ๊ณต๏ผAPI ํ…Œ์ŠคํŠธ๊ฐ€ ๋™์ž‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค")
# ์‹คํ–‰ ์ปค๋งจ๋“œ
pytest test_check.py -v -s

์„ฑ๊ณต ์‹œ ์ถœ๋ ฅ

test_check.py::test_environment_check
โœ… ํ™˜๊ฒฝ ๊ตฌ์ถ• ์„ฑ๊ณต๏ผAPI ํ…Œ์ŠคํŠธ๊ฐ€ ๋™์ž‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
PASSED

1 passed in 1.23s โœ…

๐Ÿ’ก ํฌ์ธํŠธ๏ผš-s ์˜ต์…˜์„ ๋ถ™์ด๋ฉด print() ์˜ ์ถœ๋ ฅ์ด ํ„ฐ๋ฏธ๋„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋™์ž‘ ํ™•์ธ ์‹œ์— ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


06. ์ž์ฃผ ๊ฒช๋Š” ๋ฌธ์ œ & ํ•ด๊ฒฐ๋ฒ•

๊ตฌํ˜„ ์ค‘ ์‹ค์ œ๋กœ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ๋“ค์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ณณ์—์„œ ๋ง‰ํžˆ๋Š” ๋ถ„๋“ค๊ป˜ ๋„์›€์ด ๋˜๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.


โ‘  pip install ํ›„์— import ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

์„ค์น˜ํ–ˆ์„ ํ…๋ฐ ModuleNotFoundError ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›์ธ์€ ์—ฌ๋Ÿฌ Python์ด ์„ค์น˜๋˜์–ด ์žˆ๊ณ  pip์™€ python์ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

# โŒ pip์™€ python์ด ๋‹ค๋ฅธ ๋ฒ„์ „์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ
pip install requests   # Python3.11์— ์„ค์น˜
python test.py         # Python3.9๋กœ ์‹คํ–‰ โ†’ ModuleNotFoundError
# โœ… python -m pip๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ Python์— ํ™•์‹คํžˆ ์„ค์น˜๋จ
python -m pip install requests

๐Ÿ’ก ํฌ์ธํŠธ๏ผšpip ๋Œ€์‹  python -m pip ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰ ์ค‘์ธ Python๊ณผ ๊ฐ™์€ ํ™˜๊ฒฝ์— ์„ค์น˜๋˜์–ด ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค.


โ‘ก ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™œ์„ฑํ™”๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฐ๋‹ค

๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ํ™œ์„ฑํ™”๋ฅผ ์žŠ๊ณ  ๊ธ€๋กœ๋ฒŒ ํ™˜๊ฒฝ์— ์„ค์น˜ํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ ์žˆ์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„ ์•ž์„ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด์„ธ์š”.

# โŒ ๊ฐ€์ƒ ํ™˜๊ฒฝ์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ
PS C:\upwork> pip install requests  # ๊ธ€๋กœ๋ฒŒ์— ์„ค์น˜๋˜์–ด๋ฒ„๋ฆผ

# โœ… (venv)๊ฐ€ ์•ž์— ๋ถ™์–ด ์žˆ์œผ๋ฉด OK
(venv) PS C:\upwork> pip install requests

โš ๏ธ ์ฃผ์˜๏ผšVSCode๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ„ฐ๋ฏธ๋„์„ ์ƒˆ๋กœ ์—ด ๋•Œ๋งˆ๋‹ค ๊ฐ€์ƒ ํ™˜๊ฒฝ์ด ๋น„ํ™œ์„ฑํ™”๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. .vscode/settings.json ์— ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โ‘ข playwright install์„ ์žŠ์–ด์„œ ๋ธŒ๋ผ์šฐ์ € ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

pip install playwright ๋งŒ์œผ๋กœ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์•„ ์‹คํ–‰ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

# โŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—†๋Š” ์ƒํƒœ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜
# playwright._impl._errors.Error: Executable doesn't exist

# โœ… ๋ธŒ๋ผ์šฐ์ €๋„ ๋ณ„๋„ ์„ค์น˜๊ฐ€ ํ•„์š”
pip install playwright
playwright install chromium  โ† ์ด๊ฒƒ๋„ ํ•„์š”!

๐Ÿ’ก ํฌ์ธํŠธ๏ผšAPI ํ…Œ์ŠคํŠธ๋งŒ์ด๋ผ๋ฉด playwright install ์€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. UI ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ด์ง„ ํƒ€์ด๋ฐ์— ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


โ‘ฃ pytest-html ์—†์ด –html ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค

pytest.ini ์— --html=report.html ์„ ์ž‘์„ฑํ•ด๋„ pytest-html ์ด ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

# โŒ pytest-html ์—†์ด ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜
# ERROR: unrecognized arguments: --html=report.html

# โœ… pytest-html์„ ์„ค์น˜ํ•˜๊ณ  ๋‚˜์„œ ์‹คํ–‰
pip install pytest-html
pytest test_api.py -v

๐Ÿ’ก ํฌ์ธํŠธ๏ผšํ•œ๊บผ๋ฒˆ์— ์„ค์น˜ํ•ด๋‘๋ฉด ์žŠ์–ด๋ฒ„๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. pip install requests pytest pytest-html ์„ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•˜์„ธ์š”.


โ‘ค requirements.txt๋กœ ํ™˜๊ฒฝ์„ ๊ณต์œ ํ•œ๋‹ค

ํŒ€์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ๋‹ค๋ฅธ PC์—์„œ ๊ฐ™์€ ํ™˜๊ฒฝ์„ ์žฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๋Š” requirements.txt ๋ฅผ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

# ํ˜„์žฌ ํ™˜๊ฒฝ์„ requirements.txt์— ๋‚ด๋ณด๋‚ด๊ธฐ
pip freeze > requirements.txt

# requirements.txt์—์„œ ์ผ๊ด„ ์„ค์น˜
pip install -r requirements.txt

๐Ÿ’ก ํฌ์ธํŠธ๏ผšGitHub์— ์ฝ”๋“œ๋ฅผ ์—…๋กœ๋“œํ•  ๋•Œ requirements.txt ๋„ ํ•จ๊ป˜ ์ปค๋ฐ‹ํ•ด๋‘๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ฐ”๋กœ ๊ฐ™์€ ํ™˜๊ฒฝ์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌํŠธํด๋ฆฌ์˜ค๋กœ์„œ์˜ ์™„์„ฑ๋„๋„ ๋†’์•„์ง‘๋‹ˆ๋‹ค.


07. ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ๏ผˆFAQ๏ผ‰

Q. Python ๋ฒ„์ „์€ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‚˜์š”๏ผŸ
A. Python 3.9 ์ด์ƒ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด Python 3.11 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ pytest 9๋Š” Python 3.9 ์ด์ƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. python --version ์œผ๋กœ ํ˜„์žฌ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q. ๊ฐ€์ƒ ํ™˜๊ฒฝ์€ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”๏ผŸ
A. ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๊ณ  ๋‚˜์ค‘์— ํ™˜๊ฒฝ์ด ๋ง๊ฐ€์ง€๋Š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ๋‘๋ฉด ์•ˆ์‹ฌ์ž…๋‹ˆ๋‹ค.

Q. requests์™€ Playwright ์–ด๋А ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‚˜์š”๏ผŸ
A. API ํ…Œ์ŠคํŠธ๋งŒ์ด๋ผ๋ฉด requests, UI ํ…Œ์ŠคํŠธ์™€ API ํ…Œ์ŠคํŠธ๋ฅผ ๋‘˜ ๋‹ค ํ•œ๋‹ค๋ฉด Playwright ๊ฐ€ ์ถ”์ฒœ์ž…๋‹ˆ๋‹ค. UI์™€ API ๋ชจ๋‘ ์ปค๋ฒ„ํ•˜๋Š” ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด Playwright๋กœ ํ†ต์ผํ•˜๋ฉด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์‹ฌํ”Œํ•ด์ง‘๋‹ˆ๋‹ค.

Q. pip install์ด ๋А๋ฆฐ๋ฐ์š”๏ผŸ
A. ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. pip install --upgrade pip ๋กœ pip ์ž์ฒด๋ฅผ ์ตœ์‹ ์œผ๋กœ ํ•˜๋ฉด ๊ฐœ์„ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ pip install -i https://pypi.org/simple/ requests ์ฒ˜๋Ÿผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Q. requirements.txt์™€ pyproject.toml ์–ด๋А ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‚˜์š”๏ผŸ
A. ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ํ•™์Šต์šฉ์ด๋ผ๋ฉด requirements.txt ๊ฐ€ ์‹ฌํ”Œํ•ด์„œ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํŒ€ ๊ฐœ๋ฐœ์ด๋‚˜ ๋ณธ๊ฒฉ์ ์ธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด pyproject.toml๏ผˆPoetry ๋“ฑ๏ผ‰๋ฅผ ๊ฒ€ํ† ํ•ด๋ณด์„ธ์š”. ํฌํŠธํด๋ฆฌ์˜ค์šฉ์œผ๋กœ๋Š” requirements.txt ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.


08. ์ •๋ฆฌ

Python์œผ๋กœ API ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ, ๋จผ์ € ํ™˜๊ฒฝ ๊ตฌ์ถ•์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. pytest์™€ requests๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๋ฉด ๋ฐ”๋กœ API ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Python API ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๊ตฌ์ถ• ์ ˆ์ฐจ๋ฅผ ํ•ด์„คํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹จ๊ณ„์ปค๋งจ๋“œ
๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑpython -m venv venv
๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™œ์„ฑํ™”venv\Scripts\activate๏ผˆWindows๏ผ‰
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜pip install requests pytest pytest-html
pytest.ini ์„ค์ •addopts = --html=report.html --self-contained-html
๋™์ž‘ ํ™•์ธpytest test_check.py -v -s

ํ™˜๊ฒฝ ๊ตฌ์ถ•์€ ํ•œ ๋ฒˆ ํ•ด๋‘๋ฉด ์ดํ›„๋Š” ์พŒ์ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑใƒป๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ใƒปpytest.ini ์„ค์ •์˜ 3๋‹จ๊ณ„๋ฅผ ์ตํ˜€๋‘๋ฉด ๋ฐ”๋กœ API ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๐Ÿ’ช

์ œ๋ชฉ๊ณผ URL์„ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค