ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน
ใช้ฟิกซ์เจอร์สำหรับสถานะการทดสอบร่วมกันและการเตรียมทรัพยากร
ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียนการทดสอบ pytest แรกของคุณ
- ฟิกซ์เจอร์และการตั้งค่า/การรื้อถอน
- การกำหนดพารามิเตอร์และความครอบคลุมการทดสอบ
- การจำลองด้วย unittest.mock