Python Academy · Lektion

Fixtures og opsætning/nedlukning

Brug fixtures til delt testtilstand og opsætning af ressourcer.

Lektion 2 af 413 trin

Fixtures og opsætning/nedlukning er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.

Hvad er fixtures?

Fixtures er funktioner, der er dekoreret med @pytest.fixture, og som leverer afhængigheder til test. pytest indsætter dem efter navn.

import pytest

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

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

Opsætning og oprydning med yield

Returnér fixture-værdien med yield inde i en fixture for at adskille opsætning (før yield) fra oprydning (efter 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

Fixture-omfang

Styr, hvor ofte en fixture oprettes, med scope: function (standard), class, module, session.

import pytest

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

Deling af fixtures via conftest.py

Placér fixtures i conftest.py for at dele dem på tværs af testfiler uden importer.

# conftest.py
import pytest

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

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

Afhængigheder mellem fixtures

Fixtures kan afhænge af andre fixtures ved at angive dem som parametre.

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-fixtures

Indstil autouse=True for at anvende en fixture på alle tests i dens omfang uden at angive den som parameter.

import pytest

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

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

Fixture-nøglen tmp_path

pytest leverer tmp_path som en indbygget fixture, der giver en ny midlertidig mappe for hver test.

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

Fixture-nøglen monkeypatch

monkeypatch lader dig midlertidigt erstatte attributter, miljøvariabler eller poster i ordbøger under en test.

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

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

Fixture-nøglen capsys

capsys opfanger output fra stdout og stderr under tests.

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

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

Fixture-afslutning med request.addfinalizer

Et alternativ til yield: Registrér oprydning med request.addfinalizer.

import pytest

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

Parameteriserede fixtures

Brug params i en fixture for at køre alle afhængige tests én gang for hver parameterværdi.

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

Hurtigt tjek

Hvilket fixture-omfang opretter fixturen én gang for hele testsessionen?

Opsummering

Fixtures leverer genbrugelig opsætning og oprydning via yield. Brug scope til at styre levetiden, conftest.py til deling og autouse=True til implicit anvendelse.

Gratis at komme i gang

Lær Python med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
76
Lektioner
320

Ofte stillede spørgsmål

Er lektionen “Fixtures og opsætning/nedlukning” gratis?

Ja — hele teksten til “Fixtures og opsætning/nedlukning” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Fixtures og opsætning/nedlukning”?

Brug fixtures til delt testtilstand og opsætning af ressourcer. Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Python Academy?

Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Fixtures og opsætning/nedlukning”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Python Academy-lektion?

Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Skrivning af de første pytest-tests
  2. Fixtures og opsætning/nedlukning
  3. Parametrisering og testdækning
  4. Mocking med unittest.mock
← Tilbage til Python Academy