Fixtures og opsætning/nedlukning
Brug fixtures til delt testtilstand og opsætning af ressourcer.
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 NoneFixture-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 == 200autouse-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 rParameteriserede 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() == 1Hurtigt 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.
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
- Skrivning af de første pytest-tests
- Fixtures og opsætning/nedlukning
- Parametrisering og testdækning
- Mocking med unittest.mock