{"id":11431,"date":"2025-12-23T09:50:07","date_gmt":"2025-12-23T09:50:07","guid":{"rendered":"https:\/\/www.dignitas.nl\/?p=11431"},"modified":"2026-01-05T09:53:26","modified_gmt":"2026-01-05T09:53:26","slug":"contract-testing-2","status":"publish","type":"post","link":"https:\/\/www.dignitas.nl\/contract-testing-2\/","title":{"rendered":"Contract Testing voor providers; test je API met Specmatic\u00a0"},"content":{"rendered":"<p><em>Schrijver: Max van Deursen, Software Engineer<\/em><\/p>\n<p style=\"font-weight: 400;\"><strong>Contract Testing voor providers; test je API met Specmatic<br \/>\n<\/strong>Als developer implementeer je een API op basis van een specificatie. Die specificatie is het contract tussen jou en je consumers.\u00a0<a href=\"https:\/\/www.dignitas.nl\/contract-testing-voor-consumers\/\">In mijn vorige blog<\/a>\u00a0gebruikte ik\u00a0<a href=\"https:\/\/specmatic.io\/\" target=\"_blank\" rel=\"noopener\">Specmatic<\/a>\u00a0om vanuit consumer-perspectief te testen of de integratie klopt, voordat de API live staat.<\/p>\n<p style=\"font-weight: 400;\">In deze blog kijk ik naar de andere kant van het contract: de provider. Dit is de applicatie\u00a0die de API implementeert. Ik laat je zien hoe je met Specmatic toetst of jouw applicatie zich houdt aan dezelfde\u00a0<a href=\"http:\/\/swagger.io\/specification\/\" target=\"_blank\" rel=\"noopener\">OpenAPI Specification (OAS)<\/a>\u00a0als de consumer.\u00a0Niet om \u201ctests toe te voegen\u201d, maar om zeker te weten dat je API zich gedraagt zoals beloofd.<\/p>\n<p style=\"font-weight: 400;\"><strong>Het voorbeeld<br \/>\n<\/strong>Om Specmatic\u2019s provider-tests te laten zien, gebruik ik opnieuw het voorbeeld van het winkelmandje van een webshop. Dezelfde casus als in de vorige blog. De API is vastgelegd in\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/CartAPI_v1.yaml\" target=\"_blank\" rel=\"noopener\">CartAPI_v1.yaml<\/a> en bevat endpoints om een winkelmandje aan te maken, op te vragen en producten toe te voegen. In deze blog ben jij verantwoordelijk voor de backend van deze shop. Je implementeert als provider dus de API en de bijbehorende domeinlogica waar jouw consumers op vertrouwen.<\/p>\n<p style=\"font-weight: 400;\">Specmatic is programmeertaal agnostisch. Ik heb de API in dit voorbeeld uitgewerkt met DotNet, een veelgebruikte programmeertaal voor zo\u2019n implementatie.\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/\" target=\"_blank\" rel=\"noopener\">Op GitHub<\/a>\u00a0heb ik de voorbeeldcode staan, zodat je zelf met Specmatic kan experimenteren.<\/p>\n<p style=\"font-weight: 400;\"><strong>De implementatie<br \/>\n<\/strong>Als provider schrijf je een webserver die de endpoints uit de OAS afhandelt. In dit voorbeeld gebeurt dat met\u00a0<a href=\"https:\/\/dotnet.microsoft.com\/en-us\/apps\/aspnet\" target=\"_blank\" rel=\"noopener\">ASP.NET Core<\/a>. In de map\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/tree\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/Dignitas.Specmatic.Provider.API\" target=\"_blank\" rel=\"noopener\">Dignitas.Specmatic.Provider.API<\/a>\u00a0staat de implementatie:<\/p>\n<ul style=\"font-weight: 400;\">\n<li>De\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/tree\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/Dignitas.Specmatic.Provider.API\/Services\" target=\"_blank\" rel=\"noopener\">Services<\/a>\u00a0map bevat de kernlogica van de applicatie. De belangrijkste klasse is\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/Dignitas.Specmatic.Provider.API\/Services\/CartService.cs\" target=\"_blank\" rel=\"noopener\">CartService.cs<\/a>. Deze klasse implementeert de regels van het domein. Zo zorgt de CartService ervoor dat een product slechts een keer aan een winkelmandje kan worden toegevoegd en dat alleen bekende producten zijn toegestaan.<\/li>\n<li>De\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/Dignitas.Specmatic.Provider.API\/Controllers\/CartController.cs\" target=\"_blank\" rel=\"noopener\">CartController.cs<\/a>\u00a0vormt de koppeling tussen de CartService en de endpoints.<\/li>\n<li>De\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/tree\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/Dignitas.Specmatic.Provider.API\/Exceptions\" target=\"_blank\" rel=\"noopener\">Exceptions<\/a>\u00a0en\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/tree\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/Dignitas.Specmatic.Provider.API\/Models\" target=\"_blank\" rel=\"noopener\">Models<\/a>\u00a0\u00a0mappen bevatten respectievelijk fouttypes en datamodellen die door de rest van de applicatie worden gebruikt.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\"><strong>Draaien van applicatie en tests<br \/>\n<\/strong>Specmatic verifieert het contract door jouw draaiende applicatie aan te roepen en de reactie met de OAS te vergelijken. Hiervoor moet je applicatie dus lokaal beschikbaar zijn. Dit voorbeeld gebruikt hiervoor\u00a0<a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener\">Docker<\/a>, wat ook bij Specmatic zelf aansluit, dat ook in een container draait. Waar in de vorige blog\u00a0<a href=\"https:\/\/testcontainers.com\/\" target=\"_blank\" rel=\"noopener\">Testcontainers<\/a>\u00a0werd gebruikt om Specmatic te configureren, gebruiken we dit keer\u00a0<a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener\">Docker Compose<\/a>.<\/p>\n<p style=\"font-weight: 400;\">Eerst geef je aan hoe Docker jouw applicatie kan bouwen en draaien. Dat gebeurt in het\u00a0\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/Dockerfile\" target=\"_blank\" rel=\"noopener\">Dockerfile<\/a> bestand, waarin het Docker image wordt vastgelegd. Hierna kan je de applicatie en Specmatic configureren en koppelen. Dit staat in het bestand\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/docker-compose.yaml\" target=\"_blank\" rel=\"noopener\">docker-compose.yaml<\/a>.<\/p>\n<p style=\"font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11445\" src=\"https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding4-300x217.png\" alt=\"\" width=\"455\" height=\"329\" srcset=\"https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding4-300x217.png 300w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding4-768x556.png 768w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding4.png 846w\" sizes=\"auto, (max-width: 455px) 100vw, 455px\" \/><\/p>\n<p style=\"font-weight: 400;\">De regels 2-7 configureren jouw applicatie en maken de poort\u00a0<em>8080<\/em>\u00a0beschikbaar. De regels 8-16 configureren de Specmatic test container. Hierin zorg je dat Specmatic bij de\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/specmatic.yaml\" target=\"_blank\" rel=\"noopener\">specmatic.yaml<\/a>\u00a0configuratie kan, de voorbeelden in\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/tree\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/examples\/CartAPI_v1\" target=\"_blank\" rel=\"noopener\">examples\/CartAPI_v1 <\/a>beschikbaar zijn en dat Specmatic de URL naar de applicatie in de tests gebruikt:\u00a0<a href=\"http:\/\/api:8080\/\"><em>http:\/\/api:8080<\/em><\/a>. De hostnaam\u00a0<em>api<\/em>\u00a0komt overeen met de servicenaam die op regel 2 staat aangegeven voor jouw applicatie.<\/p>\n<p style=\"font-weight: 400;\"><strong>Opzet van de tests<br \/>\n<\/strong>In de\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/tree\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/examples\/CartAPI_v1\" target=\"_blank\" rel=\"noopener\">examples\/CartAPI_v1<\/a> map staan verschillende voorbeelden die je API op specifieke manieren aanroepen. Specmatic voert deze aanroepen uit, vergelijkt de responses met de OAS en bepaalt op basis daarvan of een test slaagt.<\/p>\n<p style=\"font-weight: 400;\">Een voorbeeld van zo\u2019n test is\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/examples\/CartAPI_v1\/addItemToCart.conflict.json\" target=\"_blank\" rel=\"noopener\">addItemToCart.conflict.json<\/a>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11444\" src=\"https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding3-300x300.png\" alt=\"\" width=\"411\" height=\"411\" srcset=\"https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding3-300x300.png 300w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding3-150x150.png 150w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding3-768x770.png 768w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding3-100x100.png 100w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding3.png 800w\" sizes=\"auto, (max-width: 411px) 100vw, 411px\" \/><\/p>\n<p style=\"font-weight: 400;\">Deze test doet een POST-aanroep om het product\u00a0<em>9\u00a0<\/em>aan het winkelmandje met ID\u00a0<em>0\u00a0<\/em>toe te voegen. De verwachte uitkomst is een conflictsituatie, wat met de\u00a0<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Status\/409\" target=\"_blank\" rel=\"noopener\">foutcode 409 (Conflict)<\/a> staat aangegeven op regel 14. In het contract is vastgelegd dat een\u00a0<em>quantity\u00a0<\/em>verplicht is. In dit voorbeeld ontbreekt dat veld. Op het eerste gezicht voelt dat tegenstrijdig: hoe kan Specmatic dit voorbeeld toch accepteren?<\/p>\n<p style=\"font-weight: 400;\">De verklaring zit in het gebruik van\u00a0<a href=\"https:\/\/docs.specmatic.io\/contract_driven_development\/service_virtualization.html#partial-examples\" target=\"_blank\" rel=\"noopener\">Partial Examples<\/a>. Dit is te herkennen aan het partial-attribuut op regel 2. Met partial examples hoef je alleen de velden te specificeren die relevant zijn voor het scenario dat je test. Ontbrekende velden vult Specmatic automatisch aan op basis van de OAS. Zo kan jij je focussen op de velden die voor de test belangrijk zijn. In dit geval draait de test om het feit dat een winkelmandje al een bepaald product bevat. Daarom zijn alleen het winkelmandje en het product expliciet vastgelegd op regel 5 en 10. De exacte hoeveelheid is hier niet relevant. Specmatic genereert daarvoor een geldige waarde volgens de specificatie.<\/p>\n<p style=\"font-weight: 400;\"><strong>Testdata en initialiseerstappen<br \/>\n<\/strong>Om de conflictsituatie te testen, moet je applicatie het winkelmandje met ID\u00a0<em>0<\/em>\u00a0bevatten waarin het product\u00a0<em>9\u00a0<\/em>aanwezig is<em>. A<\/em>nders treedt de situatie simpelweg niet op. Deze data komt overeen met het voorbeeld. Maar hoe zorg je ervoor dat deze data in jouw applicatie staat?<\/p>\n<p style=\"font-weight: 400;\">In dit voorbeeld is dat specifieke winkelmandje vooraf aanwezig in de\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/Dignitas.Specmatic.Provider.API\/Services\/CartService.cs\" target=\"_blank\" rel=\"noopener\">CartService.cs<\/a>. Bij het testen van je eigen applicatie is dit een belangrijk aandachtspunt: denk bewust na over hoe je testdata initialiseert voordat je met Specmatic tests uitvoert.<\/p>\n<p style=\"font-weight: 400;\"><strong>Het resultaat van de tests<br \/>\n<\/strong>Nu kun je met Docker Compose met behulp van Specmatic jouw applicatie testen. Hiervoor gebruik je het volgende commando:<\/p>\n<p style=\"font-weight: 400;\"><em>docker compose up \u2013d \u2013-build<\/em><\/p>\n<p style=\"font-weight: 400;\">Docker bouwt eerst het image van jouw applicatie en start deze. Zodra de API beschikbaar is, start de Specmatic container en voert alle tests uit. De Specmatic container schrijft tijdens het uitvoeren van de testen verschillende berichten op om de voortgang te rapporteren. Nadat de testen zijn uitgevoerd, stopt de Specmatic container en zie je in de berichten van de container een samenvatting van de resultaten:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11443\" src=\"https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding2-263x300.png\" alt=\"\" width=\"432\" height=\"493\" srcset=\"https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding2-263x300.png 263w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding2-768x875.png 768w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding2.png 792w\" sizes=\"auto, (max-width: 432px) 100vw, 432px\" \/><\/p>\n<p style=\"font-weight: 400;\">Onderaan geeft Specmatic aan dat alle testen zijn geslaagd. Er zijn 24 tests succesvol uitgevoerd, terwijl de map\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/tree\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/examples\/CartAPI_v1\" target=\"_blank\" rel=\"noopener\">examples\/CartAPI_v1<\/a>\u00a0maar 7 voorbeelden bevat. Waar komt dit verschil vandaan?<\/p>\n<p style=\"font-weight: 400;\"><strong>Gegenereerde tests<br \/>\n<\/strong>Specmatic maakt het je graag gemakkelijk. Waar partial examples je al werk uit handen nemen, kan Specmatic ook volledige testcases afleiden uit de specificatie.<\/p>\n<p style=\"font-weight: 400;\">In dit voorbeeld genereert Specmatic nog 17 tests aan de hand van de OAS. De\u00a0<a href=\"https:\/\/github.com\/MaxVanDeursen\/Dignitas.Specmatic\/blob\/60cd4bd60aefdbd53b9d93a0d1c6bf36fbe121d1\/provider\/docker-compose.yaml\" target=\"_blank\" rel=\"noopener\">docker-compose.yaml<\/a>\u00a0zorgt er op regel 14 voor dat Specmatic deze tests uitvoert, door de omgevingsvariabele\u00a0<em>SPECMATIC_GENERATIVE_TESTS\u00a0<\/em>op\u00a0<em>true<\/em> te zetten. Deze gegenereerde tests controleren of jouw applicatie ook met ongeldige aanroepen kan omgaan. Denk hierbij aan verkeerde types, ontbrekende verplichte velden of onverwachte waarden.<\/p>\n<p style=\"font-weight: 400;\">Een voorbeeld van zo\u2019n gegenereerde test staat in het\u00a0<a href=\"https:\/\/docs.specmatic.io\/references\/configuration\/reports.html\" target=\"_blank\" rel=\"noopener\">HTML Report<\/a>\u00a0die Specmatic als resultaat meegeeft:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11442\" src=\"https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding1-255x300.png\" alt=\"\" width=\"408\" height=\"480\" srcset=\"https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding1-255x300.png 255w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding1-869x1024.png 869w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding1-768x905.png 768w, https:\/\/www.dignitas.nl\/wp-content\/uploads\/2025\/12\/Afbeelding1.png 932w\" sizes=\"auto, (max-width: 408px) 100vw, 408px\" \/><\/p>\n<p style=\"font-weight: 400;\">In deze test wordt voor het ID van het winkelmandje de waarde\u00a0<em>false\u00a0<\/em>meegestuurd. Dat is geen geldig nummer. De verwachte reactie is daarom een foutmelding. In de reactie ontvangt de test vanuit je applicatie een\u00a0<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Status\/400\" target=\"_blank\" rel=\"noopener\">foutcode 400 (Bad Request)<\/a> op. Hiermee geeft je applicatie aan dat de aanroep een fout bevat. Deze gegenereerde testen dekken veel randgevallen af en neemt Specmatic je waar mogelijk werk uit handen. Hierdoor kan jij je focussen of de testgevallen die niet alleen uit de OAS af te leiden zijn.<\/p>\n<p style=\"font-weight: 400;\"><strong>Wanneer gebruik je Specmatic bij providers?<br \/>\n<\/strong>Specmatic roept je applicatie aan en kijkt of deze volgens het contract reageert. Ook verifieert Specmatic dat jouw applicatie goed omgaat met ongeldige aanroepen. Deze tests kan Specmatic een groot deel zelf genereren. In complexere scenario\u2019s voeg je zelf voorbeelden toe die Specmatic uitvoert. Vaak betekent dit dat je bewust testdata in je applicatie initialiseert om specifieke situaties te kunnen afdwingen.<\/p>\n<p style=\"font-weight: 400;\">Specmatic voert per test \u00e9\u00e9n aanroep uit. Als je voor een test scenario meer aanroepen nodig hebt of de opzet van data erg complex is, kan hier beter een andere testvorm voor gebruiken. Zorg in dit geval dat deze testvorm en Specmatic elkaar aanvullen. Zo kan je zorgen dat je applicatie volgens het contract communiceert en goed met complexe situaties overweg kan.<\/p>\n<p style=\"font-weight: 400;\"><strong>Wat rest ons nu?<\/strong><br \/>\nMet de opzet van deze en de vorige blog kan je zowel consumer- als provider-tests uitvoeren op basis van dezelfde OAS met behulp van Specmatic. Hierdoor kunnen de consumer en provider uiteindelijk probleemloos met elkaar communiceren en integreren. De volgende vraag is waar die OAS leeft en hoe je deze veilig wijzigt zonder consumers of providers te breken. In het laatste deel van deze serie ga ik in op versiebeheer van de OAS en laat ik zien hoe Specmatic helpt bij het gecontroleerd doorvoeren van wijzigingen.<\/p>\n<p style=\"font-weight: 400;\"><strong>Overzicht blogreeks<\/strong><br \/>\n<span data-teams=\"true\"><a id=\"menur1r1\" class=\"fui-Link ___1q1shib f2hkw1w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1s184ao f1mk8lai fnbmjn9 f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn\" title=\"https:\/\/www.dignitas.nl\/contract-testing\/\" href=\"https:\/\/www.dignitas.nl\/contract-testing\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Koppeling 19 augustus 2025 - Contract Testing: Integratieproblemen vroeg opgelost\">19 augustus 2025 &#8211; Contract Testing: Integratieproblemen vroeg opgelost<\/a><br \/>\n<a href=\"https:\/\/www.dignitas.nl\/contract-testing-voor-consumers\/\">20 oktober 2025 \u2013 <\/a><\/span><a href=\"https:\/\/www.dignitas.nl\/contract-testing-voor-consumers\/\">Contract Testing voor consumers: aan de slag met Specmatic\u2019s Smart Mocks<br \/>\n<\/a><span data-teams=\"true\"><a href=\"https:\/\/www.dignitas.nl\/contract-testing-2\/\">23 december 2025 \u2013 Contract Testing voor providers; test je API met Specmatic<\/a><br \/>\n17 februari 2026 \u2013 Beheer van OpenAPI specificaties en veilig wijzigen met Specmatic<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Schrijver: Max van Deursen, Software Engineer Contract Testing voor providers; test je API met Specmatic Als developer implementeer je een API op basis van een specificatie. Die specificatie is het contract tussen jou en je consumers.\u00a0In mijn vorige blog\u00a0gebruikte ik\u00a0Specmatic\u00a0om vanuit consumer-perspectief te testen of de integratie klopt, voordat de API live staat. In deze &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.dignitas.nl\/contract-testing-2\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Contract Testing voor providers; test je API met Specmatic\u00a0&#8220;<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":11432,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[176],"tags":[],"class_list":["post-11431","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-engineering"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/posts\/11431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/comments?post=11431"}],"version-history":[{"count":8,"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/posts\/11431\/revisions"}],"predecessor-version":[{"id":11451,"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/posts\/11431\/revisions\/11451"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/media\/11432"}],"wp:attachment":[{"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/media?parent=11431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/categories?post=11431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dignitas.nl\/wp-json\/wp\/v2\/tags?post=11431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}