Pytest-tutorial voor beginners: Fixtures, parametriseren en echte voorbeelden
Met Pytest kun je Python-tests schrijven met duidelijke functies en duidelijke assert-statements. Bouw stap voor stap een kleine testsuite, lees de echte foutmeldingen en leer de functies kennen die u elke dag zult gebruiken.
- Pytest vindt functies met de naam
test_*en controleert deze met gewoneassert-instructies. - Fixtures bieden herbruikbare configuratie en opschoning, eenvoudigweg aangevraagd door ze als argumenten te benoemen.
@pytest.mark.parametrizevoert één test uit met veel invoer.- Plaats gedeelde armaturen in
conftest.pyen u hoeft ze niet te importeren.
Als je het schrijven van toetsen hebt vermeden omdat ze een hele klus zijn, zou deze pytest-tutorial je van gedachten moeten doen veranderen. Pytest verwijdert het grootste deel van de ceremonie: er zijn geen klassen om van te erven en geen speciale beweringsmethoden om te onthouden. Een test kan uit slechts twee regels bestaan.
We bouwen een klein winkelwagentje en testen het stap voor stap. We hebben alles op Python 3.13 uitgevoerd met pytest 9.2, en de getoonde uitvoer is echt, hoewel we de bestandspaden en timingdetails hebben bijgesneden die op uw machine zullen verschillen.
Waarom pytest?
Python wordt geleverd met unittest, wat goed werkt, maar pytest is meestal de handigste keuze. Hier is dezelfde cheque in elk:
| Taak | unittest | pytest |
|---|---|---|
| Controleer gelijkheid | self.assertEqual(a, b) |
beweren a == b |
| Vink een uitzondering aan | self.assertRaises(...) |
pytest.raises(...) |
| Teststructuur | Een klasse die erft van TestCase |
Een eenvoudige functie |
| Opstellen en opruimen | setUp en tearDown methoden |
Herbruikbare armaturen |
| Veel ingangen | subTest lussen |
parametriseren |
Pytest kan ook uw bestaande unittest tests uitvoeren, zodat u geleidelijk kunt overstappen. Het heeft ook een groot plug-in-ecosysteem, inclusief pytest-cov voor dekking en pytest-xdist voor parallelle runs.
Installeer pytest
Maak eerst een virtuele omgeving, zoals uitgelegd in onze tutorial over de virtuele Python-omgeving, en installeer deze vervolgens:
pip install pytest
pytest --version
# pytest 9.2.0
Maak een projectmap met twee bestanden, cart.py en test_cart.py. Pytest vindt tests automatisch door de naamgevingsregels te volgen: bestanden met de naam test_*.py of *_test.py, functies die beginnen met test en klassen die beginnen met Test. Als een test niet wordt opgepakt, is een verkeerde naamgeving het eerste dat moet worden gecontroleerd.
De code om te testen
# cart.py
class Cart:
def __init__(self):
self.items = []
def add(self, name, price, qty=1):
if qty < 1:
raise ValueError("qty must be at least 1")
self.items.append((name, price, qty))
def total(self, discount=0):
subtotal = sum(price * qty for _, price, qty in self.items)
return round(subtotal * (1 - discount / 100), 2)
Je eerste testen
# test_cart.py
from cart import Cart
def test_empty_cart_is_free():
assert Cart().total() == 0
Dat is een volledige test. Voer pytest uit vanuit de projectmap en rapporteert één geslaagde test. Als u een importfout krijgt, voert u deze uit als python -m pytest, waardoor de huidige map aan het importpad wordt toegevoegd.
Fouten bij het lezen
Dit is waar pytest echt schittert. Hier is een test met een opzettelijk verkeerde verwachte waarde:
def test_wrong_total():
c = Cart()
c.add("Keyboard", 1500)
assert c.total() == 1400
En dit is wat het afdrukte toen we het uitvoerden:
def test_wrong_total():
c = Cart()
c.add("Keyboard", 1500)
> assert c.total() == 1400
E assert 1500.0 == 1400
E + where 1500.0 = total()
FAILED fail_example.py::test_wrong_total - assert 1500.0 == 1400
============================== 1 failed in 0.12s ==============================
De > markeert de falende regel en de E regels tonen de werkelijke waarden. Je hoefde geen aangepast bericht toe te voegen, omdat pytest assert instructies herschrijft, zodat ze kunnen rapporteren wat ze hebben vergeleken. Hetzelfde geldt voor lijsten en woordenboeken, waarbij precies wordt aangegeven welke items verschillen.
Uitzonderingen testen
Foutafhandeling is ook gedrag en verdient tests. pytest.raises slaagt alleen als het blok de verwachte uitzondering oplevert:
import pytest
def test_rejects_zero_qty():
with pytest.raises(ValueError, match="at least 1"):
Cart().add("Pen", 10, qty=0)
Het optionele argument match controleert het bericht met behulp van een reguliere expressie, zodat een ander argument ValueError niet per ongeluk voorbijkomt. Lees onze handleiding over Python-uitzonderingsafhandeling voor meer informatie over hoe u dit soort fouten kunt melden en afhandelen.
Armaturen: herbruikbare opstelling
Bij de meeste tests moet eerst iets worden voorbereid. Een fixture is een functie die hierin voorziet. Versier het met @pytest.fixture, en elke test die het als argument noemt, krijgt het resultaat:
@pytest.fixture
def cart():
c = Cart()
c.add("Keyboard", 1500)
c.add("Mouse", 500, qty=2)
return c
def test_total(cart):
assert cart.total() == 2500
Elke test krijgt standaard een nieuw winkelwagentje, dus tests kunnen elkaar niet beïnvloeden. Pytest koppelt de argumentnaam aan de naam van het armatuur, en u roept het armatuur nooit zelf aan. @pytest.fixture is een decorateur, wat we uitleggen in Python-decorateurs uitgelegd.
Opruimen met rendement
Gebruik yield in plaats van return als je achteraf moet opruimen. Code na yield wordt uitgevoerd wanneer de test is voltooid, zelfs als deze is mislukt:
@pytest.fixture
def temp_db():
print("\nopen db")
yield {"users": []}
print("close db")
def test_db(temp_db):
assert temp_db["users"] == []
Het uitvoeren van -s om de afgedrukte uitvoer weer te geven, bevestigde dat de bestelling open was, test en vervolgens werd gesloten.
Armatuurbereik en conftest.py
Standaard wordt een armatuur eenmaal per test uitgevoerd. Voor dure instellingen, zoals een database of browser, verander je de levensduur ervan met scope:
| Reikwijdte | Eenmaal per gemaakt |
|---|---|
function (standaard) |
Proef |
klasse |
Test klasse |
module |
Bestand |
pakket |
Pakket |
sessie |
Hele proefrit |
Plaats de apparaten die door verschillende bestanden worden gebruikt in een bestand met de naam conftest.py. Pytest laadt het automatisch, zodat tests de armaturen kunnen gebruiken zonder te importeren. Wees echter voorzichtig met gedeelde scopes, omdat een wijziging die door de ene test wordt aangebracht, naar de volgende kan lekken.
Parametriseren: één test, veel invoer
In plaats van een test voor elke waarde te kopiëren, vermeldt u de gevallen:
@pytest.mark.parametrize("discount, expected", [
(0, 2500),
(10, 2250),
(100, 0),
])
def test_discount(cart, discount, expected):
assert cart.total(discount) == expected
Elke rij wordt zijn eigen test, en je kunt dit zien in de uitgebreide uitvoer van onze run van het volledige bestand:
test_cart.py::test_total PASSED [ 16%]
test_cart.py::test_discount[0-2500] PASSED [ 33%]
test_cart.py::test_discount[10-2250] PASSED [ 50%]
test_cart.py::test_discount[100-0] PASSED [ 66%]
test_cart.py::test_rejects_zero_qty PASSED [ 83%]
test_cart.py::test_empty_cart_is_free PASSED [100%]
============================== 6 passed in 0.05s ==============================
Als één rij mislukt, worden de andere nog steeds uitgevoerd en vertelt de naam u precies welke waarden het probleem hebben veroorzaakt. Merk op dat we parametriseren hebben gecombineerd met het armatuur cart. Als u waarden wilt kiezen die waarschijnlijk bugs zullen opleveren, gebruikt u grenswaardeanalyse.
Tip: Als uw parameters lang of onduidelijk zijn, geeft u ids=["none", "ten", "full"] door om elke case een leesbare naam in het rapport te geven.
Handige inbouwarmaturen
Pytest bevat diverse kant-en-klare armaturen. Deze twee zijn vooral handig, en beide zijn geslaagd in onze run:
def test_write_report(tmp_path):
report = tmp_path / "report.txt"
report.write_text("passed")
assert report.read_text() == "passed"
def read_mode():
return os.environ.get("APP_MODE", "dev")
def test_mode(monkeypatch):
monkeypatch.setenv("APP_MODE", "staging")
assert read_mode() == "staging"
tmp_path geeft elke test een unieke tijdelijke map, zodat tests nooit echte bestanden raken. monkeypatch verandert omgevingsvariabelen of attributen, en maakt de wijziging ongedaan wanneer de test eindigt. Een andere nuttige is capsys, waarin de afgedrukte uitvoer wordt vastgelegd, zodat u deze kunt controleren.
Markeringen: overslaan en xfail
Markeringen voegen labels en gedrag toe aan tests:
@pytest.mark.skip(reason="payment sandbox is down")
def test_payment():
assert False
@pytest.mark.xfail(reason="floating point")
def test_rounding():
assert 0.1 + 0.2 == 0.3
skip voert de test helemaal niet uit. xfail voert het uit, maar verwacht een mislukking, dus een bekend probleem vernietigt je build niet. Met de andere extra tests in hetzelfde bestand, is onze run samengevat als 3 passed, 1 skipped, 1 xfailed. Die afrondingstest faalt overigens echt: in de drijvende-kommaberekening is 0,1 + 0,2 niet precies 0,3. Gebruik pytest.approx(0.3) bij het vergelijken van decimalen.
Je kunt ook je eigen markeringen maken, zoals @pytest.mark.slow, en alleen die met pytest -m slow uitvoeren, of ze weglaten met -m "not slow". Registreer aangepaste markeringen in uw configuratiebestand om waarschuwingen te voorkomen.
Handige opdrachtregelvlaggen
| Commando | Wat het doet |
|---|---|
pytest -v |
Toon elke testnaam |
pytest -q |
Laat een kortere samenvatting zien |
pytest -x |
Stop bij de eerste mislukking |
pytest -k korting |
Voer tests uit waarvan de naam overeenkomt met een woord |
pytest -s |
Toon print uitvoer |
pytest --lf |
Voer alleen de laatste mislukkingen opnieuw uit |
pytest --pdb |
Open de debugger bij een fout |
pytest test_cart.py::test_total |
Voer één specifieke test uit |
Pytest uitvoeren in CI
Tests zijn het meest waardevol als ze bij elke wijziging automatisch worden uitgevoerd. Een minimale GitHub Actions-taak ziet er als volgt uit:
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.13"
- run: pip install -r requirements.txt
- run: python -m pytest
Pytest wordt afgesloten met een code die niet nul is wanneer tests mislukken, waardoor de pijplijn stopt. Wij hebben dit workflowbestand niet uitgevoerd, dus pas het aan uw project aan. In onze GitHub Actions CI/CD-handleiding worden de details uitgelegd. Pytest werkt ook goed voor browsertests, zoals blijkt uit onze Selenium Python-tutorial en Page Object Model-tutorial.
Tot slot
Je hebt nu wat je nodig hebt voor de meeste Python-testsuites: duidelijke beweringen, armaturen voor de installatie, parametrisering voor variaties en een paar vlaggen voor snelheid. Begin klein. Kies een functie waarin u onlangs een bug heeft opgelost en schrijf eerst een test voor die bug. Als je niet zeker weet wat je op elk niveau moet testen, lees dan over unit- versus integratietesten.
Veelgestelde vragen
Waar wordt pytest voor gebruikt?
Pytest is een Python-testframework. Het wordt gebruikt voor unit-, integratie- en API-tests, en werkt ook goed met browsertools zoals Selenium en Playwright.
Is pytest beter dan unittest?
Veel teams geven er de voorkeur aan vanwege de eenvoudigere syntaxis, de wedstrijden en de duidelijkere fouten. unittest heeft geen installatie nodig en pytest kan ook bestaande unittest-tests uitvoeren.
Wat is een armatuur in pytest?
Een armatuur is een functie die iets voorbereidt dat een test nodig heeft, zoals data of een verbinding. Tests ontvangen dit door het als argument te benoemen.
Wat is conftest.py?
Het is een speciaal bestand voor het delen van armaturen en hooks in testbestanden. Pytest laadt het automatisch, dus de armaturen hebben geen importinstructie nodig.
Waarom vindt pytest mijn tests niet?
Meestal is het een naamgevingsprobleem. Bestanden moeten test_*.py of *_test.py heten, en functies moeten beginnen met test. Controleer ook of u het vanuit de juiste map hebt uitgevoerd.
Blijf leren
Hulp nodig met testen, WordPress of SEO?
We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen
AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…
Lees artikel →DevOpsOmgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan
Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…
Lees artikel →SoftwareontwikkelingAPI-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten
API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…
Lees artikel →TestautomatiseringSpotten in Python: unittest.mock, patch en de fouten die tests doen liegen
Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…
Lees artikel →SoftwaretestenCodedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent
Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…
Lees artikel →Databases & SQLDELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken
DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…
Lees artikel →Databases & SQLSQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden
SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…
Lees artikel →SoftwareontwikkelingTypeScript-interface versus type: echte verschillen, getest met de compiler
TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…
Lees artikel →SoftwareontwikkelingPython *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden
Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…
Lees artikel →SoftwareontwikkelingPython Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken
Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…
Lees artikel →Kunstmatige intelligentieWat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren
Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…
Lees artikel →DevOpsMonitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen
Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…
Lees artikel →DevOpsDocker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier
Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…
Lees artikel →TestautomatiseringTDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt
TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…
Lees artikel →SoftwaretestenGebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden
Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…
Lees artikel →Databases & SQLSQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen
SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…
Lees artikel →Databases & SQLSQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten
SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…
Lees artikel →SoftwareontwikkelingWat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld
Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…
Lees artikel →SoftwareontwikkelingJavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden
De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…
Lees artikel →SoftwareontwikkelingPython-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden
Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …
Lees artikel →Kunstmatige intelligentieWat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd
Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…
Lees artikel →DevOpsImplementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen
Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…
Lees artikel →TestautomatiseringSchilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen
Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…
Lees artikel →SoftwaretestenBelastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden
Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …
Lees artikel →SoftwaretestenTestcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken
Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…
Lees artikel →Databases & SQLOptimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing
Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…
Lees artikel →Databases & SQLSQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties
SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…
Lees artikel →SoftwareontwikkelingJavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs
Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…
Lees artikel →SoftwareontwikkelingPython-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden
Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…
Lees artikel →SoftwareontwikkelingPython-klassen en -objecten: OOP-zelfstudie met echte voorbeelden
Python-klassen en -objecten uitgelegd met code die we hebben uitgevoerd: __init__, methoden, klasse versus instantie-attributen, overerving, eigensc…
Lees artikel →Kunstmatige intelligentieWat is een groot taalmodel? Hoe LLM's werken, uitgelegd zonder de hype
Wat is een groot taalmodel? LLM's uitgelegd in duidelijke taal: tokens, inbedding, aandacht, training, temperatuur- en contextvensters, een kleine d…
Lees artikel →DevOpsLinux-opdrachten voor beginners: de essentiële terminalgids met voorbeelden
Linux-opdrachten voor beginners, gegroepeerd op taak: navigatie, bestanden, logboeken bekijken, grep, pipelines, machtigingen, processen en archieve…
Lees artikel →TestautomatiseringSelenium versus toneelschrijver: belangrijkste verschillen, code vergeleken en welke te kiezen
Selenium versus Playwright vergeleken: architectuur, wachten, browser- en taalondersteuning, debuggen, dezelfde test in beide tools, migratieadvies …
Lees artikel →SoftwaretestenEquivalentiepartitionering: testontwerptechniek uitgelegd met uitgewerkte voorbeelden
Equivalentiepartitionering uitgelegd: hoe je geldige en ongeldige partities kunt vinden, uitgewerkte voorbeelden voor leeftijden, wachtwoorden en ko…
Lees artikel →SoftwaretestenErnst versus prioriteit bij het testen van software: verschillen, matrix en echte voorbeelden
Ernst versus prioriteit bij het testen van software uitgelegd: duidelijke definities, een vierwegmatrix met voorbeelden, niveauschalen, wie deze bep…
Lees artikel →Databases & SQLTutorial voor SQL-subquery's: typen, gecorreleerde subquery's en BESTAAN met voorbeelden
Een SQL-subquery-tutorial met query's die we hebben uitgevoerd: scalaire, IN-, FROM- en SELECT-subquery's, gecorreleerde subquery's, EXISTS, de NOT …
Lees artikel →Databases & SQLSQL-transacties en ACID uitgelegd: COMMIT-, ROLLBACK- en isolatieniveaus
SQL-transacties en ACID uitgelegd met een bankoverschrijving die we hebben uitgevoerd: COMMIT, ROLLBACK, savepoints, locks, isolatieniveaus, dirty r…
Lees artikel →SoftwareontwikkelingGit Commands Cheat Sheet: de commando's die je daadwerkelijk gebruikt, met voorbeelden
Een spiekbriefje voor Git-opdrachten, gegroepeerd op taak: setup, staging, branches, remotes, stash, geschiedenis en fouten ongedaan maken, met uitv…
Lees artikel →SoftwareontwikkelingJavaScript-beloften uitgelegd: vervolgens catch, Promise.all en veelvoorkomende fouten
JavaScript-beloften uitgelegd met code die we hebben uitgevoerd: staten, dan en catch-ketens, foutafhandeling, Promise.all, allSettled, race en wat …
Lees artikel →SoftwareontwikkelingZelfstudie Python-woordenboek: methoden, voorbeelden en veelvoorkomende patronen
Een Python-woordenboektutorial met code die we hebben uitgevoerd: dictaten, sleutelmethoden, samenvoeg-, begrips-, tel- en groeperingspatronen en ve…
Lees artikel →Kunstmatige intelligentieWat is RAG? Retrieval-Augmented Generation uitgelegd met een werkend voorbeeld
Wat is RAG? Retrieval-augmented generatie stap voor stap uitgelegd: indexeren, chunken, insluiten, ophalen, een klein werkend Python-voorbeeld, eval…
Lees artikel →DevOpsTerraform-zelfstudie voor beginners: infrastructuur als code van het eerste bestand tot modules
Een Terraform-tutorial voor beginners: begin zonder cloudaccount, leer init, plan en pas toe, vervolgens variabelen, outputs, status, modules en een…
Lees artikel →DevOpsDocker versus Kubernetes: belangrijkste verschillen, hoe ze samenwerken en welke u nodig heeft
Docker vs Kubernetes legde uit: wat elk doet, dezelfde app draait met beide, Docker Compose en Swarm vergeleken, de dockershim veranderen en hoe je …
Lees artikel →TestautomatiseringPytest-tutorial voor beginners: armaturen, parametriseren en echte voorbeelden
Een pytest-tutorial voor beginners met tests die we hebben uitgevoerd op pytest 9.2: beweringen, armaturen, parametrize, conftest, markers, tmp_path…
Lees artikel →SoftwaretestenLevenscyclus van softwaretests (STLC): 6 fasen, in- en uitgangscriteria, voorbeeld
De levenscyclus van softwaretesten uitgelegd: zes STLC-fasen met in- en uitstapcriteria, deliverables, een voorbeeld van een uitgewerkte inlogfuncti…
Lees artikel →SoftwareontwikkelingGit merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt
Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.
Lees artikel →SoftwareontwikkelingPython list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt
Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.
Lees artikel →Databases & SQLSQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)
Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.
Lees artikel →