0Pricing
Python Academy · บทเรียน

ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน

ใช้ฟิกซ์เจอร์สำหรับสถานะการทดสอบร่วมกันและการเตรียมทรัพยากร

ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

ฟิกซ์เจอร์คืออะไร

ฟิกซ์เจอร์คือฟังก์ชันที่ตกแต่งด้วย @pytest.fixture ซึ่งจัดเตรียมสิ่งที่การทดสอบต้องพึ่งพา pytest จะส่งฟิกซ์เจอร์ให้ตามชื่อ

import pytest

@pytest.fixture
def user():
    return {"name": "Alice", "age": 30}

def test_name(user):
    assert user["name"] == "Alice"

การตั้งค่าและการเก็บกวาดด้วย yield

คืนค่าฟิกซ์เจอร์ด้วย yield ภายในฟิกซ์เจอร์ เพื่อแยกการตั้งค่า (ก่อน yield) ออกจากการเก็บกวาด (หลัง yield)

import pytest

@pytest.fixture
def db_connection():
    conn = create_connection()  # setup
    yield conn
    conn.close()                # teardown

def test_query(db_connection):
    result = db_connection.query("SELECT 1")
    assert result is not None

ขอบเขตการทำงานของฟิกซ์เจอร์

ควบคุมความถี่ในการสร้างฟิกซ์เจอร์ด้วย scope: function (ค่าเริ่มต้น), class, module, session

import pytest

@pytest.fixture(scope="module")
def expensive_resource():
    print("\nSetup once per module")
    yield object()
    print("\nTeardown once per module")

การใช้ฟิกซ์เจอร์ร่วมกันผ่าน conftest.py

ใส่ฟิกซ์เจอร์ไว้ใน conftest.py เพื่อใช้ร่วมกันในไฟล์การทดสอบต่าง ๆ โดยไม่ต้องนำเข้า

# conftest.py
import pytest

@pytest.fixture
def config():
    return {"env": "test", "debug": True}

# test_app.py
def test_env(config):
    assert config["env"] == "test"

การพึ่งพากันของฟิกซ์เจอร์

ฟิกซ์เจอร์สามารถพึ่งพาฟิกซ์เจอร์อื่นได้โดยระบุฟิกซ์เจอร์เหล่านั้นเป็นพารามิเตอร์

import pytest

@pytest.fixture
def base_url():
    return "http://localhost:8000"

@pytest.fixture
def api_client(base_url):
    return Client(base_url)

def test_get(api_client):
    resp = api_client.get("/health")
    assert resp.status_code == 200

ฟิกซ์เจอร์อัตโนมัติ

ตั้งค่า autouse=True เพื่อใช้ฟิกซ์เจอร์กับการทดสอบทั้งหมดในขอบเขตนั้น โดยไม่ต้องระบุเป็นพารามิเตอร์

import pytest

@pytest.fixture(autouse=True)
def reset_env(monkeypatch):
    monkeypatch.setenv("ENVIRONMENT", "test")

def test_env():
    import os
    assert os.environ["ENVIRONMENT"] == "test"

ฟิกซ์เจอร์ tmp_path

pytest มี tmp_path เป็นฟิกซ์เจอร์ในตัว ซึ่งมอบไดเรกทอรีชั่วคราวใหม่ให้กับการทดสอบแต่ละครั้ง

def test_write_file(tmp_path):
    f = tmp_path / "hello.txt"
    f.write_text("hello")
    assert f.read_text() == "hello"

ฟิกซ์เจอร์ monkeypatch

monkeypatch ช่วยให้คุณแทนที่แอตทริบิวต์ ตัวแปรสภาพแวดล้อม หรือรายการในพจนานุกรมเป็นการชั่วคราวระหว่างการทดสอบได้

def get_env():
    import os
    return os.environ.get("MODE", "prod")

def test_mode(monkeypatch):
    monkeypatch.setenv("MODE", "test")
    assert get_env() == "test"

ฟิกซ์เจอร์ capsys

capsys ดักจับเอาต์พุตจาก stdout และ stderr ระหว่างการทดสอบ

def greet(name):
    print(f"Hello, {name}!")

def test_greet(capsys):
    greet("Alice")
    out, err = capsys.readouterr()
    assert out == "Hello, Alice!\n"

ตัวดำเนินการเก็บกวาดของฟิกซ์เจอร์ด้วย request.addfinalizer

ทางเลือกนอกเหนือจาก yield: ลงทะเบียนการเก็บกวาดด้วย request.addfinalizer

import pytest

@pytest.fixture
def resource(request):
    r = acquire_resource()
    request.addfinalizer(r.release)
    return r

ฟิกซ์เจอร์แบบกำหนดพารามิเตอร์

ใช้ params ในฟิกซ์เจอร์เพื่อเรียกใช้การทดสอบที่พึ่งพาฟิกซ์เจอร์นั้นหนึ่งครั้งต่อค่าพารามิเตอร์แต่ละค่า

import pytest

@pytest.fixture(params=["sqlite", "postgres"])
def db(request):
    return create_db(request.param)

def test_insert(db):
    db.insert({"id": 1})
    assert db.count() == 1

ตรวจสอบอย่างรวดเร็ว

ขอบเขตของฟิกซ์เจอร์ใดที่สร้างฟิกซ์เจอร์เพียงครั้งเดียวตลอดช่วงการทดสอบทั้งหมด

สรุปทบทวน

ฟิกซ์เจอร์ช่วยจัดเตรียมและเก็บกวาดที่นำกลับมาใช้ใหม่ได้ผ่าน yield ใช้ scope เพื่อควบคุมอายุการใช้งาน ใช้ conftest.py สำหรับการใช้ร่วมกัน และใช้ autouse=True เพื่อใช้งานโดยอัตโนมัติ

คำถามที่พบบ่อย

บทเรียน “ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน”

ใช้ฟิกซ์เจอร์สำหรับสถานะการทดสอบร่วมกันและการเตรียมทรัพยากร คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเขียนการทดสอบ pytest แรกของคุณ
  2. ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน
  3. การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ
  4. การจำลองด้วย unittest.mock
← กลับไปที่ Python Academy