ํจ์จ์ ์ด๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ํ ์คํธ๋ฅผ ์ํด pytest fixtures๋ฅผ ๋ง์คํฐํ์ธ์. ์์กด์ฑ ์ฃผ์ ์๋ฆฌ์ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ํตํด ๊ฐ๋ ฅํ๊ณ ์ ๋ขฐํ ์ ์๋ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์.
Pytest Fixtures: ๊ฐ๋ ฅํ ํ ์คํธ๋ฅผ ์ํ ์์กด์ฑ ์ฃผ์
์ํํธ์จ์ด ๊ฐ๋ฐ ์์ญ์์ ๊ฐ๋ ฅํ๊ณ ์ ๋ขฐํ ์ ์๋ ํ ์คํธ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ธ๊ธฐ ์๋ Python ํ ์คํธ ํ๋ ์์ํฌ์ธ Pytest๋ fixtures๋ผ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ํ ์คํธ ์ค์ ๋ฐ ํด์ฒด๋ฅผ ๋จ์ํํ๊ณ , ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ฉฐ, ํ ์คํธ ์ ์ง ๊ด๋ฆฌ๋ฅผ ํฅ์์ํต๋๋ค. ์ด ๊ธฐ์ฌ์์๋ pytest fixtures์ ๊ฐ๋ ์ ์์ธํ ์ดํด๋ณด๊ณ ์์กด์ฑ ์ฃผ์ ์์์ ์ญํ ์ ํ๊ตฌํ๋ฉฐ, ํจ๊ณผ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Pytest Fixtures๋ ๋ฌด์์ธ๊ฐ์?
ํต์ฌ์ ์ผ๋ก pytest fixtures๋ ํ ์คํธ๊ฐ ์์ ์ ์ด๊ณ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋ ์ ์๋๋ก ๊ณ ์ ๋ ๊ธฐ์ค์ ์ ์ ๊ณตํ๋ ํจ์์ ๋๋ค. ์ด๋ ์์กด์ฑ ์ฃผ์ ๋ฉ์ปค๋์ฆ ์ญํ ์ ํ๋ฉฐ, ์ฌ๋ฌ ํ ์คํธ ํจ์์์ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค ๋๋ ๊ตฌ์ฑ์ ์ ์ํ ์ ์๋๋ก ํฉ๋๋ค. ํ ์คํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์คํํ๋ ๋ฐ ํ์ํ ํ๊ฒฝ์ ์ค๋นํ๋ ๊ณต์ฅ์ด๋ผ๊ณ ์๊ฐํ์ธ์.
unittest
์ setUp
๋ฐ tearDown
๊ณผ ๊ฐ์ ๊ธฐ์กด ์ค์ ๋ฐ ํด์ฒด ๋ฐฉ๋ฒ๊ณผ ๋ฌ๋ฆฌ, pytest fixtures๋ ๋ ํฐ ์ ์ฐ์ฑ, ๋ชจ๋์ฑ ๋ฐ ์ฝ๋ ๊ตฌ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์กด์ฑ์ ๋ช
์์ ์ผ๋ก ์ ์ํ๊ณ ๊นจ๋ํ๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ์์ผ๋ก ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์์กด์ฑ ์ฃผ์ ์ค๋ช
์์กด์ฑ ์ฃผ์ ์ ๊ตฌ์ฑ ์์๊ฐ ์์ฒด์ ์ผ๋ก ์์ฑํ๋ ๋์ ์ธ๋ถ ์์ค์์ ์ข ์์ฑ์ ๋ฐ๋ ๋์์ธ ํจํด์ ๋๋ค. ์ด๋ ๋์จํ ๊ฒฐํฉ์ ์ด์งํ์ฌ ์ฝ๋๋ฅผ ๋ ๋ชจ๋ํํ๊ณ , ํ ์คํธ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ํ ์คํธ์ ๋งฅ๋ฝ์์ ์์กด์ฑ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ค์ ์ข ์์ฑ์ ๋ชจ์ ๊ฐ์ฒด ๋๋ ํ ์คํธ ๋๋ธ๋ก ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์์ผ๋ฏ๋ก ์ฝ๋์ ๊ฐ๋ณ ๋จ์๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ํ ์คํธํ ์ ์์ต๋๋ค.
Pytest fixtures๋ ํ ์คํธ ํจ์๊ฐ ์ข ์์ฑ์ ์ ์ธํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์์กด์ฑ ์ฃผ์ ์ ์ํํ๊ฒ ์ด์งํฉ๋๋ค. ํ ์คํธ ํจ์๊ฐ fixture๋ฅผ ์์ฒญํ๋ฉด pytest๋ ์๋์ผ๋ก fixture ํจ์๋ฅผ ์คํํ๊ณ ํด๋น ๋ฐํ ๊ฐ์ ํ ์คํธ ํจ์์ ์ธ์๋ก ์ฃผ์ ํฉ๋๋ค.
Pytest Fixtures๋ฅผ ์ฌ์ฉํ๋ฉด ์ป์ ์ ์๋ ์ด์
ํ ์คํธ ์ํฌํ๋ก์์ pytest fixtures๋ฅผ ํ์ฉํ๋ฉด ๋ง์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
- ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ: Fixtures๋ ์ฌ๋ฌ ํ ์คํธ ํจ์์์ ์ฌ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ฝ๋ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ์ผ๊ด์ฑ์ ๋์ ๋๋ค.
- ํ ์คํธ ์ ์ง ๊ด๋ฆฌ์ฑ: ์ข ์์ฑ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋จ์ผ ์์น(fixture ์ ์)์์ ์ด๋ฃจ์ด์ง ์ ์์ผ๋ฏ๋ก ์ค๋ฅ ์ํ์ ์ค์ด๊ณ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋จ์ํํฉ๋๋ค.
- ํฅ์๋ ๊ฐ๋ ์ฑ: Fixtures๋ ํ ์คํธ ํจ์๊ฐ ๋ช ์์ ์ผ๋ก ์ข ์์ฑ์ ์ ์ธํ๋ฏ๋ก ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ง์คํ ์ ์๊ฒ ํด์ค๋๋ค.
- ๋จ์ํ๋ ์ค์ ๋ฐ ํด์ฒด: Fixtures๋ ์ค์ ๋ฐ ํด์ฒด ๋ ผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ํ ์คํธ ํจ์์์ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ ๋๋ค.
- ๋งค๊ฐ๋ณ์ํ: Fixtures๋ ๋งค๊ฐ๋ณ์ํํ ์ ์์ผ๋ฏ๋ก ๋ค์ํ ์ ๋ ฅ ๋ฐ์ดํฐ ์งํฉ์ผ๋ก ํ ์คํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
- ์์กด์ฑ ๊ด๋ฆฌ: Fixtures๋ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๋ช ํํ๊ณ ๋ช ์์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ํ ์คํธ ํ๊ฒฝ์ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ดํ ์ ์๋๋ก ํฉ๋๋ค.
๊ธฐ๋ณธ Fixture ์์
๊ฐ๋จํ ์์ ๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๋ ํจ์๋ฅผ ํ ์คํธํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์์ฑํ๊ณ ๊ตฌ์ฑํ๋ fixture๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
import pytest
import sqlite3
@pytest.fixture
def db_connection():
# Setup: create a database connection
conn = sqlite3.connect(':memory:') # Use an in-memory database for testing
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT,
email TEXT
)
""")
conn.commit()
# Provide the connection object to the tests
yield conn
# Teardown: close the connection
conn.close()
def test_add_user(db_connection):
cursor = db_connection.cursor()
cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ('John Doe', 'john.doe@example.com'))
db_connection.commit()
cursor.execute("SELECT * FROM users WHERE name = ?", ('John Doe',))
result = cursor.fetchone()
assert result is not None
assert result[1] == 'John Doe'
assert result[2] == 'john.doe@example.com'
์ด ์์ ์์๋:
@pytest.fixture
๋ฐ์ฝ๋ ์ดํฐ๋db_connection
ํจ์๋ฅผ fixture๋ก ํ์ํฉ๋๋ค.- fixture๋ ๋ฉ๋ชจ๋ฆฌ ๋ด SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์์ฑํ๊ณ ,
users
ํ ์ด๋ธ์ ๋ง๋ค๊ณ , ์ฐ๊ฒฐ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. yield
๋ฌธ์ ์ค์ ๋ฐ ํด์ฒด ๋จ๊ณ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค.yield
์์ ์ฝ๋๋ ํ ์คํธ ์ ์ ์คํ๋๊ณ ,yield
๋ค์ ์ฝ๋๋ ํ ์คํธ ํ์ ์คํ๋ฉ๋๋ค.test_add_user
ํจ์๋db_connection
fixture๋ฅผ ์ธ์๋ก ์์ฒญํฉ๋๋ค.- Pytest๋ ํ
์คํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ์๋์ผ๋ก
db_connection
fixture๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ฐ์ฒด๋ฅผ ํ ์คํธ ํจ์์ ์ ๊ณตํฉ๋๋ค. - ํ ์คํธ๊ฐ ์๋ฃ๋ ํ pytest๋ fixture์์ ํด์ฒด ์ฝ๋๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋ซ์ต๋๋ค.
Fixture ๋ฒ์
Fixtures๋ ์คํ ๋น๋๋ฅผ ๊ฒฐ์ ํ๋ ๋ค์ํ ๋ฒ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- function (๊ธฐ๋ณธ๊ฐ): Fixture๋ ํ ์คํธ ํจ์๋น ํ ๋ฒ ์คํ๋ฉ๋๋ค.
- class: Fixture๋ ํ ์คํธ ํด๋์ค๋น ํ ๋ฒ ์คํ๋ฉ๋๋ค.
- module: Fixture๋ ๋ชจ๋๋น ํ ๋ฒ ์คํ๋ฉ๋๋ค.
- session: Fixture๋ ํ ์คํธ ์ธ์ ๋น ํ ๋ฒ ์คํ๋ฉ๋๋ค.
scope
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ fixture ๋ฒ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
import pytest
@pytest.fixture(scope="module")
def module_fixture():
# Setup code (executed once per module)
print("Module setup")
yield
# Teardown code (executed once per module)
print("Module teardown")
def test_one(module_fixture):
print("Test one")
def test_two(module_fixture):
print("Test two")
์ด ์์ ์์ module_fixture
๋ ์์ฒญํ๋ ํ
์คํธ ํจ์ ์์ ๊ด๊ณ์์ด ๋ชจ๋๋น ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
Fixture ๋งค๊ฐ๋ณ์ํ
Fixtures๋ ๋ค์ํ ์ ๋ ฅ ๋ฐ์ดํฐ ์งํฉ์ผ๋ก ํ ์คํธ๋ฅผ ์คํํ๋๋ก ๋งค๊ฐ๋ณ์ํํ ์ ์์ต๋๋ค. ์ด๋ ๋์ผํ ์ฝ๋๋ฅผ ๋ค๋ฅธ ๊ตฌ์ฑ ๋๋ ์๋๋ฆฌ์ค๋ก ํ ์คํธํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
import pytest
@pytest.fixture(params=[1, 2, 3])
def number(request):
return request.param
def test_number(number):
assert number > 0
์ด ์์ ์์ number
fixture๋ ๊ฐ 1, 2, 3์ผ๋ก ๋งค๊ฐ๋ณ์ํ๋ฉ๋๋ค. test_number
ํจ์๋ number
fixture์ ๊ฐ ๊ฐ์ ๋ํด ํ ๋ฒ์ฉ ์ธ ๋ฒ ์คํ๋ฉ๋๋ค.
pytest.mark.parametrize
๋ฅผ ์ฌ์ฉํ์ฌ ํ
์คํธ ํจ์๋ฅผ ์ง์ ๋งค๊ฐ๋ณ์ํํ ์๋ ์์ต๋๋ค.
import pytest
@pytest.mark.parametrize("number", [1, 2, 3])
def test_number(number):
assert number > 0
์ด๊ฒ์ ๋งค๊ฐ๋ณ์ํ๋ fixture๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง๋ง ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ๋ ํธ๋ฆฌํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
`request` ๊ฐ์ฒด ์ฌ์ฉ
fixture ํจ์์์ ์ธ์๋ก ์ฌ์ฉํ ์ ์๋ `request` ๊ฐ์ฒด๋ fixture๋ฅผ ์์ฒญํ๋ ํ ์คํธ ํจ์์ ๋ํ ๋ค์ํ ์ปจํ ์คํธ ์ ๋ณด์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. `FixtureRequest` ํด๋์ค์ ์ธ์คํด์ค์ด๋ฉฐ fixture๊ฐ ๋ค์ํ ํ ์คํธ ์๋๋ฆฌ์ค์ ๋ ๋์ ์ด๊ณ ์ ์ํ ์ ์๋๋ก ํฉ๋๋ค.
`request` ๊ฐ์ฒด์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ
์คํธ ํจ์ ์ด๋ฆ ์ก์ธ์ค:
request.function.__name__
์ fixture๋ฅผ ์ฌ์ฉํ๋ ํ ์คํธ ํจ์์ ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค. - ๋ชจ๋ ๋ฐ ํด๋์ค ์ ๋ณด ์ก์ธ์ค:
request.module
๋ฐrequest.cls
๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ํจ์๊ฐ ํฌํจ๋ ๋ชจ๋ ๋ฐ ํด๋์ค์ ์ก์ธ์คํ ์ ์์ต๋๋ค. - Fixture ๋งค๊ฐ๋ณ์ ์ก์ธ์ค: ๋งค๊ฐ๋ณ์ํ๋ fixture๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
request.param
์ ์ฌ์ฉํ๋ฉด ํ์ฌ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. - ๋ช
๋ น์ค ์ต์
์ก์ธ์ค:
request.config.getoption()
์ ์ฌ์ฉํ์ฌ pytest์ ์ ๋ฌ๋ ๋ช ๋ น์ค ์ต์ ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์ ์ง์ ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก fixtures๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. - Finalizer ์ถ๊ฐ:
request.addfinalizer(finalizer_function)
์ ์ฌ์ฉํ๋ฉด ํ ์คํธ๊ฐ ํต๊ณผํ๋์ง ์คํจํ๋์ง์ ๊ด๊ณ์์ด ํ ์คํธ ํจ์๊ฐ ์๋ฃ๋ ํ ์คํ๋ ํจ์๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค. ์ด๋ ํญ์ ์ํํด์ผ ํ๋ ์ ๋ฆฌ ์์ ์ ์ ์ฉํฉ๋๋ค.
์:
import pytest
@pytest.fixture(scope="function")
def log_file(request):
test_name = request.function.__name__
filename = f"log_{test_name}.txt"
file = open(filename, "w")
def finalizer():
file.close()
print(f"\nClosed log file: {filename}")
request.addfinalizer(finalizer)
return file
def test_with_logging(log_file):
log_file.write("This is a test log message\n")
assert True
์ด ์์ ์์ `log_file` fixture๋ ํ ์คํธ ํจ์ ์ด๋ฆ์ ํน์ ๋ก๊ทธ ํ์ผ์ ๋ง๋ญ๋๋ค. `finalizer` ํจ์๋ `request.addfinalizer`๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฆฌ ํจ์๋ฅผ ๋ฑ๋กํ์ฌ ํ ์คํธ๊ฐ ์๋ฃ๋ ํ ๋ก๊ทธ ํ์ผ์ด ๋ซํ๋๋ก ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ Fixture ์ฌ์ฉ ์ฌ๋ก
Fixtures๋ ๋ค์ฌ๋ค๋ฅํ๋ฉฐ ๋ค์ํ ํ ์คํธ ์๋๋ฆฌ์ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ: ์ด์ ์์ ์์์ ๊ฐ์ด fixtures๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- API ํด๋ผ์ด์ธํธ: Fixtures๋ API ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑํ์ฌ ์ธ๋ถ ์๋น์ค์ ์ํธ ์์ฉํ๊ธฐ ์ํ ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ธ๊ณ์ ์ผ๋ก ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ ํ ์คํธํ๋ ๊ฒฝ์ฐ ๋ค์ํ ์ง์ญ API ์๋ํฌ์ธํธ(์: `api_client_us()`, `api_client_eu()`, `api_client_asia()`)์ ๋ํ fixtures๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ตฌ์ฑ ์ค์ : Fixtures๋ ๊ตฌ์ฑ ์ค์ ์ ๋ก๋ํ๊ณ ์ ๊ณตํ์ฌ ํ ์คํธ๊ฐ ์๋ก ๋ค๋ฅธ ๊ตฌ์ฑ์ผ๋ก ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, fixture๋ ํ๊ฒฝ(๊ฐ๋ฐ, ํ ์คํธ, ํ๋ก๋์ )์ ๋ฐ๋ผ ๊ตฌ์ฑ ์ค์ ์ ๋ก๋ํ ์ ์์ต๋๋ค.
- ๋ชจ์ ๊ฐ์ฒด: Fixtures๋ ๋ชจ์ ๊ฐ์ฒด ๋๋ ํ ์คํธ ๋๋ธ์ ์์ฑํ์ฌ ์ฝ๋์ ๊ฐ๋ณ ๋จ์๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ํ ์คํธํ ์ ์์ต๋๋ค.
- ์์ ํ์ผ: Fixtures๋ ์์ ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ํ์ผ ๊ธฐ๋ฐ ํ ์คํธ๋ฅผ ์ํ ๊นจ๋ํ๊ณ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง ํ์ผ์ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. fixture๋ ํ ์คํธ์์ ์ฌ์ฉํ ์๋ก ๋ค๋ฅธ ์์ฑ์ ๊ฐ์ง ์ํ ์ด๋ฏธ์ง ํ์ผ(์: JPEG, PNG, GIF) ์งํฉ์ ์์ฑํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ธ์ฆ: Fixtures๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋๋ API๋ฅผ ํ ์คํธํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. fixture๋ ์ฌ์ฉ์ ๊ณ์ ์ ์์ฑํ๊ณ ํ์ ํ ์คํธ์์ ์ฌ์ฉํ ์ธ์ฆ ํ ํฐ์ ์ป์ ์ ์์ต๋๋ค. ๋ค๊ตญ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ๋ ๊ฒฝ์ฐ fixture๋ ์๋ก ๋ค๋ฅธ ์ธ์ด ๊ธฐ๋ณธ ์ค์ ์ ๊ฐ์ง ์ธ์ฆ๋ ์ฌ์ฉ์๋ฅผ ์์ฑํ์ฌ ์ ์ ํ ํ์งํ๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๊ณ ๊ธ Fixture ๊ธฐ์
Pytest๋ ํ ์คํธ ๊ธฐ๋ฅ์ ํฅ์์ํค๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ fixture ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค.
- Fixture Autouse:
autouse=True
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋๋ ์ธ์ ์ ๋ชจ๋ ํ ์คํธ ํจ์์ fixture๋ฅผ ์๋์ผ๋ก ์ ์ฉํ ์ ์์ต๋๋ค. ์์์ ์ข ์์ฑ์ ํ ์คํธ๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํ์ญ์์ค. - Fixture ๋ค์์คํ์ด์ค: Fixtures๋ ๋ค์์คํ์ด์ค์ ์ ์๋์ด ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ fixtures๋ฅผ ๋ ผ๋ฆฌ์ ๊ทธ๋ฃน์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Conftest.py์์ Fixtures ์ฌ์ฉ:
conftest.py
์ ์ ์๋ Fixtures๋ ๋์ผํ ๋๋ ํ ๋ฆฌ ๋ฐ ํ์ ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ํ ์คํธ ํจ์์์ ์๋์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ fixtures๋ฅผ ์ ์ํ๊ธฐ์ ์ข์ ๊ณณ์ ๋๋ค. - ํ๋ก์ ํธ ๊ฐ Fixtures ๊ณต์ : ์ฌ๋ฌ ํ๋ก์ ํธ์์ ๊ณต์ ํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ fixture ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ์ฝ๋ ์ฌ์ฌ์ฉ ๋ฐ ์ผ๊ด์ฑ์ ๋์ ๋๋ค. ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๋ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋ ๊ณตํต ๋ฐ์ดํฐ๋ฒ ์ด์ค fixtures ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
์: Fixtures๋ฅผ ์ฌ์ฉํ API ํ ์คํธ
๊ฐ์์ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ fixtures๋ฅผ ์ฌ์ฉํ API ํ ์คํธ๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ์ ์ธ๊ณ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ API๋ฅผ ํ ์คํธํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
import pytest
import requests
BASE_URL = "https://api.example.com"
@pytest.fixture
def api_client():
session = requests.Session()
session.headers.update({"Content-Type": "application/json"})
return session
@pytest.fixture
def product_data():
return {
"name": "Global Product",
"description": "A product available worldwide",
"price": 99.99,
"currency": "USD",
"available_countries": ["US", "EU", "Asia"]
}
def test_create_product(api_client, product_data):
response = api_client.post(f"{BASE_URL}/products", json=product_data)
assert response.status_code == 201
data = response.json()
assert data["name"] == "Global Product"
def test_get_product(api_client, product_data):
# First, create the product (assuming test_create_product works)
response = api_client.post(f"{BASE_URL}/products", json=product_data)
product_id = response.json()["id"]
# Now, get the product
response = api_client.get(f"{BASE_URL}/products/{product_id}")
assert response.status_code == 200
data = response.json()
assert data["name"] == "Global Product"
์ด ์์ ์์๋:
api_client
fixture๋ ๊ธฐ๋ณธ ์ฝํ ์ธ ์ ํ์ผ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ฒญ ์ธ์ ์ ๋ง๋ญ๋๋ค.product_data
fixture๋ ์ ํ์ ์์ฑํ๊ธฐ ์ํ ์ํ ์ ํ ํ์ด๋ก๋๋ฅผ ์ ๊ณตํฉ๋๋ค.- ํ ์คํธ๋ ์ด๋ฌํ fixtures๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ์ ์์ฑํ๊ณ ๊ฒ์ํ์ฌ ๊นจ๋ํ๊ณ ์ผ๊ด๋ API ์ํธ ์์ฉ์ ๋ณด์ฅํฉ๋๋ค.
Fixtures ์ฌ์ฉ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก
pytest fixtures์ ์ด์ ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ธ์.
- Fixtures๋ฅผ ์๊ณ ์ง์ค์ ์ผ๋ก ์ ์ง: ๊ฐ fixture๋ ๋ช ํํ๊ณ ๊ตฌ์ฒด์ ์ธ ๋ชฉ์ ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ๋๋ฌด ๋ง์ ์์ ์ ์ํํ๋ ์ง๋์น๊ฒ ๋ณต์กํ fixtures๋ฅผ ๋ง๋ค์ง ๋ง์ธ์.
- ์๋ฏธ ์๋ Fixture ์ด๋ฆ ์ฌ์ฉ: ๋ชฉ์ ์ ๋ช ํํ๊ฒ ๋ํ๋ด๋ ์ค๋ช ์ ์ธ ์ด๋ฆ์ fixtures์ ์ ํํ์ธ์.
- ๋ถ์์ฉ ๋ฐฉ์ง: Fixtures๋ ์ฃผ๋ก ๋ฆฌ์์ค๋ฅผ ์ค์ ํ๊ณ ์ ๊ณตํ๋ ๋ฐ ์ค์ ์ ๋์ด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ํ ์คํธ์ ์๋์น ์์ ๋ถ์์ฉ์ ์ด๋ํ ์ ์๋ ์์ ์ํ์ ํผํ์ธ์.
- Fixtures ๋ฌธ์ํ: ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ์ค๋ช ํ๊ธฐ ์ํด fixtures์ docstring์ ์ถ๊ฐํ์ธ์.
- Fixture ๋ฒ์๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉ: fixture๋ฅผ ์ผ๋ง๋ ์์ฃผ ์คํํด์ผ ํ๋์ง์ ๋ฐ๋ผ ์ ์ ํ fixture ๋ฒ์๋ฅผ ์ ํํ์ธ์. ํจ์ ๋ฒ์ fixture๋ก ์ถฉ๋ถํ๋ฉด ์ธ์ ๋ฒ์ fixture๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์.
- ํ ์คํธ ๊ฒฉ๋ฆฌ ๊ณ ๋ ค: fixture๊ฐ ๊ฐ์ญ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ์คํธ ๊ฐ์ ์ถฉ๋ถํ ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ณตํ๋์ง ํ์ธํ์ธ์. ์๋ฅผ ๋ค์ด, ๊ฐ ํ ์คํธ ํจ์ ๋๋ ๋ชจ๋์ ๋ํด ๋ณ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ธ์.
๊ฒฐ๋ก
Pytest fixtures๋ ๊ฐ๋ ฅํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ ํจ์จ์ ์ธ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์์กด์ฑ ์ฃผ์ ์๋ฆฌ๋ฅผ ์์ฉํ๊ณ fixtures์ ์ ์ฐ์ฑ์ ํ์ฉํจ์ผ๋ก์จ ์ํํธ์จ์ด์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ์์ ๋ชจ์ ๊ฐ์ฒด ์์ฑ์ ์ด๋ฅด๊ธฐ๊น์ง, fixtures๋ ํ ์คํธ ์ค์ ๋ฐ ํด์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ๊นจ๋ํ๊ณ ์ฒด๊ณ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ง์ค์ ์ธ ํ ์คํธ ํจ์๋ก ์ด์ด์ง๋๋ค.
์ด ๊ธฐ์ฌ์์ ์ค๋ช ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณ ๊ธ ๊ธฐ์ ์ ํ์ํ๋ฉด pytest fixtures์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ์ด์ด ํ ์คํธ ๊ธฐ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ, ํ ์คํธ ๊ฒฉ๋ฆฌ ๋ฐ ๋ช ํํ ๋ฌธ์๋ฅผ ์ฐ์ ์ํ์ฌ ํจ๊ณผ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฌ์ด ํ ์คํธ ํ๊ฒฝ์ ๋ง๋๋ ๊ฒ์ ์์ง ๋ง์ธ์. pytest fixtures๋ฅผ ํ ์คํธ ์ํฌํ๋ก์ ๊ณ์ ํตํฉํ๋ฉด ๊ณ ํ์ง ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ธ ์์ฐ์์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๊ถ๊ทน์ ์ผ๋ก pytest fixtures๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ๋ํ ํฌ์์ด๋ฉฐ ์ฝ๋๋ฒ ์ด์ค์ ๋ํ ์์ ๊ฐ์ ๋์ด๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์์ ์ ์ด๊ณ ๊ฐ๋ ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๋ ๋ ๋ถ๋๋ฌ์ด ๊ธธ๋ก ์ด์ด์ง๋๋ค.