57 lines
340 KiB
HTML
57 lines
340 KiB
HTML
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, initial-scale=1" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:site" content="@site" data-next-head=""/><meta name="twitter:creator" content="@codecentric" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta property="og:locale" content="de_DE" data-next-head=""/><meta property="og:site_name" content="codecentric AG" data-next-head=""/><title data-next-head="">Chaos Engineering - withstanding turbulent conditions in production</title><meta name="description" content="Chaos Engineering, start experimenting on a distributed system in order to build confidence in the system's capability to withstand production" data-next-head=""/><link rel="canonical" href="https://www.codecentric.de/en/knowledge-hub/blog/chaos-engineering" data-next-head=""/><link rel="icon" href="/favicon.ico" data-next-head=""/><link rel="alternate" type="application/rss+xml" title="RSS Feed for blog.codecentric.de" href="/rss/feed.xml" data-next-head=""/><link rel="alternate" hreflang="en" href="https://www.codecentric.de/en/knowledge-hub/blog/chaos-engineering" data-next-head=""/><link rel="alternate" hreflang="x-default" href="https://www.codecentric.de/en/knowledge-hub/blog/chaos-engineering" data-next-head=""/><meta name="robots" content="index,follow" data-next-head=""/><meta property="og:title" content="Chaos Engineering - withstanding turbulent conditions in production" data-next-head=""/><meta property="og:description" content="Chaos Engineering, start experimenting on a distributed system in order to build confidence in the system's capability to withstand production" data-next-head=""/><meta property="og:url" content="https://www.codecentric.de/en/knowledge-hub/blog/chaos-engineering" data-next-head=""/><meta property="og:image" content="https://www.codecentric.de/og-2.png" data-next-head=""/><link data-next-font="size-adjust" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/chunks/1yre10om85rdf.css" as="style"/><link rel="preload" href="/_next/static/chunks/2cel5e35b8oyn.css" as="style"/><link rel="preload" href="/_next/static/chunks/0j26fesc0rnq4.css" as="style"/><link rel="preload" href="/_next/static/chunks/03xy9-6vzs-xq.css" as="style"/><link rel="preload" href="/_next/static/chunks/0oom6e7y9xzhg.css" as="style"/><link rel="preload" href="/_next/static/chunks/0b8t7nswnsfda.css" as="style"/><script type="text/javascript" src="/podloveCdn.js" data-next-head=""></script><script data-next-head="">
|
||
// Initialize dataLayer if it doesn't exist
|
||
window.dataLayer = window.dataLayer || [];
|
||
|
||
// Use a flag in window to track if this script has run
|
||
if (!window.dataLayerInitialized) {
|
||
// Set the flag to prevent double execution
|
||
window.dataLayerInitialized = true;
|
||
|
||
let scriptPageObj = {};
|
||
|
||
const post = "chaos-engineering";
|
||
const postPublishingDate = "2018-07-04";
|
||
console.log("postPublishingDate: ", postPublishingDate);
|
||
const allAuthors = "Benjamin Wilms";
|
||
|
||
if (typeof post !== "undefined") {
|
||
scriptPageObj.page_area = "blog";
|
||
scriptPageObj.page_environment = "live";
|
||
scriptPageObj.page_language = "en";
|
||
|
||
if (allAuthors !== "") {
|
||
scriptPageObj.post_author = allAuthors;
|
||
}
|
||
|
||
if (postPublishingDate) {
|
||
scriptPageObj.post_publishing_date = postPublishingDate;
|
||
}
|
||
|
||
scriptPageObj.post_language = "en";
|
||
}
|
||
|
||
// Push data
|
||
window.dataLayer.push({
|
||
event: 'page',
|
||
page: scriptPageObj
|
||
});
|
||
|
||
// Trigger the load state immediately after execution
|
||
setTimeout(() => {
|
||
document.dispatchEvent(new CustomEvent('dataLayerReady'));
|
||
}, 1000);
|
||
}
|
||
</script><link rel="stylesheet" href="/_next/static/chunks/1yre10om85rdf.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/chunks/2cel5e35b8oyn.css" data-n-p=""/><link rel="stylesheet" href="/_next/static/chunks/0j26fesc0rnq4.css" data-n-p=""/><link rel="stylesheet" href="/_next/static/chunks/03xy9-6vzs-xq.css" data-n-p=""/><link rel="stylesheet" href="/_next/static/chunks/0oom6e7y9xzhg.css" data-n-p=""/><link rel="stylesheet" href="/_next/static/chunks/0b8t7nswnsfda.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/0cz1d0mv5g_q7.js"></script><script src="/_next/static/chunks/1o-1npxh97hl_.js" defer=""></script><script src="/_next/static/chunks/066ipnnr_jw4c.js" defer=""></script><script src="/_next/static/chunks/1tzk4qjv_75fo.js" defer=""></script><script src="/_next/static/chunks/3etuzt4ugcfda.js" defer=""></script><script src="/_next/static/chunks/2097zwufvodzs.js" defer=""></script><script src="/_next/static/chunks/turbopack-35iip9-bn86nw.js" defer=""></script><script src="/_next/static/chunks/3zjzg9qbe3n02.js" defer=""></script><script src="/_next/static/chunks/30uf5igxs7w8r.js" defer=""></script><script src="/_next/static/chunks/3wdeuyhy3r430.js" defer=""></script><script src="/_next/static/chunks/06033w3a0rdx1.js" defer=""></script><script src="/_next/static/chunks/2stxg3od2rn2t.js" defer=""></script><script src="/_next/static/chunks/2_13stsftgpr4.js" defer=""></script><script src="/_next/static/chunks/411nzfq0k1y49.js" defer=""></script><script src="/_next/static/chunks/14dxxkwmp_na-.js" defer=""></script><script src="/_next/static/chunks/396zk2t6ql5op.js" defer=""></script><script src="/_next/static/chunks/2-oyit43p_hw2.js" defer=""></script><script src="/_next/static/chunks/turbopack-33gtizqc2zawj.js" defer=""></script><script src="/_next/static/jBfnzTvNzHvvFOTTO2y2r/_buildManifest.js" defer=""></script><script src="/_next/static/jBfnzTvNzHvvFOTTO2y2r/_ssgManifest.js" defer=""></script><script src="/_next/static/jBfnzTvNzHvvFOTTO2y2r/_clientMiddlewareManifest.js" defer=""></script></head><body><link rel="preload" as="image" href="/search.svg"/><link rel="preload" as="image" href="/hamburger.svg"/><link rel="preload" as="image" href="/facebook.svg"/><link rel="preload" as="image" href="/twitter.svg"/><link rel="preload" as="image" href="/linkedin.svg"/><link rel="preload" as="image" href="/icon-calendar.svg"/><link rel="preload" as="image" href="/youtube.svg"/><link rel="preload" as="image" href="/instagram.svg"/><div id="__next"><section class="Toastify" aria-live="polite" aria-atomic="false" aria-relevant="additions text" aria-label="Notifications Alt+T"></section><div class="SearchModal-module-scss-module__BCeQjG__search-modal-overlay "></div><div id="searchModal" tabindex="0" class="SearchModal-module-scss-module__BCeQjG__search-modal__outer-flex-container "><div id="searchModalContent" class="SearchModal-module-scss-module__BCeQjG__search-modal"><div class="SearchModal-module-scss-module__BCeQjG__search-modal__inner-container"><div><div class="SearchModal-module-scss-module__BCeQjG__search-modal__top-nav"><button type="button" class="SearchModal-module-scss-module__BCeQjG__search-modal__top-nav-close" aria-label="Schließen Button"><span></span></button></div></div></div><div class="SearchModal-module-scss-module__BCeQjG__search-modal__inner-container--complete-overflow"><div class="SearchModal-module-scss-module__BCeQjG__search-modal__inner-container--overflow"><div><div class="Search-module-scss-module__FyKeua__c-search-container" style="max-width:60rem"><div class="Search-module-scss-module__FyKeua__c-search"><div></div></div></div><div class="SearchModalInput-module-scss-module__vpAsGG__search-modal-container"><small>Popular searches</small><button>Cloud native</button><button>DevOps</button><button>IT-Security</button><button>Agile methods</button><button>Java</button></div><div class="SearchModalInput-module-scss-module__vpAsGG__search-modal-input-container"><div class="SearchModalInput-module-scss-module__vpAsGG__search-modal-input-left"><div class="SearchModalInput-module-scss-module__vpAsGG__search-modal-input-left-content"></div></div><div class="SearchModalInput-module-scss-module__vpAsGG__search-modal-input-right"><div class="SearchModalInput-module-scss-module__vpAsGG__search-modal-input-right__mobile-filters"></div><div class="SearchModalInput-module-scss-module__vpAsGG__search-modal-input-right__container"></div></div></div></div></div></div></div></div><div style="max-width:inherit"><div class="HeaderTopNav-module-scss-module__xnb6iW__c-header-top-nav__banner-container"></div><div class="HeaderTopNav-module-scss-module__xnb6iW__c-header-top-nav HeaderTopNav-module-scss-module__xnb6iW__banner-container overflow-full-width"><div class="HeaderTopNav-module-scss-module__xnb6iW__c-header-top-nav__inner HeaderTopNav-module-scss-module__xnb6iW__banner-container"><ul><li><a href="/en/about-us">About us</a></li><li><a href="/en/news">News</a></li><li><a href="/en/contact">Contact us</a></li></ul></div></div><div class="l-container"><header class="Header-module-scss-module__Jhzrsq__c-header" style="transform:translateY(0)"><div class="Header-module-scss-module__Jhzrsq__c-header__left"><a href="/en"><img alt="Logo der codecentric AG, einem in Deutschland führenden IT-Consulting Unternehmen" loading="lazy" width="1099" height="137" decoding="async" data-nimg="1" class="Header-module-scss-module__Jhzrsq__c-header__logo" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=1200&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=3840&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=3840&q=75"/></a></div><div class="Header-module-scss-module__Jhzrsq__c-header__right"><div class="Header-module-scss-module__Jhzrsq__c-header__nav-list"><ul><li class="Header-module-scss-module__Jhzrsq__li-first-row" aria-expanded="false"><span><a href="/en/services">Services</a></span></li><li class="Header-module-scss-module__Jhzrsq__li-first-row" aria-expanded="false"><span><a href="/en/industries">Industries</a></span></li><li class="Header-module-scss-module__Jhzrsq__li-first-row" aria-expanded="false"><span><a href="/en/references">References</a></span></li><li class="Header-module-scss-module__Jhzrsq__li-first-row" aria-expanded="false"><span><a href="/en/locations">Locations</a></span></li><li class="Header-module-scss-module__Jhzrsq__li-first-row Header-module-scss-module__Jhzrsq__active" aria-expanded="false"><span><a href="/en/knowledge-hub">Knowledge Hub</a></span></li><li class="Header-module-scss-module__Jhzrsq__li-first-row" aria-expanded="false"><span><a href="/en/careers">Careers</a></span></li></ul></div></div><button class="Header-module-scss-module__Jhzrsq__c-header__nav-list__search"><img src="/search.svg" alt="Suche"/></button><div class="Header-module-scss-module__Jhzrsq__c-header__nav-list__hamburger"><img src="/hamburger.svg" alt="Hamburger Menu"/></div></header><div class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu"><div class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__top-container"><a href="/en"><img alt="Logo der codecentric AG, einem in Deutschland führenden IT-Consulting Unternehmen" loading="lazy" width="1099" height="137" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=1200&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=3840&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=3840&q=75"/></a><button type="button" class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__close" aria-label="Schließen Button"><span></span></button></div><div class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__top-list-container"><ul><li><a href="/en/about-us">About us</a></li><li><a href="/en/news">News</a></li><li><a href="/en/contact">Contact us</a></li></ul></div><div class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__menu-container"><ul><li class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__list-container"><div><a href="/en/services">Services</a><button class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__childlinks-btn"><span class=""></span></button></div><ul class="HamburgerMenuList-module-scss-module__4mqWoa__child-links"><li><a href="/en/services/data-effectiveness">Data Effectiveness</a></li><li><a href="/en/services/digital-solutions">Digital Products & Solutions</a></li><li><a href="/en/services/digital-sovereignty">Digital sovereignty</a></li><li><a href="/en/it-security">IT Security</a></li><li><a href="/en/services/artificial-intelligence">Artificial intelligence</a></li><li><a href="/en/services/software-modernization">Software Modernization</a></li><li><a href="/en/services#service-overview">Services from A to Z ...</a></li></ul></li><li class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__list-container"><div><a href="/en/industries">Industries</a></div></li><li class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__list-container"><div><a href="/en/references">References</a></div></li><li class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__list-container"><div><a href="/en/locations">Locations</a><button class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__childlinks-btn"><span class=""></span></button></div><ul class="HamburgerMenuList-module-scss-module__4mqWoa__child-links"><li><a href="/en/locations/berlin">Berlin</a></li><li><a href="/en/locations/bielefeld">Bielefeld</a></li><li><a href="/en/locations/dortmund">Dortmund</a></li><li><a href="/en/locations/erfurt">Erfurt</a></li><li><a href="/en/locations/frankfurt">Frankfurt am Main</a></li><li><a href="/en/locations/hamburg">Hamburg</a></li><li><a href="/en/locations/karlsruhe">Karlsruhe</a></li><li><a href="/en/locations/leipzig">Leipzig</a></li><li><a href="/en/locations/munich">Munich</a></li><li><a href="/en/locations/muenster">Münster</a></li><li><a href="/en/locations/nuremberg">Nuremberg</a></li><li><a href="/en/locations/solingen">Solingen</a></li><li><a href="/en/locations/stuttgart">Stuttgart</a></li></ul></li><li class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__list-container"><div><a href="/en/knowledge-hub">Knowledge Hub</a><button class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__childlinks-btn"><span class=""></span></button></div><ul class="HamburgerMenuList-module-scss-module__4mqWoa__child-links"><li><a style="font-weight:bold" href="/en/knowledge-hub/blog">Blog</a></li></ul></li><li class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__list-container"><div><a href="/en/careers">Careers</a><button class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__childlinks-btn"><span class=""></span></button></div><ul class="HamburgerMenuList-module-scss-module__4mqWoa__child-links"><li><a href="/en/careers/jobs">Jobs</a></li><li><a href="/en/careers/culture">Our Culture</a></li><li><a href="/en/careers/faq">FAQ</a></li></ul></li></ul></div><div class="HamburgerMenuList-module-scss-module__4mqWoa__c-hamburger-menu__bottom-line"><ul></ul></div></div></div><main id="container" class="blogPost-module-scss-module__mIGxdW__blog-post"><div class="reading-progress-bar" style="width:0%;position:fixed;z-index:800;height:5px;top:0;background-color:var(--primary-1)"></div><div class="blogPost-module-scss-module__mIGxdW__l-post-container__inner-container"><div class="blogPost-module-scss-module__mIGxdW__l-post-container__left"><div><div class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner"><div><label><p><a title="/" href="/">HOME</a></p></label><span class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner__icon"></span><label><p><a title="/en/knowledge-hub" href="/en/knowledge-hub">KNOWLEDGE-HUB</a></p></label><span class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner__icon"></span><label><p><a title="/en/knowledge-hub/blog" href="/en/knowledge-hub/blog">BLOG</a></p></label><div class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner__main-heading"><span>//</span><h1>Chaos Engineering – withstanding turbulent conditions in production</h1></div><div class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner__tag-container"><button type="button" class="Tag-module-scss-module__YjKNvW__c-tag">Chaos Engineering<span></span></button><button type="button" class="Tag-module-scss-module__YjKNvW__c-tag">Resilience<span></span></button><button type="button" class="Tag-module-scss-module__YjKNvW__c-tag">Testing<span></span></button></div></div><div class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner__border"><div class="BlogHeadingBanner-module-scss-module__X8XbXW__triangle"></div></div><div class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner__bottom"><div class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner__bottom-inner-container"><button aria-label="Benjamin Wilms"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=1200&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=3840&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=3840&q=75"/><p><small>Benjamin<!-- --> <!-- -->Wilms</small></p></button><p class="BlogHeadingBanner-module-scss-module__X8XbXW__c-blog-heading-banner__info"><small>4.7.2018<!-- --> <span>|</span> <!-- -->12<!-- --> <!-- -->minutes reading time</small></p></div></div></div></div><div class="BlogBody-module-scss-module__Q1LjWG__c-blog-body"><img alt="" loading="lazy" width="1455" height="1003" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBjopIj5pQ7iWTNI6upu2&w=1920&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBjopIj5pQ7iWTNI6upu2&w=3840&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBjopIj5pQ7iWTNI6upu2&w=3840&q=75"/><div class="BlogBody-module-scss-module__Q1LjWG__c-blog-body__content"><p>When you were a child, did you deliberately break or dismantle things in order to understand how they work? We all did – although some people have a greater urge to destroy than others. Today we call it Chaos Engineering.</p><p>As developers, one of our primary goals is to develop stable, secure and bug-free software that will not deprive us of sleep or new and exciting topics. To accomplish these and other goals, we write unit and integration tests, which alert us to unexpected behavior and ensure that the patterns we test do not lead to errors. Today’s architectures contain many components that can’t all be fully covered with unit and integration tests. Servers and components of whose existence we’re not aware still manage to drag our entire system into the abyss.</p><blockquote><p>You don’t choose the moment, the moment chooses you!<br/> You only choose how prepared you are when it does.<br/> Fire Chief Mike Burtch</p></blockquote><h2>Introduction</h2><p>In recent years, Netflix has been one of the drivers behind Chaos Engineering and has contributed significantly to the growing importance of Chaos Engineering in distributed systems. Kyle Kingsbury, security researcher, takes a slightly different approach, verifying the promises of manufacturers of distributed databases, queues and other distributed systems. With his tool <a rel="external" target="_blank" href="https://jepsen.io/">Jepsen</a> , he probes the behavior of the aforementioned systems and occasionally comes to frightening conclusions. You can find a very impressive talk on this topic on <a href="https://www.youtube.com/watch?v=eSaFVX4izsQ" target="_blank">YouTube</a> .</p><p>In this article I hope to give you a simple and descriptive introduction to the world of Chaos Engineering. As a neat side-effect, Chaos Engineering will allow you to personally meet all of your colleagues within a short time – whether you want to or not! (But only if you do it wrong.)</p><p>Do not underestimate the social aspect of Chaos Engineering; it is not just about destroying something, but also about bringing the right people together and jointly pursuing the goal of creating stable and fault-tolerant software.</p><h2>Basics</h2><p>When we develop new or existing software, we toughen our implementation through various forms of tests. We are often referred to a test pyramid that illustrates what kinds of tests we should write and to what extent.</p><p><img alt="Test Pyramid" loading="lazy" width="685" height="571" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Fb3pBSNSdSbK6El55FkLI&w=750&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Fb3pBSNSdSbK6El55FkLI&w=1920&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Fb3pBSNSdSbK6El55FkLI&w=1920&q=75"/></p><p>The test pyramid illustrates the following dilemma. The more I move upwards with my test scenario, the more effort, time and costs arise.</p><h2>Unit tests</h2><p><span>When creating unit tests, we write test cases to check the expected behavior. The component we are testing is free of all its dependencies and we keep their behavior under control with the help of mocks. These types of tests cannot guarantee that they are free of errors. If the developer of the module had a logic error in the implementation of the component, this error will also occur in the tests – regardless of whether the developer has first implemented the tests and then the code. One possibility to solve this is Extreme Programming, in which the developers continuously alternate between writing the tests and implementing the functionality.</span></p><p><img alt="Unit Test" loading="lazy" width="700" height="205" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FtC9jfcdCSduMXPnZB2N4&w=750&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FtC9jfcdCSduMXPnZB2N4&w=1920&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FtC9jfcdCSduMXPnZB2N4&w=1920&q=75"/></p><h2>Integration tests</h2><p><span>In order to allow the developers and stakeholders to spend more free time and relaxed weekends with family and friends, we write integration tests after the unit tests. These test the interaction of individual components. </span><span>Integration tests are ideally run automatically after the successfully tested unit tests and test-interdependent components.</span></p><p><img alt="Integration Test" loading="lazy" width="700" height="135" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Fn4ihkVHcTzilBOUstqC6&w=750&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Fn4ihkVHcTzilBOUstqC6&w=1920&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Fn4ihkVHcTzilBOUstqC6&w=1920&q=75"/></p><p><span>Thanks to high test coverage and automation, we achieve a very stable state of our application, but who does not know this unpleasant feeling on the way to the most beautiful place in the world? What I mean is production, where our software has to show how good it really is. </span><span>Only under real conditions can we see how all the individual components of the overall architecture behave. This unpleasant feeling has even been reinforced by the use of modern microservice architectures.</span></p><h2>Erosion of the software architecture</h2><p><span>In the age of loosely coupled microservices, we arrive at software architectures that can be summarized under the umbrella term ‘distributed systems’. It’s easy to understand individual systems – and they can be deployed and scaled quickly – but in most cases this leads to an architecture like the following one:</span></p><p><img alt="Architecture Erosion" loading="lazy" width="700" height="483" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FO2pScfvUQ96i8cghtN0o&w=750&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FO2pScfvUQ96i8cghtN0o&w=1920&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FO2pScfvUQ96i8cghtN0o&w=1920&q=75"/></p><p><span>I love architecture diagrams, since they give us a clear and abstract view of the software being developed. However, they are also able to hide all the evil pitfalls and mistakes. They are especially good at obscuring the underlying layers and hardware. In real-life production environments, the following architectural diagram is closer to the status quo:</span></p><p><img alt="Architecture Erosion real" loading="lazy" width="700" height="483" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2F67uDrtVREebMCeRkcUn3&w=750&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2F67uDrtVREebMCeRkcUn3&w=1920&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2F67uDrtVREebMCeRkcUn3&w=1920&q=75"/></p><p><span>The load balancer doesn’t know all instances of the gateway or cannot reach them in the network due to a firewall rule. Several applications are dead, but service discovery doesn’t notice the failure. Additionally, service discovery can’t synchronize and delivers varying results. The load cannot be distributed due to missing instances, and this leads to an increased load on the individual nodes. And anyway – why does the twelve-hour batch have to run during the day and why does it need twelve hours?!</span></p><p><span>I’m sure you’ve had similar experiences. You probably know what it means to deal with defective hardware, faulty virtualization, incorrectly configured firewalls or tedious coordination within your company.</span></p><p><span>At times, statements like the following come up during discussion: “There is no chaos here, everything runs its usual course.” It may be hard to believe, but an entire industry lives from selling us ticket systems so we can control and document the chaos that exists. The following quote from a movie that my children enjoy describes our everyday life well:</span></p><blockquote><p><i><span>Chaos is the engine that drives the world</span></i></p></blockquote><h2><span>API heaven vs backend hell</span></h2><p><span>APIs suggest an intact world where we get exactly what we need via simple API calls, with well-defined inputs and outputs. We use myriad APIs to protect us from direct interaction with hell (backend/API implementation). Countless layers of abstractions are implemented in which Hades, god of the underworld, is doing his mischief. He makes sure that not a single API call ever comes back unscathed. Okay, I exaggerate, but you know what I’m getting at.</span></p><p><span>Netflix shows what this can lead to, so let’s take a quick look at their architecture to better understand the potential complexity of modern microservice architectures. The following picture is from 2013:</span></p><p><img alt="Netflix Architecture 2013" loading="lazy" width="700" height="532" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FtB7DczkaSSahM1Gq2hLR&w=750&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FtB7DczkaSSahM1Gq2hLR&w=1920&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FtB7DczkaSSahM1Gq2hLR&w=1920&q=75"/></p><p><em><span>Reprinted from A. Tseitlin, “Resiliency through failure”, QCon NY, 2013</span></em></p><p><span>This is even more impressive how well Netflix’s architecture works and can react to all the possible errors. If you watch a talk by a Netflix developer, you will find the statement “nobody knows how and why this works”. This insight has brought Chaos Engineering to life at Netflix.</span></p><h2><span>Don’t try this at home</span></h2><p><span>Before you start your first chaos experiments, make sure that your services can already apply a resilience pattern and deal with the possible errors.<br/> </span></p><blockquote><p><i><span>Chaos Engineering doesn´t cause problems. It reveals them.<br/> </span></i><i><span>Nora Jones </span></i><i><span><br/> </span></i><i><span>Senior Chaos Engineer at Netflix</span></i></p></blockquote><p><span>As Nora Jones from Netflix rightfully points out, Chaos Engineering is not about creating chaos, but about preventing it. So, if you want to begin your chaos experiments, start small and ask yourself the following questions in advance:</span></p><p><img alt="" loading="lazy" width="581" height="531" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FB4ZGao9HQ5ClfFjeW0jj&w=640&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FB4ZGao9HQ5ClfFjeW0jj&w=1200&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FB4ZGao9HQ5ClfFjeW0jj&w=1200&q=75"/></p><p><em>Decision Helper – inspired by Russ Miles</em></p><p><span>Once again, it makes no sense to commence engineering chaos if your infrastructure – and especially your services – are not prepared for it. Heed this very important instruction, and we’ll now begin our journey into Chaos Engineering.<br/> </span></p><h2><span>Rules of Chaos Engineering</span></h2><ol><li><span>Talk to your colleagues about the planned chaos experiments in advance!</span></li><li><span>If you know your chaos experiment will fail, <strong>don’t do it!</strong></span></li><li><span>Chaos shouldn’t come as a surprise, your aim is to prove the hypothesis.</span></li><li><span>Chaos Engineering helps you understand your distributed systems better.</span></li><li><span>Limit the blast radius of your chaos experiments.</span></li><li><span>Always be in control of the situation during the chaos experiment!</span></li></ol><h2><span>Principles of Chaos Engineering</span></h2><p><span>In Chaos Engineering, you should go through the five phases described below and keep control of your experiment at all times. Start small, and keep the potential blast radius of your experiments small as well. Simply pulling a plug somewhere and seeing what happens has absolutely nothing to do with Chaos Engineering! We don’t cause uncontrolled chaos; we actively fight to prevent it.</span></p><p><span>I warmly recommend the site<a href="http://principlesofchaos.org/" target="_blank"> PrinciplesOfChaos.org</a> and the free ebook “<a href="https://www.oreilly.com/webops-perf/free/chaos-engineering.csp" target="_blank">Chaos Engineering</a> ” written by the authors: Casey Rosenthal, Lorin Hochstein, Aaron Blohowiak, Nora Jones, Ali Basiri</span></p><h2><span>Phases of Chaos Engineering</span></h2><p><img alt="" loading="lazy" width="661" height="81" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FbaqIkXETi6Msw89gmUSs&w=750&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FbaqIkXETi6Msw89gmUSs&w=1920&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FbaqIkXETi6Msw89gmUSs&w=1920&q=75"/></p><h2>Steady state</h2><p><span>It is essential to define metrics which give you a reliable statement about the overall state of your system. These metrics must be continuously monitored during the chaos experiments. As a nice side effect, you can also monitor these metrics outside of your experiments.</span></p><p><span>Metrics can be both technical or business metrics – I’d say that business metrics outweigh technical metrics. Netflix monitors the number of successful clicks to start a video during a chaos experiment; this is their core metric and it comes from the business domain. Customers not being able to start videos have a direct effect on customer satisfaction. For example, if you run an online shop, the number of successful orders or the number of articles placed in the shopping basket would be important business metrics.</span></p><h2><span>Hypothesis</span></h2><p><span>Think about what should happen in advance, and then prove it through your experiment. If your hypothesis is invalidated, you must locate the error based on the findings and bring it up with your team or company. This is sometimes the hardest part – definitely avoid finger-pointing and scapegoating! As a chaos engineer, your goal is to understand how the system behaves and to present this knowledge to the developers. This is why it’s important to get everyone on board early and to let them participate in your experiments.</span></p><h2><span>Real-world events</span></h2><p><span>What awaits us in real life? What new mistakes could happen, and which ones already ruined our previous weekends? These and other questions must be asked and tested for in a controlled experiment.</span></p><p><span>Potential examples include:</span></p><ul><li><span>Failure of a node in a Kafka cluster</span></li><li><span>Dropped network packets</span></li><li><span>Hardware errors</span></li><li><span>Insufficient max-heap-size for the JVM</span></li><li><span>Increased latency</span></li><li><span>Malformed responses</span></li></ul><p><span>You can extend the list however you like and it will always be closely linked to the chosen architecture. Even if your application is not hosted at one of the well-known cloud providers, things will go wrong in your own company’s data center. I strongly suspect you could tell me a thing or two about it!</span></p><h2><span>Chaos experiment example</span></h2><p><span>Say we have several microservices connected via a REST API and using service discovery. The ‘Product Service’ maintains a local cache of the stock from the ‘Warehouse Service’ as a safeguard. Data from the cache should always be delivered if the Warehouse Service has not replied within 500ms. We can achieve this behavior in the Java environment, for example with <a href="https://github.com/Netflix/Hystrix" target="_blank">Hystrix</a> </span><span> or <a href="https://github.com/resilience4j/resilience4j" target="_blank">resilience4j</a> </span><span>. Thanks to these libraries, we can implement fallbacks and other resilience patterns very easily and effectively.</span></p><h3>Environment</h3><p><img alt="Chaos Experiment" loading="lazy" width="700" height="481" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FoX4PXipSRFeCHU0zdbj7&w=750&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FoX4PXipSRFeCHU0zdbj7&w=1920&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FoX4PXipSRFeCHU0zdbj7&w=1920&q=75"/></p><p><span>Below you will find the information required for a successful experiment.</span></p><p><strong>Target<br/> </strong><span>Warehouse Service</span></p><p><strong>Experiment Type<br/> </strong>Latency</p><p><strong>Hypothesis<br/> </strong><span>Due to the increased latency when the Warehouse Service is called, 30% of the requests are delivered using the local cache of the Product Service.</span></p><p><strong>Blast Radius<br/> </strong><span>Product-Service & Warehouse Service</span></p><p><strong>Status – Before<br/> </strong>OK</p><p><strong>Status – After<br/> </strong>ERROR</p><p><strong>Finding<br/> </strong><span>Product Service fallback failed and led to exceptions, since the cache could not answer all requests.</span></p><p><span>As you can see from the result, we used resilience patterns but still had errors. These errors must be eliminated and tested for by running the experiment again.</span></p><h2>Automated experiments</h2><p><span>Chaos Engineering must be operated continuously. Your systems are also constantly changing: new versions are going into production, hardware is being replaced, firewall rules are adapted and servers are restarted. The elegant way is to establish the culture of Chaos Engineering in your company and in the minds of its people. Netflix achieved this by letting the Simian Army loose on the products of their developers – in production! They decided at some point to only do this during working hours, but still they do it.</span></p><h2>Environment</h2><p><span>For your first chaos experiments, please choose an environment that is identical to the one in production. You will not gain any meaningful insights in a test environment where nothing is going on and that does not correspond to the setup of the platform in production. Once you’ve gained initial insights and made improvements, you can move on to production and carry out your experiments there as well. The aim of Chaos Engineering is to run it in production, always being in control of the situation and keeping customers unaffected.</span></p><h2><span>First steps into Chaos Engineering</span></h2><p><span>At first, it was difficult for me to internalize and explore the ideas of Chaos Engineering in everyday life. I am not a senior chaos engineer working at Netflix, Google, Facebook or Uber. The customers I support with my expertise are just beginning to grasp and implement the principles and designs of microservices. However, what I almost always found was Spring Boot! Sometimes stand-alone, sometimes packed in a Docker container. My demos, which I use in my talks at conferences, always included at least one Spring Boot application. This led to the birth of the Chaos Monkey for Spring Boot, which makes it possible to attack existing Spring Boot applications without modifying a single line of code.</span></p><h2><span>Chaos Monkey for Spring Boot</span></h2><p><span>All relevant information about how Chaos Monkey for Spring Boot can help you on your way to a stable Spring Boot infrastructure can be found here on <a href="https://codecentric.github.io/chaos-monkey-spring-boot/" target="_blank">GitHub</a> </span><span>.</span></p><p><img alt="Chaos Monkey for Spring Boot" loading="lazy" width="250" height="250" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FJL7UQEugTpGGT0I4v8kQ&w=256&q=75 1x, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FJL7UQEugTpGGT0I4v8kQ&w=640&q=75 2x" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2FJL7UQEugTpGGT0I4v8kQ&w=640&q=75"/></p><h2>Conclusion</h2><p><span>I hope I could provide you with a basic understanding of the ideas and principles behind Chaos Engineering. This topic is very important and we have a lot of catching up to do, even though we don’t work at Netflix and Co. I love my job, but even more, I love my personal life with family and friends. I don’t want to spend endless evenings and weekends fixing Prio 1 tickets; Chaos Engineering gives us confidence in the performance of a system to better withstand the turbulent conditions in production.</span></p></div><div class="BlogBody-module-scss-module__Q1LjWG__c-blog-body__share-outer-container"><h6 class="BlogBody-module-scss-module__Q1LjWG__c-blog-body__share-heading">Was this post helpful?</h6><div class="BlogBody-module-scss-module__Q1LjWG__c-blog-body__share-container"><div><ul class="Socialmedia-module-scss-module__r39wJG__c-social-media__social-media-container"><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://www.codecentric.de" target="_blank" rel="noopener noreferrer"><img src="/facebook.svg" alt="Facebook"/></a></li><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://twitter.com/intent/tweet?url=https://www.codecentric.de" target="_blank" rel="noopener noreferrer"><img src="/twitter.svg" alt="Twitter"/></a></li><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://www.linkedin.com/sharing/share-offsite/?url=https://www.codecentric.de" target="_blank" rel="noopener noreferrer"><img src="/linkedin.svg" alt="LinkedIn"/></a></li></ul></div></div></div></div></div><div class="blogPost-module-scss-module__mIGxdW__l-post-container__right"><div class="blogPost-module-scss-module__mIGxdW__l-post-container__sticky-bar"><div class="ShareLikeBar-module-scss-module__4ICYgq__share-like-bar-container"><div class="ShareLikeBar-module-scss-module__4ICYgq__share-like-bar__heading"><p><small>share post</small></p></div><div class="ShareLikeBar-module-scss-module__4ICYgq__share-like-bar__gap-container"><div><ul class="Socialmedia-module-scss-module__r39wJG__c-social-media__social-media-container--column"><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://www.facebook.com/sharer/sharer.php?u=https://www.codecentric.de" target="_blank" rel="noopener noreferrer"><img src="/facebook.svg" alt="Facebook"/></a></li><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://twitter.com/intent/tweet?url=https://www.codecentric.de" target="_blank" rel="noopener noreferrer"><img src="/twitter.svg" alt="Twitter"/></a></li><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://www.linkedin.com/sharing/share-offsite/?url=https://www.codecentric.de" target="_blank" rel="noopener noreferrer"><img src="/linkedin.svg" alt="LinkedIn"/></a></li></ul></div></div></div></div></div></div><div class="MorePosts-module-scss-module__omF6Lq__c-more-posts__no-posts undefined"><div class="MorePosts-module-scss-module__omF6Lq__c-more-posts__top"></div><div class="MorePosts-module-scss-module__omF6Lq__c-more-posts__comment-card-container"><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card CommentCard-module-scss-module__8xfY2a__c-comment-card--blog-post-position"><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__left-container"><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__flex-c"><h6>Blog author</h6><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__flex"><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__author"><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__left"><button><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="160px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2Fcm7lyojlb013i07t5c34cbil9%2Fresize%3Dheight%3A800%2Fcm7n0ok9oflhb07up35496zci&w=3840&q=75"/></button><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__bottom"><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__author CommentCard-module-scss-module__8xfY2a__icon-w"><p>Benjamin<!-- --> <!-- -->Wilms</p><span></span></div><p></p></div></div><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__speech-bubble CommentCard-module-scss-module__8xfY2a__hide-on-desktop"><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__triangle"></div><p>Do you still have questions? Just send me a message.</p><button rel="" aria-label="Get in contact" type="button" class="ButtonPrimary-module-scss-module__L8py9W__c-button-primary ButtonPrimary-module-scss-module__L8py9W__fill">Get in contact<span></span></button></div></div><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__author"></div></div></div></div><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__speech-bubble CommentCard-module-scss-module__8xfY2a__hide-on-mobile"><div class="CommentCard-module-scss-module__8xfY2a__c-comment-card__triangle"></div><p>Do you still have questions? Just send me a message.</p><button rel="" aria-label="Get in contact" type="button" class="ButtonPrimary-module-scss-module__L8py9W__c-button-primary ButtonPrimary-module-scss-module__L8py9W__fill">Get in contact<span></span></button></div></div></div></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading"><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__main-heading"><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__upper-heading"><span>//</span><h4>More articles in this subject area</h4></div><p class="SimilarPosts-module-scss-module__anu20q__c-section-heading__flex-container">Discover exciting further topics and let the codecentric world inspire you.</p></div></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__bottom"><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__triangle-container"><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__triangle"></div></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__card-container"><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slider"><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/the-human-side-of-the-ai-transformation"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">The Human Side of the AI Transformation</h3><p>The Human Side of AI Transformation
|
||
Why we should talk not just about productivity – but also about identity, cognitive load, and the future of professional expertise
|
||
"AI won't replace developers – but developers who use AI will replace those who don't...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Change Management</li><li>Generative AI</li><li>Resilience</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>17.7.2026<!-- --> <span>|</span> <!-- -->6<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmlq9ve8q8bhf07umx9qbld2w&w=3840&q=75"/><p><small>Melanie<!-- --> <!-- -->Volk</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/why-every-redesign-breaks-your-playwright-project-and-how-three-layers-prevent-it"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Why every redesign breaks your Playwright project – and how three layers...</h3><p>TL;DR: We show how a structural separation of UI selectors and business logic can look like when using Playwright, adapting the proven Robot Pattern into the Layered Robot Pattern.
|
||
This way, browser automation can proceed without fear of UI changes. ...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>AI</li><li>Software development</li><li>Frontend</li><li>Testing</li><li>Pattern</li><li>UX/UI</li><li>Test Driven Development</li><li>Software architecture</li><li>Resilience</li><li>Webdevelopment</li><li>BDD</li><li>Android</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>3.7.2026<!-- --> <span>|</span> <!-- -->9<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FchXhvTBRJ23PaqwTxtV9&w=3840&q=75"/><p><small>Lars<!-- --> <!-- -->Jouon</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FJH7eLMGqTEidWiaSQvgQ&w=3840&q=75"/><p><small>Rebecca <!-- --> <!-- -->Jox</small></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/ensuring-accessibility-with-ai-what-works-today-and-what-doesnt"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Ensuring accessibility with AI: what works today (and what doesn't)</h3><p>Since June 2025, the Barrierefreiheitsstärkungsgesetz (BFSG), Germany's law implementing the European Accessibility Act, has been in effect. Most teams know they should be doing something about it, but in day-to-day work, the topic usually falls by the...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Accessibility</li><li>AI</li><li>UX/UI</li><li>Testing</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>2.6.2026<!-- --> <span>|</span> <!-- -->11<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/playwright-auth-mocking-done-right"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Playwright Auth Mocking Done Right: No Runtime Flags, No Factory Patterns...</h3><p>When you work on a project that uses a third-party authentication provider, you will inevitably face this question: how do I run my Playwright tests without dealing with real login flows? Real authentication involves browser redirects, multi-factor prompts...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Frontend</li><li>Testing</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>28.5.2026<!-- --> <span>|</span> <!-- -->8<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FeirltPevQLufs0ljJXzM&w=3840&q=75"/><p><small>Maryna<!-- --> <!-- -->Tochkova</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/16000-tests-in-4-days-reaching-80-percent-test-coverage-with-claude-code"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">16,000 Tests in 4 Days – Reaching 80% Test Coverage with Claude Code</h3><p>The Starting Point
|
||
When we at codecentric recently took over a codebase from a previous service provider for a client, it quickly became clear that this would be no ordinary challenge. Backends, frontends, batch jobs, services — a grown application landscape...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>AI</li><li>Software development</li><li>Testing</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>5.5.2026<!-- --> <span>|</span> <!-- -->12<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FgNBKQv6mQ5Sdro7NBdog&w=3840&q=75"/><p><small>Selvarajah<!-- --> <!-- -->Sivarupan</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/ai-code-tsunami-hits-the-qa-dam"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">AI Code Tsunami Hits the QA Dam: The End of Balanced Velocity</h3><p>Note upfront: This article is specifically aimed at teams working on the modernization and further development of existing systems, not at greenfield projects where completely different rules apply. Everyone is talking about the massive productivity ...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Generative AI</li><li>AI</li><li>DevOps</li><li>Test Driven Development</li><li>Testing</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>30.3.2026<!-- --> <span>|</span> <!-- -->8<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/nested-fixture-pattern-for-junit"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Nested Fixture Pattern for JUnit</h3><p>JUnit's [@Nested][nested] classes are usually presented as a way to group related tests. But combined
|
||
with [@RegisterExtension][register-extension] and [ExtensionContext.Store][store], they become something more
|
||
powerful: a declarative scenario
|
||
tree ...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Testing</li><li>Java</li><li>Software development</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>9.3.2026<!-- --> <span>|</span> <!-- -->11<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FYnpmshtQry6nrot8Sxg0&w=3840&q=75"/><p><small>Rüdiger<!-- --> <!-- -->zu Dohna</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/dont-let-your-ai-cheat-isolated-specification-testing-with-claude-code"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Don't Let Your AI Cheat: Isolated Specification Testing with Claude Code</h3><p>AI agents are powerful — but they will cheat if you let them. Letting the
|
||
same agent develop and test your application risks one thing: it will no
|
||
longer fulfill the specification, it will simply learn to pass the tests.
|
||
This article shows how to ...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>AI</li><li>LLM</li><li>Testing</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>2.3.2026<!-- --> <span>|</span> <!-- -->12<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F1xcrjaGOSVqFuqYsJIIM&w=3840&q=75"/><p><small>Thomas<!-- --> <!-- -->Jaspers</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/hexagonal-architecture-is-just-an-island"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Hexagonal Architecture is just an island</h3><p>Imagine an island called "Alistair Island." This island is a vibrant place with houses, fertile soil, and a well-coordinated community of residents who live by well-defined routines. Every activity on the island has significance and serves a specific...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Software architecture</li><li>Testing</li><li>Software development</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>22.1.2025<!-- --> <span>|</span> <!-- -->10<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FBrR7521yTwuL6jMOBY0a&w=3840&q=75"/><p><small>Danny<!-- --> <!-- -->Keller</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/charge-your-apis-volume-33-definition-based-api-mocking-simulation-and-testing-with-microcks-part-3-contract-testing-and-consistent-mock-environments"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Charge your APIs Volume 33 - Definition-Based API Mocking, Simulation,...</h3><p>Key TakeawaysThis article is the third and last one in a three-part series about definition-based API mocking, simulation, and testing with Microcks (make sure you have read the first and second article)The previous articles focused on (i) Microcks’ ...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Testing</li><li>API</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>23.10.2024<!-- --> <span>|</span> <!-- -->11<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=3840&q=75"/><p><small>Dr. Florian<!-- --> <!-- -->Rademacher</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/charge-your-apis-volume-32-definition-based-api-mocking-simulation-and-testing-with-microcks-part-2-specification-of-mock-data-request-validations-and-routes"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Charge your APIs Volume 32 - Definition-Based API Mocking, Simulation,...</h3><p>Key TakeawaysThis article is the second one in a three-part series about definition-based API mocking, simulation, and testing with Microcks (make sure you have read the first article)While the previous article concentrated on Microcks’ architecture,...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>API</li><li>Testing</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>16.10.2024<!-- --> <span>|</span> <!-- -->11<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=3840&q=75"/><p><small>Dr. Florian<!-- --> <!-- -->Rademacher</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/charge-your-apis-volume-31-definition-based-api-mocking-simulation-and-testing-with-microcks-part-1-introduction"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Charge your APIs Volume 31 - Definition-Based API Mocking, Simulation,...</h3><p>Key TakeawaysAPI mocking used, e.g., for integration testing, is challenging as it assumes conformance to mocked API functionality, which can incur significant costs as mock complexity increases with API complexityDefinition-based API mocking can reduce...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>API</li><li>Testing</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>9.10.2024<!-- --> <span>|</span> <!-- -->9<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FU64hKnGTf6d3Q0kvbuLX&w=3840&q=75"/><p><small>Dr. Florian<!-- --> <!-- -->Rademacher</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/playwright-tests-and-api-mocking"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Playwright tests and API Mocking</h3><p>Problem definition
|
||
Playwright tests can sometimes depend on external services such as APIs, which might happen to be unavailable at times. In this case there are several options for executing these tests adequately, as described below. Actually call ...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Testing</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>10.5.2024<!-- --> <span>|</span> <!-- -->4<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FTvcARJoRS5Geufzla5mE&w=3840&q=75"/><p><small>Ege<!-- --> <!-- -->Inanc</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/charge-your-apis-volume-25-contract-testing"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Charge your APIs Volume 25: Contract Testing</h3><p>I feel the way we do integration testing is sort of like setting your house on fire to test your smoke alarm. It is excessive, tiresome and way too costly. This is not a quote from myself. I typically don't come up with such good ideas when I need....</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Testing</li><li>Software development</li><li>API</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>2.4.2024<!-- --> <span>|</span> <!-- -->11<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcms7hzqahv2qc07uhv0jesk07&w=3840&q=75"/><p><small>Pasquale<!-- --> <!-- -->Brunelli</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/ab-testing-tool-support-testing-growthbook"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">A/B Testing: Tool support and testing GrowthBook</h3><p>In the previous blog post we introduced some general concepts of A/B testing: we explored the main aspects, defined test types and explained the most common statistical methods.
|
||
Now we want to explore the areas in which A/B testing tools can provide...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Testing</li><li>Python</li><li>Data</li><li>UX/UI</li><li>Analysis</li><li>JavaScript</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>18.3.2024<!-- --> <span>|</span> <!-- -->20<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=3840&q=75"/><p><small>Francesca<!-- --> <!-- -->Diana</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/ab-testing-an-introduction"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">A/B Testing: An introduction</h3><p>This blog series aims to aid teams who are contemplating adding A/B testing to their toolkit but are unsure of which tool to use. In addition to helping with tool selection, the series also provides the entire team with a consistent initial understanding...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Testing</li><li>Data</li><li>UX/UI</li><li>Analysis</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>6.2.2024<!-- --> <span>|</span> <!-- -->29<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FaJX5gx3SMmWHNwO1Llnv&w=3840&q=75"/><p><small>Francesca<!-- --> <!-- -->Diana</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/charge-your-apis-volume-19-understanding-problem-details-for-http-apis-a-deep-dive-into-rfc-7807-and-rfc-9457"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Charge your APIs Volume 19: Understanding Problem Details for HTTP APIs...</h3><p>In today's ever-changing web development landscape, HTTP APIs have become indispensable, powering a myriad of applications and services across the internet. They act as the vital communication backbone, enabling smooth data exchanges between different...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>API</li><li>Resilience</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>30.11.2023<!-- --> <span>|</span> <!-- -->16<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=3840&q=75"/><p><small>Daniel<!-- --> <!-- -->Kocot</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/count-your-queries-repository-integration-tests-hibernate-statistics"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Count your queries! Repository integration tests with Hibernate Statistics</h3><p>If you are using Spring Data JPA as a data access framework, Hibernate is almost certainly hiding under the hood. And although this setup takes a lot of work off your hands by doing a lot of awesome things, the final outcome should better be checked....</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Java</li><li>Testing</li><li>Spring</li><li>Database</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>7.8.2023<!-- --> <span>|</span> <!-- -->6<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2dZ7KKy0T42Szax5VZGZ&w=3840&q=75"/><p><small>Kevin<!-- --> <!-- -->Peters</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/charge-your-apis-volume-6-perfecting-your-apiops-harnessing-the-power-of-k6-for-api-testing"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Charge your APIs Volume 6: Perfecting Your APIOps - Harnessing the Power...</h3><p>Our journey through the expansive landscape of API Operations (APIOps) has led us through various territories. We've delved into Continuous Integration and Deployment, ensuring seamless transitions from coding to production-ready APIs with minimal friction...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>API</li><li>Testing</li><li>GitHub</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>14.6.2023<!-- --> <span>|</span> <!-- -->2<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=3840&q=75"/><p><small>Daniel<!-- --> <!-- -->Kocot</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div><div class="SimilarPosts-module-scss-module__anu20q__c-section-heading__slide-container"><a id="" class="PostCard-module-scss-module__NOZdJa__c-post-card" href="/en/knowledge-hub/blog/charge-your-apis-volume-4-streamlining-api-operations-with-continuous-integration"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__top"><p class="PostCard-module-scss-module__NOZdJa__subtitle"></p><h3 class="h5">Charge your APIs Volume 4: Streamlining API Operations with Continuous...</h3><p>API operations refer to the maintenance and management of APIs (Application Programming Interfaces) throughout their lifecycle. This includes everything from design and development to testing, deployment, and ongoing maintenance.
|
||
Continuous Integration...</p><ul class="PostCard-module-scss-module__NOZdJa__c-post-card__list"><li>Testing</li><li>API</li></ul><p class="PostCard-module-scss-module__NOZdJa__c-post-card__info"><img src="/icon-calendar.svg"/><small>31.5.2023<!-- --> <span>|</span> <!-- -->6<!-- --> <!-- -->minutes reading time</small></p></div><div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__border"><div class="PostCard-module-scss-module__NOZdJa__triangle"></div></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__bottom-info-container"><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><img alt="" loading="lazy" width="1200" height="1200" decoding="async" data-nimg="1" style="color:transparent" sizes="80px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2F2BliEDPmQUKkgbGgoMjP&w=3840&q=75"/><p><small>Daniel<!-- --> <!-- -->Kocot</small></p></div><div class="PostCard-module-scss-module__NOZdJa__c-post-card__author"><p></p></div></div></div></a></div></div></div></div></main><footer class="Footer-module-scss-module__ujhC8q__c-footer"><div class="Footer-module-scss-module__ujhC8q__c-footer__inner-container"><div class="Footer-module-scss-module__ujhC8q__c-footer__top"><div class="Footer-module-scss-module__ujhC8q__c-footer__block"><div class="Footer-module-scss-module__ujhC8q__c-footer__collapse-heading"><p>The company</p> <span></span></div><ul class="Footer-module-scss-module__ujhC8q__c-footer__links"><li><a href="/en/about-us">About us</a></li><li><a href="/en/news">News</a></li><li><a href="/en/contact">Contact us</a></li></ul></div><div class="Footer-module-scss-module__ujhC8q__c-footer__block"><div class="Footer-module-scss-module__ujhC8q__c-footer__collapse-heading"><p>codecentric for you</p> <span></span></div><ul class="Footer-module-scss-module__ujhC8q__c-footer__links" tabindex="-1"><li><a href="/wissens-hub/softwerker">Softwerker (DE)</a></li><li><a href="/en/knowledge-hub/blog">Blog</a></li><li><a href="https://www.codecentric.de/rss/feed.xml">RSS-Feed (blog)</a></li></ul></div><div class="Footer-module-scss-module__ujhC8q__c-footer__block"><div class="Footer-module-scss-module__ujhC8q__c-footer__collapse-heading"><p>Sitemap</p> <span></span></div><div class="Footer-module-scss-module__ujhC8q__c-footer__links"><ul class="Footer-module-scss-module__ujhC8q__c-footer__links-column" tabindex="-1"><li><a href="/en/services">Services</a></li><li><a href="/en/how-we-work">How we work</a></li><li><a href="/en/references">References</a></li></ul><ul class="Footer-module-scss-module__ujhC8q__c-footer__links-column" tabindex="-1"><li><a href="/en/careers">Careers</a></li><li><a href="/en/locations">Locations</a></li><li><a href="/en/media">Media</a></li></ul></div></div><div class="Footer-module-scss-module__ujhC8q__c-footer__block"><div class="Footer-module-scss-module__ujhC8q__c-footer__collapse-heading"><p>Legal matters</p> <span></span></div><ul class="Footer-module-scss-module__ujhC8q__c-footer__links" tabindex="-1"><li><a href="/en/imprint">Imprint</a></li><li><a href="/en/privacy-policy">Privacy policy</a></li><li><button type="button" class="ButtonConsentManagement-module-scss-module__vtYYGG__c-button-consent-management" aria-label="Privacy Settings: Open cookie and privacy dialog">Privacy Settings</button></li></ul></div></div><div class="Footer-module-scss-module__ujhC8q__c-footer__bottom"><div class="Footer-module-scss-module__ujhC8q__c-footer__flex"><div class="Footer-module-scss-module__ujhC8q__c-footer__logo-container"><a href="/en"><img alt="Logo der codecentric AG, einem in Deutschland führenden IT-Consulting Unternehmen" loading="lazy" width="1099" height="137" decoding="async" data-nimg="1" style="color:transparent" sizes="300px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FK1lI4UPCSUuKSWZHgd4D&w=3840&q=75"/></a></div><div class="Footer-module-scss-module__ujhC8q__c-footer__social-media-container"><div><ul class="Socialmedia-module-scss-module__r39wJG__c-social-media__social-media-container"><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://facebook.com/codecentric" target="_blank" rel="noopener noreferrer"><img src="/facebook.svg" alt="Facebook"/></a></li><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://www.youtube.com/codecentricAG" target="_blank" rel="noopener noreferrer"><img src="/youtube.svg" alt="YouTube"/></a></li><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://de.linkedin.com/company/codecentric-ag" target="_blank" rel="noopener noreferrer"><img src="/linkedin.svg" alt="LinkedIn"/></a></li><li class="Socialmedia-module-scss-module__r39wJG__c-social-media__icons"><a href="https://www.instagram.com/codecentricag/" target="_blank" rel="noopener noreferrer"><img src="/instagram.svg" alt="Instagram"/></a></li></ul></div></div></div><div class="Footer-module-scss-module__ujhC8q__c-footer__image-row"><img alt="TÜV ISO 27001-Logo" loading="lazy" width="476" height="250" decoding="async" data-nimg="1" style="color:transparent" sizes="150px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=3840&q=75"/><img alt="codecentric unterzeichnet Charta der Vielfalt" loading="lazy" width="600" height="250" decoding="async" data-nimg="1" style="color:transparent" sizes="150px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=3840&q=75"/><img alt="codecentric ist Partner der Allianz für Cyber-Sicherheit" loading="lazy" width="600" height="250" decoding="async" data-nimg="1" style="color:transparent" sizes="150px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=3840&q=75"/></div></div><div class="Footer-module-scss-module__ujhC8q__c-footer__image-row__mobile"><img alt="TÜV ISO 27001-Logo" loading="lazy" width="476" height="250" decoding="async" data-nimg="1" style="color:transparent" sizes="150px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcm9wozd3khswq07ups4bzpo6c&w=3840&q=75"/><img alt="codecentric unterzeichnet Charta der Vielfalt" loading="lazy" width="600" height="250" decoding="async" data-nimg="1" style="color:transparent" sizes="150px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2FqxlgaSe9TGqmoFZll4Be&w=3840&q=75"/><img alt="codecentric ist Partner der Allianz für Cyber-Sicherheit" loading="lazy" width="600" height="250" decoding="async" data-nimg="1" style="color:transparent" sizes="150px" srcSet="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=16&q=75 16w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=32&q=75 32w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=48&q=75 48w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=64&q=75 64w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=96&q=75 96w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=128&q=75 128w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=256&q=75 256w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=320&q=75 320w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=350&q=75 350w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=384&q=75 384w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=480&q=75 480w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Feu-central-1.graphassets.com%2FAiE4QoWSSiIQO3k152ugkz%2Foutput%3Dformat%3Awebp%2Fcmrosza3hhhos07unv6kqgujk&w=3840&q=75"/></div></div></footer></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"serverState":{"initialResults":{"articles_created_at_desc":{"state":{"facets":[],"disjunctiveFacets":[["locale","tags.title","location"]],"hierarchicalFacets":[],"facetsRefinements":{},"facetsExcludes":{},"disjunctiveFacetsRefinements":{"locale,tags.title,location":[]},"numericRefinements":{},"tagRefinements":[],"hierarchicalFacetsRefinements":{},"index":"articles_created_at_desc","hitsPerPage":11,"query":"","maxValuesPerFacet":10},"results":[{"hits":[],"nbHits":0,"nbPages":0,"page":0,"processingTimeMS":0,"hitsPerPage":0,"exhaustiveNbHits":false,"query":"","params":""}],"requestParams":[{"facets":[["locale","tags.title","location"]],"hitsPerPage":11,"maxValuesPerFacet":10,"query":""}]}}},"preview":false,"searchFilterPages":[{"name":"Services","id":"clb1zhzxi2zp20buecntpui9c"},{"name":"Industries","id":"cm9ciiyi7a04i07uh1j39542u"},{"name":"References","id":"cldk1u1izfnzc0butyud5a5xw"},{"name":"Locations","id":"cld0c9fkq9i100aunfvejhnwk"},{"name":"Knowledge Hub","id":"cld4jubok3jxf0bug2mnlrybl"},{"name":"Blog","id":"cl5wmxda7l3mj0ctdbkrp24hi"},{"name":"Careers","id":"cldsusdi7ux2a09tgu8lfxpnk"},{"name":"About us","id":"cld1d5fx4v8jg0aunmmam4imt"},{"name":"Aktuelles","id":"cldmz3qv2zobt09tgrltu42ir"}],"searchFilterTags":["Cloud native","DevOps","IT-Security","Agile methods","Java","Keycloak","Software development","Cloud","Accelerate","Agile","Testing","Community","Collaboration","HR","Webdevelopment","Frontend","Open Source","Atlassian","Green IT"],"topSearchedTerms":[],"noSearchResultsPerson":{"__typename":"ContactOnePersonSection","id":"clg0zudbmcf3i0butcmngac3v","title":{"type":"h3","title":"Konntest du keine Einträge zu deinem Thema finden? "},"description":{"html":"\u003cp\u003eSprich uns gern an. Wir sind offen für deine Ideen und Fragen und freuen uns über den Austausch mit dir.\u003c/p\u003e"},"buttons":[{"id":"clg0zvpecczq50aw5t7z3qgh5","__typename":"ButtonPrimary","locale":"de","title":"Kontakt aufnehmen","pageLink":null,"url":null,"isTargetBlank":false,"downloadAsset":null,"form":{"hubspotFormId":"fcc861ee-8600-4836-adb3-8098ddeaa3ef","hubspotTitle":"[ENG] Contact Us | Sub-Navi-Kontakt oder Zero Search Hits","title":"Contact us","description":"Do you have any questions or would you like to exchange ideas? Happy to help – just enter your contact details."},"ariaLabel":null,"hiddenFields":null,"localizations":[{"pageLink":null}]}],"locationTitle":null,"locationDescription":null,"person1":{"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/iMGZzTHQYujp4kGnZc6C","width":1200,"imageAltText":null},"isImagePublic":true,"isPublic":true,"isAlumni":false,"secondImage":null,"id":"cl7eibwshiau50ct5e3myyh2e","slug":"sarah-duerr","email":"sarah.duerr@codecentric.de","firstName":"Sarah","lastName":"Dürr","hideLastname":false,"jobTitle":"Marketing \u0026 Community Management","biography":null,"stackOverflowUrl":null,"twitterUrl":null,"linkedInUrl":null,"redditUrl":null,"githubUrl":null,"mastodonUrl":null,"pesoData":{"responsibleForLocation":null},"localizations":[{"locale":"de","jobTitle":"Marketing \u0026 Community Management","biography":null}]},"person1Email":null,"person2":null,"person2Email":null,"contactPersonBackgroundColor":null},"uiStrings":[{"identifier":"contactFormError","description":"Contact form error","text":{"html":"\u003cp\u003eError\u003c/p\u003e","text":"Error"}},{"identifier":"contactFormSuccess","description":"Contact form success","text":{"html":"\u003cp\u003eThank you for your request. I will get back to you.\u003c/p\u003e","text":"Thank you for your request. I will get back to you."}},{"identifier":"newsletterFormError","description":"Newsletter form error","text":{"html":"\u003cp\u003eError\u003c/p\u003e","text":"Error"}},{"identifier":"newsletterFormSuccess","description":"Newsletter form success","text":{"html":"\u003cp\u003eThank you for your registration. A confirmation email is on its way to you.\u003c/p\u003e","text":"Thank you for your registration. A confirmation email is on its way to you."}},{"identifier":"previewDescription","description":"Preview description","text":{"html":"\u003cp\u003eThis page is a preview. \u003ca title=\"/api/exit-preview\" href=\"/api/exit-preview\"\u003eClick here\u003c/a\u003e to exit preview mode.\u003c/p\u003e","text":"This page is a preview. \\nClick here\\n to exit preview mode."}},{"identifier":"noSearchResultsFound","description":"No search results found","text":{"html":"\u003cp\u003eSorry, we did not find any matching blog articles to your search. \u003c/p\u003e","text":"Sorry, we did not find any matching blog articles to your search. "}},{"identifier":"wasThisBlogPostHelpful","description":"Was this post helpful?","text":{"html":"\u003cp\u003eWas this post helpful?\u003c/p\u003e","text":"Was this post helpful?"}},{"identifier":"blogPostLike","description":"Blog post like","text":{"html":"\u003cp\u003eLikes\u003c/p\u003e","text":"Likes"}},{"identifier":"blogPostShare","description":"Blog post share","text":{"html":"\u003cp\u003eshare post\u003c/p\u003e","text":"share post"}},{"identifier":"blogPostReadingTime","description":"Blog post reading time","text":{"html":"\u003cp\u003eminutes reading time\u003c/p\u003e","text":"minutes reading time"}},{"identifier":"commentCardTitle","description":"Comment card title","text":{"html":"\u003cp\u003eBlog author\u003c/p\u003e","text":"Blog author"}},{"identifier":"commentCardQuote","description":"Comment card quote","text":{"html":"\u003cp\u003eDo you still have questions? Just send me a message.\u003c/p\u003e","text":"Do you still have questions? Just send me a message."}},{"identifier":"commentCardCTA","description":"Comment card CTA","text":{"html":"\u003cp\u003eGet in contact\u003c/p\u003e","text":"Get in contact"}},{"identifier":"postAuthorContactHandle","description":"Post author contact handle","text":{"html":"\u003cp\u003eProfile\u003c/p\u003e","text":"Profile"}},{"identifier":"postAuthorContactPostsHeading","description":"Post author contact posts heading","text":{"html":"\u003cp\u003eMy blog articles\u003c/p\u003e","text":"My blog articles"}},{"identifier":"postAuthorContactHeading","description":"Post author contact heading","text":{"html":"\u003cp\u003eContact\u003c/p\u003e","text":"Contact"}},{"identifier":"postAuthorContactParagraph","description":"Post author contact paragraph","text":{"html":"\u003cp\u003eYou have questions or want to exchange ideas with me? Gladly - just enter your contact details.\u003c/p\u003e","text":"You have questions or want to exchange ideas with me? Gladly - just enter your contact details."}},{"identifier":"postAuthorContactFormField1","description":"Post author contact form field 1","text":{"html":"\u003cp\u003eFirst name*\u003c/p\u003e","text":"First name*"}},{"identifier":"postAuthorContactFormField2","description":"Post author contact form field 2","text":{"html":"\u003cp\u003eLast name*\u003c/p\u003e","text":"Last name*"}},{"identifier":"postAuthorContactFormField3","description":"Post author contact form field 3","text":{"html":"\u003cp\u003eEmail address*\u003c/p\u003e","text":"Email address*"}},{"identifier":"postAuthorContactFormField4","description":"Post author contact form field 4","text":{"html":"\u003cp\u003eYour message*\u003c/p\u003e","text":"Your message*"}},{"identifier":"postAuthorContactFormParagraph","description":"Post author contact form paragraph","text":{"html":"\u003cp\u003eI have read the \u003ca target=\"_blank\" title=\"https://www.codecentric.de/en/privacy-policy\" href=\"https://www.codecentric.de/en/privacy-policy\"\u003eprivacy statement\u003c/a\u003e of codecentric AG and confirm this by submitting the form.*\u003c/p\u003e","text":"I have read the \\nprivacy statement\\n of codecentric AG and confirm this by submitting the form.*"}},{"identifier":"postAuthorContactFormCTA","description":"Post author contact form CTA","text":{"html":"\u003cp\u003eContact\u003c/p\u003e","text":"Contact"}},{"identifier":"postsCTALoadMore","description":"Posts CTA load more","text":{"html":"\u003cp\u003eLoad more\u003c/p\u003e","text":"Load more"}},{"identifier":"postAuthorContactFormSubmit","description":"Post author contact form submit","text":{"html":"\u003cp\u003eSend\u003c/p\u003e","text":"Send"}},{"identifier":"breadcrumbBlog","description":"Breadcrumb blog","text":{"html":"\u003cp\u003eBlog\u003c/p\u003e","text":"Blog"}},{"identifier":"morePostsHeading","description":"More posts heading","text":{"html":"\u003cp\u003eMore articles\u003c/p\u003e","text":"More articles"}},{"identifier":"morePostsFromAuthor","description":"More posts from author","text":{"html":"\u003cp\u003efrom\u003c/p\u003e","text":"from"}},{"identifier":"similarPostsHeading","description":"Similar posts heading","text":{"html":"\u003cp\u003eMore articles in this subject area\u003c/p\u003e","text":"More articles in this subject area"}},{"identifier":"similarPostsParagraph","description":"Similar posts paragraph","text":{"html":"\u003cp\u003eDiscover exciting further topics and let the codecentric world inspire you.\u003c/p\u003e","text":"Discover exciting further topics and let the codecentric world inspire you."}},{"identifier":"searchPlaceholder","description":"Search placeholder","text":{"html":"\u003cp\u003eSearch by topic or technology\u003c/p\u003e","text":"Search by topic or technology"}},{"identifier":"tagsTitleMobile","description":"Tags title mobile","text":{"html":"\u003cp\u003ePlease click on topics\u003c/p\u003e","text":"Please click on topics"}},{"identifier":"tagsTitle","description":"Tags title","text":{"html":"\u003cp\u003eTopic filter\u003c/p\u003e","text":"Topic filter"}},{"identifier":"tagsCTAMobile","description":"Tags CTA mobile","text":{"html":"\u003cp\u003eReset filter\u003c/p\u003e","text":"Reset filter"}},{"identifier":"languageFilterTitle","description":"Language filter title","text":{"html":"\u003cp\u003eLANGUAGE\u003c/p\u003e","text":"LANGUAGE"}},{"identifier":"blogPostsFeatured","description":"Blog posts featured","text":{"html":"\u003cp\u003eFeatured\u003c/p\u003e","text":"Featured"}},{"identifier":"blogPostsMostLiked","description":"Blog posts most liked","text":{"html":"\u003cp\u003ePopular posts\u003c/p\u003e","text":"Popular posts"}},{"identifier":"newsletterPlaceholder","description":"Newsletter placeholder","text":{"html":"\u003cp\u003eEnter email address\u003c/p\u003e","text":"Enter email address"}},{"identifier":"newsletterParagraph","description":"Newsletter paragraph","text":{"html":"\u003cp\u003eI hereby consent to the collection and processing of the above data for the purpose of receiving the newsletter of codecentric AG by e-mail. You can revoke your consent at any time by sending an e-mail to datenschutz@codecentric.de, by clicking on the link in the information e-mail itself, or by sending an e-mail to the contact details listed in the \u003ca target=\"_blank\" title=\"https://www.codecentric.de/impressum\" href=\"https://www.codecentric.de/impressum\"\u003eimprint\u003c/a\u003e. I have taken note of the \u003ca target=\"_blank\" title=\"https://www.codecentric.de/datenschutz-blog\" href=\"https://www.codecentric.de/datenschutz-blog\"\u003eprivacy policy\u003c/a\u003e of codecentric AG and confirm this by sending the form.*\u003c/p\u003e","text":"I hereby consent to the collection and processing of the above data for the purpose of receiving the newsletter of codecentric AG by e-mail. You can revoke your consent at any time by sending an e-mail to datenschutz@codecentric.de, by clicking on the link in the information e-mail itself, or by sending an e-mail to the contact details listed in the \\nimprint\\n. I have taken note of the \\nprivacy policy\\n of codecentric AG and confirm this by sending the form.*"}},{"identifier":"newsletterFormSubmit","description":"Newsletter form submit","text":{"html":"\u003cp\u003eSend\u003c/p\u003e","text":"Send"}},{"identifier":"newsletterLabel","description":"Newsletter label","text":{"html":"\u003cp\u003eEmail address\u003c/p\u003e","text":"Email address"}},{"identifier":"jobApplicationFormField1","description":"Job application form field 1","text":{"html":"\u003cp\u003eLocation*\u003c/p\u003e","text":"Location*"}},{"identifier":"jobApplicationFormFieldPlaceholder1","description":"Job application form field placeholder 1","text":{"html":"\u003cp\u003eChoose Location(s)\u003c/p\u003e","text":"Choose Location(s)"}},{"identifier":"Berlin","description":"Berlin","text":{"html":"\u003cp\u003eBerlin\u003c/p\u003e","text":"Berlin"}},{"identifier":"jobApplicationFormFieldPlaceholder10","description":"Job application form field placeholder 10","text":{"html":"\u003cp\u003eChoose Job Type\u003c/p\u003e","text":"Choose Job Type"}},{"identifier":"jobApplicationFormField10","description":"Job application form field 10","text":{"html":"\u003cp\u003eJob Type\u003c/p\u003e","text":"Job Type"}},{"identifier":"jobApplicationFormFieldPlaceholder9","description":"Job application form field placeholder 9","text":{"html":"\u003cp\u003eChoose Field(s)\u003c/p\u003e","text":"Choose Field(s)"}},{"identifier":"jobApplicationFormField9","description":"Job application form field 9","text":{"html":"\u003cp\u003eField\u003c/p\u003e","text":"Field"}},{"identifier":"interns","description":"interns","text":{"html":"\u003cp\u003eInterns\u003c/p\u003e","text":"Interns"}},{"identifier":"working_students","description":"working_students","text":{"html":"\u003cp\u003eWorking Students\u003c/p\u003e","text":"Working Students"}},{"identifier":"part_time","description":"part_time","text":{"html":"\u003cp\u003ePart-time\u003c/p\u003e","text":"Part-time"}},{"identifier":"full_time","description":"full_time","text":{"html":"\u003cp\u003eFull-time\u003c/p\u003e","text":"Full-time"}},{"identifier":"Leipzig","description":"Leipzig","text":{"html":"\u003cp\u003eLeipzig\u003c/p\u003e","text":"Leipzig"}},{"identifier":"Alle Standorte","description":"Alle Standorte","text":{"html":"\u003cp\u003eAll locations\u003c/p\u003e","text":"All locations"}},{"identifier":"Erfurt","description":"Erfurt","text":{"html":"\u003cp\u003eErfurt\u003c/p\u003e","text":"Erfurt"}},{"identifier":"Dortmund","description":"Dortmund","text":{"html":"\u003cp\u003eDortmund\u003c/p\u003e","text":"Dortmund"}},{"identifier":"Muenster","description":"Muenster","text":{"html":"\u003cp\u003eMünster\u003c/p\u003e","text":"Münster"}},{"identifier":"Muenchen","description":"Muenchen","text":{"html":"\u003cp\u003eMunich\u003c/p\u003e","text":"Munich"}},{"identifier":"Nuernberg","description":"Nuernberg","text":{"html":"\u003cp\u003eNuremberg\u003c/p\u003e","text":"Nuremberg"}},{"identifier":"Stuttgart","description":"Stuttgart","text":{"html":"\u003cp\u003eStuttgart\u003c/p\u003e","text":"Stuttgart"}},{"identifier":"Solingen","description":"Solingen","text":{"html":"\u003cp\u003eSolingen\u003c/p\u003e","text":"Solingen"}},{"identifier":"initiativebewerbungExcerpt","description":"Initiativbewerbung Text","text":{"html":"\u003cp\u003eCan't find a suitable role? Please submit a spontaneous application anyway! Rather than rigid categories, what matters most to us are motivation, competence, and a good cultural fit.\u003c/p\u003e","text":"Can't find a suitable role? Please submit a spontaneous application anyway! Rather than rigid categories, what matters most to us are motivation, competence, and a good cultural fit."}},{"identifier":"benefitsWhatDoesThatMeanToYou","description":"What does that mean to you?","text":{"html":"\u003cp\u003eWhat does that mean for you?\u003c/p\u003e","text":"What does that mean for you?"}},{"identifier":"blogHomeBreadcrumbLabel1","description":"First blog home breadcrumb label","text":{"html":"\u003cp\u003e\u003ca title=\"/\" href=\"/\"\u003eHOME\u003c/a\u003e\u003c/p\u003e","text":"\\nHOME\\n"}},{"identifier":"blogHomeBreadcrumbLabel2","description":"Second blog home breadcrumb label","text":{"html":"\u003cp\u003e\u003ca title=\"/en/knowledge-hub\" href=\"/en/knowledge-hub\"\u003eKNOWLEDGE-HUB\u003c/a\u003e\u003c/p\u003e","text":"\\nKNOWLEDGE-HUB\\n"}},{"identifier":"blogPostBreadcrumbLabel1","description":"First blog post breadcrumb label","text":{"html":"\u003cp\u003e\u003ca title=\"/\" href=\"/\"\u003eHOME\u003c/a\u003e\u003c/p\u003e","text":"\\nHOME\\n"}},{"identifier":"blogPostBreadcrumbLabel2","description":"Second blog post breadcrumb label","text":{"html":"\u003cp\u003e\u003ca title=\"/en/knowledge-hub\" href=\"/en/knowledge-hub\"\u003eKNOWLEDGE-HUB\u003c/a\u003e\u003c/p\u003e","text":"\\nKNOWLEDGE-HUB\\n"}},{"identifier":"blogPostBreadcrumbLabel3","description":"Third blog post breadcrumb label","text":{"html":"\u003cp\u003e\u003ca title=\"/en/knowledge-hub/blog\" href=\"/en/knowledge-hub/blog\"\u003eBLOG\u003c/a\u003e\u003c/p\u003e","text":"\\nBLOG\\n"}},{"identifier":"JobAdvertismentBlogTitle","description":"Blog Stellenanzeige Titel","text":{"html":"\u003cp\u003eYour job at codecentric?\u003c/p\u003e","text":"Your job at codecentric?"}},{"identifier":"JobAdvertismentBlogButtonTitle","description":"Blog Stellenanzeige Button Titel","text":{"html":"\u003cp\u003eView Job\u003c/p\u003e","text":"View Job"}},{"identifier":"commentCardTitleMultipleAuthors","description":"Comment card title (multiple authors)","text":{"html":"\u003cp\u003eBlog authors\u003c/p\u003e","text":"Blog authors"}},{"identifier":"commentCardCTAMultipleAuthors","description":"commentCardCTAMultipleAuthors","text":{"html":"\u003cp\u003eContact\u003c/p\u003e","text":"Contact"}},{"identifier":"surveyScoreDescription","description":"Survey score description","text":{"html":"\u003cp\u003eThank you for taking part in our free online IT security check 🙏.\u003c/p\u003e","text":"Thank you for taking part in our free online IT security check 🙏."}},{"identifier":"surveySignupTitle","description":"Survey Formular Titel","text":{"html":"\u003cp\u003eTo receive your result, we still need your email address\u003c/p\u003e","text":"To receive your result, we still need your email address"}},{"identifier":"publications","description":"Publications","text":{"html":"\u003cp\u003ePublications\u003c/p\u003e","text":"Publications"}},{"identifier":"events","description":"Events","text":{"html":"\u003cp\u003eEvents\u003c/p\u003e","text":"Events"}},{"identifier":"blog","description":"Blog","text":{"html":"\u003cp\u003eBlog\u003c/p\u003e","text":"Blog"}},{"identifier":"webinars","description":"Webinars","text":{"html":"\u003cp\u003eWebinars\u003c/p\u003e","text":"Webinars"}},{"identifier":"karrierePodcastPageInfoCTAParagraphMobile","description":"Karriere Podcast Page Info CTA Paragraph Mobile","text":{"html":"\u003cp\u003eWould you like to hear more quotes from our colleagues? What is it like to work in IT consulting at codecentric? Click here for an overview of all culture \u0026amp; career podcasts.\u003c/p\u003e","text":"Would you like to hear more quotes from our colleagues? What is it like to work in IT consulting at codecentric? Click here for an overview of all culture \u0026 career podcasts."}},{"identifier":"karrierePodcastPageInfoCTATitle","description":"Karriere Podcast Page Info CTA Title","text":{"html":"\u003cp\u003eMore culture \u0026amp; career podcasts\u003c/p\u003e","text":"More culture \u0026 career podcasts"}},{"identifier":"softwerecastPodcastPageInfoCTAParagraphMobile","description":"Softwerkercast Podcast Page InfoCTA Paragraph Mobile","text":{"html":"\u003cp\u003eThen take a look at our other podcasts.\u003c/p\u003e","text":"Then take a look at our other podcasts."}},{"identifier":"softwerecastPodcastPageInfoCTAParagraph","description":"Softwerkercast Podcast Page InfoCTA Paragraph","text":{"html":"\u003cp\u003eThen take a look at our other podcasts.\u003c/p\u003e","text":"Then take a look at our other podcasts."}},{"identifier":"softwerecastPodcastPageInfoCTATitle","description":"Softwerkercast Podcast Page InfoCTA Title","text":{"html":"\u003cp\u003eWould you like to hear more?\u003c/p\u003e","text":"Would you like to hear more?"}},{"identifier":"podcastPageHeaderTitle","description":"Podcast Page Header Title","text":{"html":"\u003cp\u003eHave fun listening\u003c/p\u003e","text":"Have fun listening"}},{"identifier":"softwerecastPodcastPageInfoCTAButton","description":"Softwerkercast Podcast Page InfoCTA Button","text":{"html":"\u003cp\u003eAll SoftwerkerCasts\u003c/p\u003e","text":"All SoftwerkerCasts"}},{"identifier":"karrierePodcastPageInfoCTAButton","description":"Karriere Podcast Page Info CTA Button","text":{"html":"\u003cp\u003eAll Podcasts\u003c/p\u003e","text":"All Podcasts"}},{"identifier":"clearFilters","description":"Clear filters","text":{"html":"\u003cp\u003eReset filter\u003c/p\u003e","text":"Reset filter"}},{"identifier":"searchResults","description":"Search results","text":{"html":"\u003cp\u003eSearch results\u003c/p\u003e","text":"Search results"}},{"identifier":"popularSearches","description":"Popular searches","text":{"html":"\u003cp\u003ePopular searches\u003c/p\u003e","text":"Popular searches"}},{"identifier":"searchResultsFor","description":"Search results for","text":{"html":"\u003cp\u003eSearch result for [TERM] filter by:\u003c/p\u003e","text":"Search result for [TERM] filter by:"}},{"identifier":"loadMore","description":"Load more","text":{"html":"\u003cp\u003eLoad more\u003c/p\u003e","text":"Load more"}},{"identifier":"noSearchResultsTitle","description":"No search results title","text":{"html":"\u003cp\u003eSorry, we couldn't find any results for your search query.\u003c/p\u003e","text":"Sorry, we couldn't find any results for your search query."}},{"identifier":"noSearchResultsPopularSearches","description":"No search results popular searches","text":{"html":"\u003cp\u003eMaybe the popular search entries will help you:\u003c/p\u003e","text":"Maybe the popular search entries will help you:"}},{"identifier":"jobOffers","description":"Job offers","text":{"html":"\u003cp\u003eJob offers\u003c/p\u003e","text":"Job offers"}},{"identifier":"toTheJob","description":"To the job","text":{"html":"\u003cp\u003eTo the job\u003c/p\u003e","text":"To the job"}},{"identifier":"careers","description":"Careers","text":{"html":"\u003cp\u003eCareers\u003c/p\u003e","text":"Careers"}},{"identifier":"questionsInAdvance","description":"Questions in advance?","text":{"html":"\u003cp\u003eQuestions in advance?\u003c/p\u003e","text":"Questions in advance?"}},{"identifier":"shareJobAdvertisement","description":"Share job advertisement","text":{"html":"\u003cp\u003eShare job advertisement\u003c/p\u003e","text":"Share job advertisement"}},{"identifier":"applyNowAtCodecentric","description":"Apply now as [HEADING_TITLE] at codecentric","text":{"html":"\u003cp\u003eApply now as [HEADING_TITLE] at codecentric\u003c/p\u003e","text":"Apply now as [HEADING_TITLE] at codecentric"}},{"identifier":"applyNow","description":"Apply now","text":{"html":"\u003cp\u003eApply now\u003c/p\u003e","text":"Apply now"}},{"identifier":"toTheJobOverview","description":"To the job overview","text":{"html":"\u003cp\u003eTo the job overview\u003c/p\u003e","text":"To the job overview"}},{"identifier":"aJobAt","description":"A job at","text":{"html":"\u003cp\u003eA job at\u003c/p\u003e","text":"A job at"}},{"identifier":"pleaseSelect","description":"Please select","text":{"html":"\u003cp\u003ePlease select\u003c/p\u003e","text":"Please select"}},{"identifier":"home","description":"Home","text":{"html":"\u003cp\u003eHome\u003c/p\u003e","text":"Home"}},{"identifier":"wissensHub","description":"Wissens-Hub","text":{"html":"\u003cp\u003eKnowledge-Hub\u003c/p\u003e","text":"Knowledge-Hub"}},{"identifier":"softwerker","description":"Softwerker","text":{"html":"\u003cp\u003eSoftwerker\u003c/p\u003e","text":"Softwerker"}},{"identifier":"softwerkercast","description":"Softwerkercast","text":{"html":"\u003cp\u003eSoftwerkercast\u003c/p\u003e","text":"Softwerkercast"}},{"identifier":"cultureCareersPodcast","description":"Kultur \u0026 Karriere Podcast","text":{"html":"\u003cp\u003eKultur \u0026amp; Karriere Podcast\u003c/p\u003e","text":"Kultur \u0026 Karriere Podcast"}},{"identifier":"makeContact","description":"Make contact","text":{"html":"\u003cp\u003eGet in touch\u003c/p\u003e","text":"Get in touch"}},{"identifier":"buttonNext","description":"buttonNext","text":{"html":"\u003cp\u003eNext\u003c/p\u003e","text":"Next"}},{"identifier":"buttonBack","description":"buttonBack","text":{"html":"\u003cp\u003eBack\u003c/p\u003e","text":"Back"}},{"identifier":"resetSelection","description":"Reset selection","text":{"html":"\u003cp\u003eReset selection\u003c/p\u003e","text":"Reset selection"}},{"identifier":"selection","description":"Selection","text":{"html":"\u003cp\u003eSelection\u003c/p\u003e","text":"Selection"}},{"identifier":"readingTime","description":"Reading time","text":{"html":"\u003cp\u003eminutes reading time\u003c/p\u003e","text":"minutes reading time"}},{"identifier":"Automotive","description":"Branche: Automotive","text":{"html":"\u003cp\u003eAutomotive\u003c/p\u003e","text":"Automotive"}},{"identifier":"Bau_und_Umwelt","description":"Branche: Bau_und_Umwelt","text":{"html":"\u003cp\u003eConstruction \u0026amp; Environment\u003c/p\u003e","text":"Construction \u0026 Environment"}},{"identifier":"Energie","description":"Branche: Energie","text":{"html":"\u003cp\u003eEnergy\u003c/p\u003e","text":"Energy"}},{"identifier":"Handel","description":"Branche: Handel","text":{"html":"\u003cp\u003eCommerce\u003c/p\u003e","text":"Commerce"}},{"identifier":"IT_Informationstechnologie","description":"Branche: IT_Informationstechnologie","text":{"html":"\u003cp\u003eIT\u003c/p\u003e","text":"IT"}},{"identifier":"Logistik","description":"Branche: Logistik","text":{"html":"\u003cp\u003eLogistics\u003c/p\u003e","text":"Logistics"}},{"identifier":"Mobilitaet_und_Transport","description":"Branche: Mobilitaet_und_Transport","text":{"html":"\u003cp\u003eMobility \u0026amp; Transport\u003c/p\u003e","text":"Mobility \u0026 Transport"}},{"identifier":"Oeffentliche_Verwaltung","description":"Branche: Oeffentliche_Verwaltung","text":{"html":"\u003cp\u003ePublic Administration\u003c/p\u003e","text":"Public Administration"}},{"identifier":"Produktion_und_Industrie","description":"Branche: Produktion_und_Industrie","text":{"html":"\u003cp\u003eManufacturing \u0026amp; Industry\u003c/p\u003e","text":"Manufacturing \u0026 Industry"}},{"identifier":"Telekommunikation","description":"Branche: Telekommunikation","text":{"html":"\u003cp\u003eTelecommunication\u003c/p\u003e","text":"Telecommunication"}},{"identifier":"Tourismus_und_Gastronomie","description":"Branche: Tourismus_und_Gastronomie","text":{"html":"\u003cp\u003eTourism \u0026amp; Gastronomy\u003c/p\u003e","text":"Tourism \u0026 Gastronomy"}},{"identifier":"Versicherung_und_Finanzen","description":"Branche: Versicherung_und_Finanzen","text":{"html":"\u003cp\u003eInsurance \u0026amp; Finance\u003c/p\u003e","text":"Insurance \u0026 Finance"}},{"identifier":"Weitere_Branchen","description":"Branche: Weitere Branchen","text":{"html":"\u003cp\u003eOther sectors\u003c/p\u003e","text":"Other sectors"}},{"identifier":"employmentType.permanent","description":"Employment types from personio","text":{"html":"\u003cp\u003ePermanent\u003c/p\u003e","text":"Permanent"}},{"identifier":"employmentType.intern","description":"Employment types from personio","text":{"html":"\u003cp\u003eInternship\u003c/p\u003e","text":"Internship"}},{"identifier":"employmentType.trainee","description":"Employment types from personio","text":{"html":"\u003cp\u003eTrainee\u003c/p\u003e","text":"Trainee"}},{"identifier":"employmentType.freelance","description":"Employment types from personio","text":{"html":"\u003cp\u003eFreelancing\u003c/p\u003e","text":"Freelancing"}},{"identifier":"jobPostShare","description":"jobPostShare","text":{"html":"\u003cp\u003eShare job posting\u003c/p\u003e","text":"Share job posting"}},{"identifier":"schedule.full-or-part-time","description":"schedule.full-or-part-time","text":{"html":"\u003cp\u003eFull-time or part-time\u003c/p\u003e","text":"Full-time or part-time"}},{"identifier":"schedule.part-time","description":"Schedule from personio","text":{"html":"\u003cp\u003ePart-time\u003c/p\u003e","text":"Part-time"}},{"identifier":"schedule.full-time","description":"Schedule from personio","text":{"html":"\u003cp\u003eFull-time\u003c/p\u003e","text":"Full-time"}},{"identifier":"jobContactPersonQuote","description":"Job contactPerson quote","text":{"html":"\u003cp\u003eIf you have any questions, please contact me\u003c/p\u003e","text":"If you have any questions, please contact me"}},{"identifier":"employmentType.temporary","description":"employmentType from personio","text":{"html":"\u003cp\u003eTemporary\u003c/p\u003e","text":"Temporary"}},{"identifier":"joblistLoadMore","description":"Für Button zur Paginierung unter der Jobliste","text":{"html":"\u003cp\u003eShow more jobs\u003c/p\u003e","text":"Show more jobs"}},{"identifier":"joblistFilterSelected","description":"Beschriftung in Auswahlboxen der Jobliste, wenn Filterelemente ausgewählt wurden","text":{"html":"\u003cp\u003eselected\u003c/p\u003e","text":"selected"}}],"header":{"topLinks":[{"id":"cley81lc87fk00bwftv4gm2oq","title":"About us","url":null,"pageLink":{"id":"cld1d5fx4v8jg0aunmmam4imt","locale":"en","slug":"/about-us"}},{"id":"cley81lc87fjy0bwfexv94llr","title":"News","url":"/en/news","pageLink":{"id":"cldmz3qv2zobt09tgrltu42ir","locale":"de","slug":"/aktuelles"}},{"id":"cley81lc77fjw0bwfw0gk4au6","title":"Contact us","url":null,"pageLink":{"id":"cleydlhgb396n0bw3yrjr09e6","locale":"en","slug":"/contact"}}],"image":{"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/K1lI4UPCSUuKSWZHgd4D","height":137,"width":1099,"imageAltText":"Logo der codecentric AG, einem in Deutschland führenden IT-Consulting Unternehmen","localizations":[{"locale":"de","url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/K1lI4UPCSUuKSWZHgd4D","height":137,"width":1099,"imageAltText":"Logo der codecentric AG, einem in Deutschland führenden IT-Consulting Unternehmen"}]},"imageAlt":{"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/8dEr5SAoShaJq31A58uA","height":48,"width":360,"imageAltText":"Logo der codecentric AG einem in Deutschland führenden IT-Consulting Unternehmen"},"bannerText":null,"bannerTextNew":{"html":"\u003cp\u003e\u003cem\u003eDue to maintenance work, form submissions can only be processed with a delay until 08.09.2024 at 23:00. But don\u0026#39;t worry: they won\u0026#39;t be lost. You will receive all the requested materials by next week at the latest. We will respond to your request as soon as possible. Alternatively, you can send us a message to \u003c/em\u003e\u003ca title=\"mailto:deine-anfrage@codecentric.de\" href=\"mailto:deine-anfrage@codecentric.de\"\u003e\u003cem\u003edeine-anfrage@codecentric.de\u003c/em\u003e\u003c/a\u003e\u003cem\u003e. Applications can be accepted without restrictions.\u003c/em\u003e\u003c/p\u003e"},"bannerLink":null,"bannerStartDateTime":"2024-09-05T16:00:00+00:00","bannerEndDateTime":"2024-09-09T09:00:00+00:00","bannerReference":null,"links":[{"id":"cley81lbw7fj20bwfyrcgi38c","parentLink":{"id":"cley81lbw7fj30bwfvx2fx9c8","title":"Services","url":null,"pageLink":{"id":"clb1zhzxi2zp20buecntpui9c","locale":"en","slug":"/services"}},"childLinks":[{"id":"cmfgkczwdeq0g06uqcpqzme8a","title":"Data Effectiveness","url":null,"pageLink":{"id":"cmciwva5g4qes07t9riaq71pe","locale":"en","slug":"/services/data-effectiveness"}},{"id":"cmfgkczt6eq0d06uquhndl9vc","title":"Digital Products \u0026 Solutions","url":null,"pageLink":{"id":"cmd2wp3bbcisr07uqc5evuf4b","locale":"en","slug":"/services/digital-solutions"}},{"id":"cmfgkczm2eq0a06uqf9uz92un","title":"Digital sovereignty","url":null,"pageLink":{"id":"cmcdgumyy18mz07um263ni4a4","locale":"en","slug":"/services/digital-sovereignty"}},{"id":"cmfgkczekeq0706uqcfua57ls","title":"IT Security","url":null,"pageLink":{"id":"clyeekpgk66m807tby8btxyoz","locale":"en","slug":"/it-security"}},{"id":"cmfgkczarepzt06uqm0g6yxwk","title":"Artificial intelligence","url":null,"pageLink":{"id":"cmcac2pca08r907utzagtmk3c","locale":"en","slug":"/services/artificial-intelligence"}},{"id":"cmfgkcz0repzf06uqu1ptvsss","title":"Software Modernization","url":null,"pageLink":{"id":"cmamizwu1i0pd08ulewbxxvx0","locale":"en","slug":"/services/software-modernization"}},{"id":"cmfgkcz0repze06uqkhh0crzx","title":"Services from A to Z ...","url":"/en/services#service-overview","pageLink":null}]},{"id":"cleyao80l15m00aw7dlvc7r32","parentLink":{"id":"cleyao80l15m10aw7e6urlsev","title":"Industries","url":null,"pageLink":{"id":"cm9ciiyi7a04i07uh1j39542u","locale":"en","slug":"/industries"}},"childLinks":[]},{"id":"cley81lbz7fj90bwfwfv5kqmx","parentLink":{"id":"cley81lbz7fja0bwfppzhi1o2","title":"References","url":null,"pageLink":{"id":"cldk1u1izfnzc0butyud5a5xw","locale":"en","slug":"/references"}},"childLinks":[]},{"id":"cley81lc17fje0bwfbpnk068x","parentLink":{"id":"cley81lc17fjf0bwfezgm1ua8","title":"Locations","url":null,"pageLink":{"id":"cld0c9fkq9i100aunfvejhnwk","locale":"en","slug":"/locations"}},"childLinks":[{"id":"cleyaw7ki16x90aw8lnq4zcm4","title":"Berlin","url":null,"pageLink":{"id":"cle330wm7fl6z0atcmgj2bowo","locale":"en","slug":"/locations/berlin"}},{"id":"cleyaw7kh16x60aw8ii53yodk","title":"Bielefeld","url":null,"pageLink":{"id":"cle2v1pxm4h4e09t7xglokm19","locale":"en","slug":"/locations/bielefeld"}},{"id":"cleyaw7kg16x30aw8riltqohh","title":"Dortmund","url":null,"pageLink":{"id":"cle33pr97gtu50bteezhw5cdj","locale":"en","slug":"/locations/dortmund"}},{"id":"cleyaw7kf16x00aw8ldgpbdja","title":"Erfurt","url":null,"pageLink":{"id":"cle34cultgwho0auryp16e24e","locale":"en","slug":"/locations/erfurt"}},{"id":"cleyaw7ke16wx0aw8a9n6wjet","title":"Frankfurt am Main","url":null,"pageLink":{"id":"cle3vqprn5qpi09rtw8gmdllu","locale":"en","slug":"/locations/frankfurt"}},{"id":"cleyaw7kc16wu0aw8ek28mfl9","title":"Hamburg","url":null,"pageLink":{"id":"cle3v9di757k309rtgoh4lwdi","locale":"en","slug":"/locations/hamburg"}},{"id":"cleyaw7kb16wr0aw87cf3c2ls","title":"Karlsruhe","url":null,"pageLink":{"id":"cle3vz1en5psw0atc36xttdcq","locale":"en","slug":"/locations/karlsruhe"}},{"id":"cleyaw7ka16wo0aw8szp8ym3w","title":"Leipzig","url":null,"pageLink":{"id":"cle34r4rthzmf0atcu7hz7inn","locale":"en","slug":"/locations/leipzig"}},{"id":"cleyaw7k916wl0aw8wjt08j4u","title":"Munich","url":null,"pageLink":{"id":"cle3wlynn6ghu0atc1cjqr0yv","locale":"en","slug":"/locations/munich"}},{"id":"cleyaw7k816wi0aw82qhvc8qp","title":"Münster","url":null,"pageLink":{"id":"clbw70pb4343t09unvu77d3cd","locale":"en","slug":"/locations/muenster"}},{"id":"cleyaw7k616wf0aw8k2iqx7l8","title":"Nuremberg","url":null,"pageLink":{"id":"cle3z8tlja5ff0buj8osi0shz","locale":"en","slug":"/locations/nuremberg"}},{"id":"cleyaw7k516wc0aw83jluhsxg","title":"Solingen","url":null,"pageLink":{"id":"cle3yv93w9vit0atch1eg7k7q","locale":"en","slug":"/locations/solingen"}},{"id":"cley81lc27fji0bwfj0h7voiz","title":"Stuttgart","url":null,"pageLink":{"id":"cle3ziji1ap680bujv8xiwvw3","locale":"en","slug":"/locations/stuttgart"}}]},{"id":"cley81lc47fjm0bwf1bnfnikq","parentLink":{"id":"cley81lc47fjn0bwf59lrb258","title":"Knowledge Hub","url":"/en/knowledge-hub","pageLink":{"id":"cld4jubok3jxf0bug2mnlrybl","locale":"de","slug":"/knowledge-hub"}},"childLinks":[{"id":"cleyao80l15lz0aw7as6yhaqw","title":"Blog","url":null,"pageLink":{"id":"cl5wmxda7l3mj0ctdbkrp24hi","locale":"en","slug":"/knowledge-hub/blog"}}]},{"id":"cley81lc57fjr0bwfgg2pbc6i","parentLink":{"id":"cley81lc57fjs0bwf5bbx7h9w","title":"Careers","url":null,"pageLink":{"id":"cldsusdi7ux2a09tgu8lfxpnk","locale":"en","slug":"/careers"}},"childLinks":[{"id":"cleyb76y41hfm0aw7ur02v46w","title":"Jobs","url":null,"pageLink":{"id":"cldycuobri1fs09um5ponbbwb","locale":"en","slug":"/careers/jobs"}},{"id":"cleyb76y41hfp0aw768mviqtu","title":"Our Culture","url":null,"pageLink":{"id":"cldsxn9kgyhhf0bun5wnxq0s0","locale":"en","slug":"/careers/culture"}},{"id":"cleyb76y31hfj0aw71p3fu8r0","title":"FAQ","url":null,"pageLink":{"id":"cldx5uejz77g80ate69d94yge","locale":"en","slug":"/careers/faq"}}]}]},"footer":{"newsletterTitle":{"type":"h6","title":"Sign Up for our Newsletter"},"newsletterDescription":{"html":"\u003cp\u003eEverything worth knowing on one click: \u003cbr\u003eOur newsletter offers you the opportunity to inform you about the current topics at codecentric without much effort. \u003cbr\u003e(written in German)\u003c/p\u003e"},"newsletterImage":{"mimeType":"image/png","height":400,"imageAltText":null,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/c6rBGZ5fSF6Bx9uPXr0n","width":640,"fileName":"newsletter-banner-640x400.png"},"newsletterButtons":[{"id":"cm4wl7igcrwai07un5fq05u7m","__typename":"ButtonPrimary","locale":"en","title":"Sign up","pageLink":null,"url":null,"isTargetBlank":null,"downloadAsset":null,"form":{"hubspotFormId":"74fb386d-4ca2-455d-b416-5d409d780aa6","hubspotTitle":"Newsletter | codecentricNEWS","title":"Newsletter-Anmeldung","description":"Melde dich hier für unseren kostenfreien Newsletter an – trag einfach deine Kontaktdaten ein."},"ariaLabel":"Sign Up for our newsletter","hiddenFields":null,"localizations":[{"pageLink":null},{"pageLink":null}]}],"workWithUsTitle":"Implementing better projects together.","workWithUsLeftColumnTitle":"We can help your company.","workWithUsLeftColumnDescription":"Are you facing a major IT challenge? We provide customized support. Find out more now. ","workWithUsLeftColumnLink":{"title":"Our services","url":null,"pageLink":{"id":"clb1zhzxi2zp20buecntpui9c","slug":"/services"}},"workWithUsRightColumnTitle":"Help us to become even better. ","workWithUsRightColumnDescription":"We are always on the lookout for new talent. There is a suitable position for you too.","workWithUsRightColumnLink":{"title":"To the job offers","url":null,"pageLink":{"id":"cldycuobri1fs09um5ponbbwb","slug":"/careers/jobs"}},"headingColumn1":"The company","linksColumn1":[{"__typename":"Link","id":"cmshftz8r2fn107tbtxgqyfmt","title":"About us","url":"/about-us","pageLink":{"id":"cld1d5fx4v8jg0aunmmam4imt","locale":"en","slug":"/about-us"}},{"__typename":"Link","id":"cmshftzfs2fn707tbfphm0pzl","title":"News","url":"/en/news","pageLink":{"id":"cldmz3qv2zobt09tgrltu42ir","locale":"de","slug":"/aktuelles"}},{"__typename":"Link","id":"cmshftzm02fns07tbs0lp60ak","title":"Contact us","url":"/contact","pageLink":{"id":"cleydlhgb396n0bw3yrjr09e6","locale":"en","slug":"/contact"}}],"headingColumn2":"codecentric for you","linksColumn2":[{"__typename":"Link","id":"cmshftzs52fo007tb3508mjy4","title":"Softwerker (DE)","url":"/wissens-hub/softwerker","pageLink":{"id":"cldc18q0vue9o0bt9b5tpm9jf","locale":"de","slug":"/wissens-hub/softwerker"}},{"__typename":"Link","id":"cmshftzvy2fo807tbtifg10zc","title":"Blog","url":"/knowledge-hub/blog","pageLink":{"id":"cl5wmxda7l3mj0ctdbkrp24hi","locale":"en","slug":"/knowledge-hub/blog"}},{"__typename":"Link","id":"cmshfu03q2foe07tb2hgcapa9","title":"RSS-Feed (blog)","url":"https://www.codecentric.de/rss/feed.xml","pageLink":null}],"headingColumn3":"Sitemap","linksColumn3":[{"__typename":"Link","id":"cmshfu03u2fog07tbuys3wbwx","title":"Services","url":"/services","pageLink":{"id":"clb1zhzxi2zp20buecntpui9c","locale":"en","slug":"/services"}},{"__typename":"Link","id":"cmshfu07d2fok07tb6szx0bj3","title":"How we work","url":"/how-we-work","pageLink":{"id":"cldpv7c6j35iy0augcsseh2nj","locale":"en","slug":"/how-we-work"}},{"__typename":"Link","id":"cmshfu0d82foy07tboyju71o6","title":"References","url":"/references","pageLink":{"id":"cldk1u1izfnzc0butyud5a5xw","locale":"en","slug":"/references"}},{"__typename":"Link","id":"cmshfu0kk2fpc07tb4z62jgrx","title":"Careers","url":"/en/careers","pageLink":{"id":"cldsusdi7ux2a09tgu8lfxpnk","locale":"en","slug":"/careers"}},{"__typename":"Link","id":"cmshfu0o12fpl07tb7uk5ww03","title":"Locations","url":"/locations","pageLink":{"id":"cld0c9fkq9i100aunfvejhnwk","locale":"en","slug":"/locations"}},{"__typename":"Link","id":"cmshfu0v22fpr07tb45ztbls8","title":"Media","url":"/media","pageLink":{"id":"cluidjh20r7nn07uonlcv6eso","locale":"en","slug":"/media"}}],"headingColumn4":"Legal matters","linksColumn4":[{"__typename":"Link","id":"cmshfu12d2fqb07tb7mun251j","title":"Imprint","url":"/imprint","pageLink":{"id":"clgg5n9ygc1k90aup10ua6932","locale":"en","slug":"/imprint"}},{"__typename":"Link","id":"cmshfu15x2fqh07tbqc5ruisl","title":"Privacy policy","url":"/privacy-policy","pageLink":{"id":"cley42r8t5dfl09w4avhrpyrl","locale":"en","slug":"/privacy-policy"}},{"__typename":"ButtonConsentManager","id":"cmshg53fb39nr08uhkvb9g1g4","consentTitle":"Privacy Settings","ariaLabel":"Privacy Settings: Open cookie and privacy dialog"}],"logo":{"height":137,"width":1099,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/K1lI4UPCSUuKSWZHgd4D","imageAltText":"Logo der codecentric AG, einem in Deutschland führenden IT-Consulting Unternehmen"},"facebookUrl":"facebook.com/codecentric","twitterUrl":"www.youtube.com/codecentricAG","linkedInUrl":"https://de.linkedin.com/company/codecentric-ag","redditUrl":"","instagramUrl":"https://www.instagram.com/codecentricag/","imageBlocks":[{"image":{"height":250,"width":476,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cm9wozd3khswq07ups4bzpo6c","imageAltText":"TÜV ISO 27001-Logo"},"link":{"id":"clx5zxjict62i08tiqcdmlbay","title":null,"url":null,"pageLink":null}},{"image":{"height":250,"width":600,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/qxlgaSe9TGqmoFZll4Be","imageAltText":"codecentric unterzeichnet Charta der Vielfalt"},"link":null},{"image":{"height":250,"width":600,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cmrosza3hhhos07unv6kqgujk","imageAltText":"codecentric ist Partner der Allianz für Cyber-Sicherheit"},"link":null}],"localizations":[{"logo":{"locale":"de","height":137,"width":1099,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/K1lI4UPCSUuKSWZHgd4D","imageAltText":"Logo der codecentric AG, einem in Deutschland führenden IT-Consulting Unternehmen"},"imageBlocks":[{"image":{"height":250,"width":476,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cm9wotnschh2707upstwv52ln","imageAltText":"TÜV ISO 27001-Logo","localizations":[{"height":250,"width":476,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cm9wozd3khswq07ups4bzpo6c","imageAltText":"TÜV ISO 27001-Logo"}]},"link":{"id":"clx5zxjict62i08tiqcdmlbay","title":"ISO 27001- und TISAX-Zertifizierung","url":"https://www.codecentric.de/ueber-uns/hard-facts#iso-tisax","pageLink":null}},{"image":{"height":250,"width":600,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/qxlgaSe9TGqmoFZll4Be","imageAltText":"codecentric unterzeichnet Charta der Vielfalt","localizations":[]},"link":null},{"image":{"height":250,"width":600,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cmrosza3hhhos07unv6kqgujk","imageAltText":"codecentric ist Partner der Allianz für Cyber-Sicherheit","localizations":[]},"link":null}]},{"logo":null,"imageBlocks":[{"image":{"height":250,"width":476,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cm9wozd3khswq07ups4bzpo6c","imageAltText":"TÜV ISO 27001-Logo","localizations":[{"height":250,"width":476,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cm9wotnschh2707upstwv52ln","imageAltText":"TÜV ISO 27001-Logo"}]},"link":{"id":"clx5zxjict62i08tiqcdmlbay","title":null,"url":null,"pageLink":null}},{"image":null,"link":null},{"image":null,"link":null}]}]},"brand":"main","blogArticle":{"id":"cl8cma738rbz80eusztlseyuo","locale":"en","metaTitle":"Chaos Engineering - withstanding turbulent conditions in production","metaDescription":"Chaos Engineering, start experimenting on a distributed system in order to build confidence in the system's capability to withstand production","slug":"chaos-engineering","title":"Chaos Engineering – withstanding turbulent conditions in production","brand":null,"articleCreatedAt":"2018-07-04T23:00:00+00:00","syntaxHighlightingTheme":null,"likes":4,"jobPage":null,"isEnglish":true,"publishedAt":"2025-09-12T09:16:53.174592+00:00","metaImage":null,"mainImage":null,"tags":[{"id":"cl7ccvbfaqh7w0atey55kvudd","title":"Chaos Engineering"},{"id":"cl7ccwjmmqd3j0cuqte62rbft","title":"Resilience"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"linkCloudHeading":null,"linkCloud":null,"localizations":[{"locale":"de","slug":null,"metaImage":null,"mainImage":{"locale":"de","height":1003,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/BjopIj5pQ7iWTNI6upu2","width":1455,"imageAltText":null}},{"locale":"en","slug":"chaos-engineering","metaImage":null,"mainImage":{"locale":"de","height":1003,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/BjopIj5pQ7iWTNI6upu2","width":1455,"imageAltText":null}}]},"blogArticleHTMLContent":"\u003cp\u003eWhen you were a child, did you deliberately break or dismantle things in order to understand how they work? We all did – although some people have a greater urge to destroy than others. Today we call it Chaos Engineering.\u003c/p\u003e\u003cp\u003eAs developers, one of our primary goals is to develop stable, secure and bug-free software that will not deprive us of sleep or new and exciting topics. To accomplish these and other goals, we write unit and integration tests, which alert us to unexpected behavior and ensure that the patterns we test do not lead to errors. Today’s architectures contain many components that can’t all be fully covered with unit and integration tests. Servers and components of whose existence we’re not aware still manage to drag our entire system into the abyss.\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003eYou don’t choose the moment, the moment chooses you!\u003cbr\u003e You only choose how prepared you are when it does.\u003cbr\u003e Fire Chief Mike Burtch\u003c/p\u003e\u003c/blockquote\u003e\u003ch2\u003eIntroduction\u003c/h2\u003e\u003cp\u003eIn recent years, Netflix has been one of the drivers behind Chaos Engineering and has contributed significantly to the growing importance of Chaos Engineering in distributed systems. Kyle Kingsbury, security researcher, takes a slightly different approach, verifying the promises of manufacturers of distributed databases, queues and other distributed systems. With his tool \u003ca rel=\"external\" target=\"_blank\" href=\"https://jepsen.io/\"\u003eJepsen\u003c/a\u003e , he probes the behavior of the aforementioned systems and occasionally comes to frightening conclusions. You can find a very impressive talk on this topic on \u003ca href=\"https://www.youtube.com/watch?v=eSaFVX4izsQ\" target=\"_blank\"\u003eYouTube\u003c/a\u003e .\u003c/p\u003e\u003cp\u003eIn this article I hope to give you a simple and descriptive introduction to the world of Chaos Engineering. As a neat side-effect, Chaos Engineering will allow you to personally meet all of your colleagues within a short time – whether you want to or not! (But only if you do it wrong.)\u003c/p\u003e\u003cp\u003eDo not underestimate the social aspect of Chaos Engineering; it is not just about destroying something, but also about bringing the right people together and jointly pursuing the goal of creating stable and fault-tolerant software.\u003c/p\u003e\u003ch2\u003eBasics\u003c/h2\u003e\u003cp\u003eWhen we develop new or existing software, we toughen our implementation through various forms of tests. We are often referred to a test pyramid that illustrates what kinds of tests we should write and to what extent.\u003c/p\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/b3pBSNSdSbK6El55FkLI\" alt=\"Test Pyramid\" width=\"685\" height=\"571\"\u003e\u003c/p\u003e\u003cp\u003eThe test pyramid illustrates the following dilemma. The more I move upwards with my test scenario, the more effort, time and costs arise.\u003c/p\u003e\u003ch2\u003eUnit tests\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eWhen creating unit tests, we write test cases to check the expected behavior. The component we are testing is free of all its dependencies and we keep their behavior under control with the help of mocks. These types of tests cannot guarantee that they are free of errors. If the developer of the module had a logic error in the implementation of the component, this error will also occur in the tests – regardless of whether the developer has first implemented the tests and then the code. One possibility to solve this is Extreme Programming, in which the developers continuously alternate between writing the tests and implementing the functionality.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/tC9jfcdCSduMXPnZB2N4\" alt=\"Unit Test\" width=\"700\" height=\"205\"\u003e\u003c/p\u003e\u003ch2\u003eIntegration tests\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eIn order to allow the developers and stakeholders to spend more free time and relaxed weekends with family and friends, we write integration tests after the unit tests. These test the interaction of individual components.\u0026nbsp;\u003c/span\u003e\u003cspan\u003eIntegration tests are ideally run automatically after the successfully tested unit tests and test-interdependent components.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/n4ihkVHcTzilBOUstqC6\" alt=\"Integration Test\" width=\"700\" height=\"135\"\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eThanks to high test coverage and automation, we achieve a very stable state of our application, but who does not know this unpleasant feeling on the way to the most beautiful place in the world? What I mean is production, where our software has to show how good it really is. \u003c/span\u003e\u003cspan\u003eOnly under real conditions can we see how all the individual components of the overall architecture behave. This unpleasant feeling has even been reinforced by the use of modern microservice architectures.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003eErosion of the software architecture\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eIn the age of loosely coupled microservices, we arrive at software architectures that can be summarized under the umbrella term ‘distributed systems’. It’s easy to understand individual systems – and they can be deployed and scaled quickly – but in most cases this leads to an architecture like the following one:\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/O2pScfvUQ96i8cghtN0o\" alt=\"Architecture Erosion\" width=\"700\" height=\"483\"\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eI love architecture diagrams, since they give us a clear and abstract view of the software being developed. However, they are also able to hide all the evil pitfalls and mistakes. They are especially good at obscuring the underlying layers and hardware. In real-life production environments, the following architectural diagram is closer to the status quo:\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/67uDrtVREebMCeRkcUn3\" alt=\"Architecture Erosion real\" width=\"700\" height=\"483\"\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eThe load balancer doesn’t know all instances of the gateway or cannot reach them in the network due to a firewall rule. Several applications are dead, but service discovery doesn’t notice the failure. Additionally, service discovery can’t synchronize and delivers varying results. The load cannot be distributed due to missing instances, and this leads to an increased load on the individual nodes. And anyway – why does the twelve-hour batch have to run during the day and why does it need twelve hours?!\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eI’m sure you’ve had similar experiences. You probably know what it means to deal with defective hardware, faulty virtualization, incorrectly configured firewalls or tedious coordination within your company.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eAt times, statements like the following come up during discussion: “There is no chaos here, everything runs its usual course.” It may be hard to believe, but an entire industry lives from selling us ticket systems so we can control and document the chaos that exists. The following quote from a movie that my children enjoy describes our everyday life well:\u003c/span\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ci\u003e\u003cspan\u003eChaos is the engine that drives the world\u003c/span\u003e\u003c/i\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003cspan\u003eAPI heaven vs backend hell\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eAPIs suggest an intact world where we get exactly what we need via simple API calls, with well-defined inputs and outputs. We use myriad APIs to protect us from direct interaction with hell (backend/API implementation). Countless layers of abstractions are implemented in which Hades, god of the underworld, is doing his mischief. He makes sure that not a single API call ever comes back unscathed. Okay, I exaggerate, but you know what I’m getting at.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eNetflix shows what this can lead to, so let’s take a quick look at their architecture to better understand the potential complexity of modern microservice architectures. The following picture is from 2013:\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/tB7DczkaSSahM1Gq2hLR\" alt=\"Netflix Architecture 2013\" width=\"700\" height=\"532\"\u003e\u003c/p\u003e\u003cp\u003e\u003cem\u003e\u003cspan\u003eReprinted from A. Tseitlin, “Resiliency through failure”, QCon NY, 2013\u003c/span\u003e\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eThis is even more impressive how well Netflix’s architecture works and can react to all the possible errors. If you watch a talk by a Netflix developer, you will find the statement “nobody knows how and why this works”. This insight has brought Chaos Engineering to life at Netflix.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003cspan\u003eDon’t try this at home\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eBefore you start your first chaos experiments, make sure that your services can already apply a resilience pattern and deal with the possible errors.\u003cbr\u003e \u003c/span\u003e\u003c/p\u003e\u003cblockquote\u003e\u003cp\u003e\u003ci\u003e\u003cspan\u003eChaos Engineering doesn´t cause problems. It reveals them.\u003cbr\u003e \u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan\u003eNora Jones \u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan\u003e\u003cbr\u003e \u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan\u003eSenior Chaos Engineer at Netflix\u003c/span\u003e\u003c/i\u003e\u003c/p\u003e\u003c/blockquote\u003e\u003cp\u003e\u003cspan\u003eAs Nora Jones from Netflix rightfully points out, Chaos Engineering is not about creating chaos, but about preventing it. So, if you want to begin your chaos experiments, start small and ask yourself the following questions in advance:\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg loading=\"lazy\" width=\"581\" height=\"531\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/B4ZGao9HQ5ClfFjeW0jj\" alt=\"\"\u003e\u003c/p\u003e\u003cp\u003e\u003cem\u003eDecision Helper – inspired by Russ Miles\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eOnce again, it makes no sense to commence engineering chaos if your infrastructure – and especially your services – are not prepared for it. Heed this very important instruction, and we’ll now begin our journey into Chaos Engineering.\u003cbr\u003e \u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003cspan\u003eRules of Chaos Engineering\u003c/span\u003e\u003c/h2\u003e\u003col\u003e\u003cli\u003e\u003cspan\u003eTalk to your colleagues about the planned chaos experiments in advance!\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eIf you know your chaos experiment will fail, \u003cstrong\u003edon’t do it!\u003c/strong\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eChaos shouldn’t come as a surprise, your aim is to prove the hypothesis.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eChaos Engineering helps you understand your distributed systems better.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eLimit the blast radius of your chaos experiments.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eAlways be in control of the situation during the chaos experiment!\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2\u003e\u003cspan\u003ePrinciples of Chaos Engineering\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eIn Chaos Engineering, you should go through the five phases described below and keep control of your experiment at all times. Start small, and keep the potential blast radius of your experiments small as well. Simply pulling a plug somewhere and seeing what happens has absolutely nothing to do with Chaos Engineering! We don’t cause uncontrolled chaos; we actively fight to prevent it.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eI warmly recommend the site\u003ca href=\"http://principlesofchaos.org/\" target=\"_blank\"\u003e PrinciplesOfChaos.org\u003c/a\u003e and the free ebook “\u003ca href=\"https://www.oreilly.com/webops-perf/free/chaos-engineering.csp\" target=\"_blank\"\u003eChaos Engineering\u003c/a\u003e ” written by the authors: Casey Rosenthal, Lorin Hochstein, Aaron Blohowiak, Nora Jones, Ali Basiri\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003cspan\u003ePhases of Chaos Engineering\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cimg loading=\"lazy\" width=\"661\" height=\"81\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/baqIkXETi6Msw89gmUSs\" alt=\"\"\u003e\u003c/p\u003e\u003ch2\u003eSteady state\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eIt is essential to define metrics which give you a reliable statement about the overall state of your system. These metrics must be continuously monitored during the chaos experiments. As a nice side effect, you can also monitor these metrics outside of your experiments.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eMetrics can be both technical or business metrics – I’d say that business metrics outweigh technical metrics. Netflix monitors the number of successful clicks to start a video during a chaos experiment; this is their core metric and it comes from the business domain. Customers not being able to start videos have a direct effect on customer satisfaction. For example, if you run an online shop, the number of successful orders or the number of articles placed in the shopping basket would be important business metrics.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003cspan\u003eHypothesis\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eThink about what should happen in advance, and then prove it through your experiment. If your hypothesis is invalidated, you must locate the error based on the findings and bring it up with your team or company. This is sometimes the hardest part – definitely avoid finger-pointing and scapegoating! As a chaos engineer, your goal is to understand how the system behaves and to present this knowledge to the developers. This is why it’s important to get everyone on board early and to let them participate in your experiments.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003cspan\u003eReal-world events\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eWhat awaits us in real life? What new mistakes could happen, and which ones already ruined our previous weekends? These and other questions must be asked and tested for in a controlled experiment.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003ePotential examples include:\u003c/span\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cspan\u003eFailure of a node in a Kafka cluster\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eDropped network packets\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eHardware errors\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eInsufficient max-heap-size for the JVM\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eIncreased latency\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eMalformed responses\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cspan\u003eYou can extend the list however you like and it will always be closely linked to the chosen architecture. Even if your application is not hosted at one of the well-known cloud providers, things will go wrong in your own company’s data center. I strongly suspect you could tell me a thing or two about it!\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003cspan\u003eChaos experiment example\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eSay we have several microservices connected via a REST API and using service discovery. The ‘Product Service’ maintains a local cache of the stock from the ‘Warehouse Service’ as a safeguard. Data from the cache should always be delivered if the Warehouse Service has not replied within 500ms. We can achieve this behavior in the Java environment, for example with \u003ca href=\"https://github.com/Netflix/Hystrix\" target=\"_blank\"\u003eHystrix\u003c/a\u003e \u003c/span\u003e\u003cspan\u003e or \u003ca href=\"https://github.com/resilience4j/resilience4j\" target=\"_blank\"\u003eresilience4j\u003c/a\u003e \u003c/span\u003e\u003cspan\u003e. Thanks to these libraries, we can implement fallbacks and other resilience patterns very easily and effectively.\u003c/span\u003e\u003c/p\u003e\u003ch3\u003eEnvironment\u003c/h3\u003e\u003cp\u003e\u003cimg loading=\"lazy\" width=\"700\" height=\"481\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/oX4PXipSRFeCHU0zdbj7\" alt=\"Chaos Experiment\"\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eBelow you will find the information required for a successful experiment.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eTarget\u003cbr\u003e \u003c/strong\u003e\u003cspan\u003eWarehouse Service\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eExperiment Type\u003cbr\u003e \u003c/strong\u003eLatency\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eHypothesis\u003cbr\u003e \u003c/strong\u003e\u003cspan\u003eDue to the increased latency when the Warehouse Service is called, 30% of the requests are delivered using the local cache of the Product Service.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eBlast Radius\u003cbr\u003e \u003c/strong\u003e\u003cspan\u003eProduct-Service \u0026amp; Warehouse Service\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eStatus – Before\u003cbr\u003e \u003c/strong\u003eOK\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eStatus – After\u003cbr\u003e \u003c/strong\u003eERROR\u003c/p\u003e\u003cp\u003e\u003cstrong\u003eFinding\u003cbr\u003e \u003c/strong\u003e\u003cspan\u003eProduct Service fallback failed and led to exceptions, since the cache could not answer all requests.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eAs you can see from the result, we used resilience patterns but still had errors. These errors must be eliminated and tested for by running the experiment again.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003eAutomated experiments\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eChaos Engineering must be operated continuously. Your systems are also constantly changing: new versions are going into production, hardware is being replaced, firewall rules are adapted and servers are restarted. The elegant way is to establish the culture of Chaos Engineering in your company and in the minds of its people. Netflix achieved this by letting the Simian Army loose on the products of their developers – in production! They decided at some point to only do this during working hours, but still they do it.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003eEnvironment\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eFor your first chaos experiments, please choose an environment that is identical to the one in production. You will not gain any meaningful insights in a test environment where nothing is going on and that does not correspond to the setup of the platform in production. Once you’ve gained initial insights and made improvements, you can move on to production and carry out your experiments there as well. The aim of Chaos Engineering is to run it in production, always being in control of the situation and keeping customers unaffected.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003cspan\u003eFirst steps into Chaos Engineering\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eAt first, it was difficult for me to internalize and explore the ideas of Chaos Engineering in everyday life. I am not a senior chaos engineer working at Netflix, Google, Facebook or Uber. The customers I support with my expertise are just beginning to grasp and implement the principles and designs of microservices. However, what I almost always found was Spring Boot! Sometimes stand-alone, sometimes packed in a Docker container. My demos, which I use in my talks at conferences, always included at least one Spring Boot application. This led to the birth of the Chaos Monkey for Spring Boot, which makes it possible to attack existing Spring Boot applications without modifying a single line of code.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003cspan\u003eChaos Monkey for Spring Boot\u003c/span\u003e\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eAll relevant information about how Chaos Monkey for Spring Boot can help you on your way to a stable Spring Boot infrastructure can be found here on \u003ca href=\"https://codecentric.github.io/chaos-monkey-spring-boot/\" target=\"_blank\"\u003eGitHub\u003c/a\u003e \u003c/span\u003e\u003cspan\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cimg loading=\"lazy\" width=\"250\" height=\"250\" src=\"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/JL7UQEugTpGGT0I4v8kQ\" alt=\"Chaos Monkey for Spring Boot\"\u003e\u003c/p\u003e\u003ch2\u003eConclusion\u003c/h2\u003e\u003cp\u003e\u003cspan\u003eI hope I could provide you with a basic understanding of the ideas and principles behind Chaos Engineering. This topic is very important and we have a lot of catching up to do, even though we don’t work at Netflix and Co. I love my job, but even more, I love my personal life with family and friends. I don’t want to spend endless evenings and weekends fixing Prio 1 tickets; Chaos Engineering gives us confidence in the performance of a system to better withstand the turbulent conditions in production.\u003c/span\u003e\u003c/p\u003e","blogArticleCreatedAt":"4.7.2018","blogArticleReadingTime":12,"blogArticleExcerpt":"When you were a child, did you deliberately break or dismantle things in order to understand how they work? We all did – although some people have a greater urge to destroy than others. Today we call it Chaos Engineering.As developers, one of our primary...","authors":[{"id":"cl7cdzt76quk40buti98womfn","biography":"Benjamin ist inzwischen nicht mehr bei der codecentric AG tätig. Wir freuen uns, dass dich seine Inhalte interessieren. Kontaktiere uns bei Fragen oder anderen Anliegen gerne – sicher finden wir eine geeignete Ansprechperson und können dir weiterhelfen.\n","firstName":"Benjamin","lastName":"Wilms","hideLastname":null,"isImagePublic":null,"isPublic":null,"isAlumni":true,"twitterUrl":null,"stackOverflowUrl":null,"redditUrl":null,"linkedInUrl":null,"githubUrl":null,"mastodonUrl":null,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/cm7lyojlb013i07t5c34cbil9/resize=height:800/cm7n0ok9oflhb07up35496zci","width":1200,"imageAltText":"Profilbild männlicher Avatar"},"jobTitle":null,"localizations":[{"locale":"de","jobTitle":null,"biography":"Benjamin ist inzwischen nicht mehr bei der codecentric AG tätig. Wir freuen uns, dass dich seine Inhalte interessieren. Kontaktiere uns bei Fragen oder anderen Anliegen gerne – sicher finden wir eine geeignete Ansprechperson und können dir weiterhelfen.\n"}]}],"job":false,"similarBlogArticles":[{"id":"cmrnfdgdkjm2f07ta0tkju2sg","locale":"en","metaTitle":"The Human Side of AI Transformation","metaDescription":"The greatest challenge of AI transformation is not the technology, but the people. On identity, expertise, AI burnout, and new leadership.","slug":"the-human-side-of-the-ai-transformation","title":"The Human Side of the AI Transformation","brand":null,"articleCreatedAt":"2026-07-17T08:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"The Human Side of AI Transformation\nWhy we should talk not just about productivity – but also about identity, cognitive load, and the future of professional expertise\n\"AI won't replace developers – but developers who use AI will replace those who don't...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-07-30T08:00:12.215449+00:00","tags":[{"id":"cl7ccv6noqdq20duo3ppvuc7u","title":"Change Management"},{"id":"cly4fqo9h908j06urkgdev392","title":"Generative AI"},{"id":"cl7ccwjmmqd3j0cuqte62rbft","title":"Resilience"}],"authors":[{"id":"cml53fbd4dml506t7efgn0h5v","firstName":"Melanie","lastName":"Volk","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cmlq9ve8q8bhf07umx9qbld2w","width":1200,"imageAltText":null}}],"readingTime":6},{"id":"cmr0q43xpbequ07tinrq896ok","locale":"en","metaTitle":"Layered Robot Pattern for Playwright automation","metaDescription":"Browser automation with Playwright: the Layered Robot Pattern separates UI selectors from business logic — maintainable, redesign-proof, and AI-friendly","slug":"why-every-redesign-breaks-your-playwright-project-and-how-three-layers-prevent-it","title":"Why every redesign breaks your Playwright project – and how three layers prevent it","brand":null,"articleCreatedAt":"2026-07-03T08:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"TL;DR: We show how a structural separation of UI selectors and business logic can look like when using Playwright, adapting the proven Robot Pattern into the Layered Robot Pattern.\nThis way, browser automation can proceed without fear of UI changes. Table...","contentRichText":null,"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-08-03T14:53:22.413513+00:00","tags":[{"id":"cl7ccvrt3qczh0cuqdssnyns5","title":"AI"},{"id":"cl7cctq47qktw0buuu600cj3d","title":"Software development"},{"id":"cl7ccu28kqcoq0cuqxnpqlylf","title":"Frontend"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7ccw5fxqd160cuqet88m0xb","title":"Pattern"},{"id":"cl7ccurlsql1k0buu39ky7xtr","title":"UX/UI"},{"id":"cl7cctqocqdh00duou2lb9mqk","title":"Test Driven Development"},{"id":"cl7cctwrrqcn00cuq88ijuuje","title":"Software architecture"},{"id":"cl7ccwjmmqd3j0cuqte62rbft","title":"Resilience"},{"id":"cl7ccu4acqgyz0atebymyr6gn","title":"Webdevelopment"},{"id":"cl7cctvijqcm40cuqkmk6k3i0","title":"BDD"},{"id":"cl7ccv8gkql4d0buui2vnve5s","title":"Android"}],"authors":[{"id":"cl7cdo56eqrjo0butj2uxfvsv","firstName":"Lars","lastName":"Jouon","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/chXhvTBRJ23PaqwTxtV9","width":1200,"imageAltText":null}},{"id":"cl8oecsp8pmkn0bul0bb13xrd","firstName":"Rebecca ","lastName":"Jox","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/JH7eLMGqTEidWiaSQvgQ","width":1200,"imageAltText":null}}],"readingTime":9},{"id":"cmpts7ykgrj9n07tfdqhkga44","locale":"en","metaTitle":"Ensuring accessibility with AI: what works today","metaDescription":"From CI scanner to two-agent workflow: I tested AI tools to make a web app accessible. What works and what still requires manual effort.","slug":"ensuring-accessibility-with-ai-what-works-today-and-what-doesnt","title":"Ensuring accessibility with AI: what works today (and what doesn't)","brand":null,"articleCreatedAt":"2026-06-02T08:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":null,"contentRichText":{"text":"Since June 2025, the Barrierefreiheitsstärkungsgesetz (BFSG), Germany's law implementing the European Accessibility Act, has been in effect. Most teams know they should be doing something about it, but in day-to-day work, the topic usually falls by the wayside. Too much effort, too specialized, not enough expertise on the team, and besides, there are more important things to do. At the same time, AI tooling is exploding. The tempting question is obvious: Can AI save us the effort of ensuring accessibility, or are we still far from that? I set out to explore this question. I tried different AI tools and approaches to see how far you can get with AI and accessibility as of May 2026. I'd like to share my findings with you.\\nAI and accessibility: two sides\\nIn general, AI can support us on the topic of accessibility from two different directions: from the user perspective and from the developer perspective.\\nFrom the user perspective, AI could help by interpreting visual content and assisting users in navigating the internet. Examples include \\nSeeing AI\\n, \\nUserWay\\n or \\nBe My AI\\n, which promises:\\n\"No more guessing. Whether it's a menu, a document or a tricky interface, AI helps you navigate with confidence\".\\nHowever, this comes with certain risks and has its limitations. Descriptions can be inaccurate or even incorrect, and for motor impairments, for example, it doesn't help at all. Moreover, you can't assume that people with impairments will purchase such expensive devices or subscriptions. Therefore, the responsibility remains with us developers to ensure accessibility.\\nSo: How can AI support us on the developer side? Let's take a look.\\nWhere we stand today\\nBefore we talk about tools, a quick reality check. Automated accessibility testing engines like \\naxe-core\\n detect between 20% and 57% of WCAG violations, depending on the study.\\nWCAG\\n (Web Content Accessibility Guidelines) are international guidelines for making websites and digital content accessible.\\nThe often-cited \\n57% figure from Deque\\n is based on a modified metric that counts issues by frequency rather than by WCAG criteria. Independent comparative tests arrive at \\nsignificantly lower numbers\\n. The remaining violations cannot be detected automatically and must be found and assessed manually.\\nThis is because different aspects of accessibility lend themselves to automation to varying degrees. Color contrasts, missing alt texts for images, or incorrect ARIA attributes (additional information for screen readers) can be reliably detected by a tool. Whether a heading hierarchy makes sense in terms of content is already more difficult. And whether a person using a screen reader can actually understand and operate the page would need to be tested manually by a human. Or can AI do it already?\\nThe experiment\\nI took an application that wasn't fully accessible and tried to improve it using only AI tools. I skipped explicit accessibility checks in E2E tests and didn't test the page manually. Instead, I relied entirely on AI tools. The AI was supposed to understand the use cases from the code and test the page independently. Ideally, it should also test components that weren't directly visible, such as error messages or toasts.\\nI tried several approaches: a CI scanner that automatically creates issues; Claude Code with and without tools; specialized MCP servers; and a two-agent workflow that ultimately found over twenty real problems. I'd like to share what came out of each approach.\\nLevel 1: The CI scanner: scan and fix\\nFirst, the idealistic vision: a tool scans the finished application, finds problems, and ideally fixes them itself. The \\nGitHub AI-powered Accessibility Scanner\\n was supposed to do exactly that. You define URLs, the scanner checks them, takes screenshots along the way, creates a GitHub issue for each problem, and optionally tasks Copilot with creating a fix as a pull request. The idea appealed to me immediately: aside from the CI pipeline configuration, you don't have to touch the code yourself. Everything else runs automatically.\\nDisclaimer: As of May 2026, the scanner is still in Public Preview and is being actively developed; the limitations described may change.\\nIn practice, I ran into problems. The scanner couldn't log in because it looks for hard-coded labels in the login form: \\nusername\\n and \\npassword\\n. If the labels have different names or the app isn't in English, it bails out. This could be solved with a workaround: I handled authentication via an API call upfront and passed in the session cookies.\\nHowever, even with that, I didn't get real results: the scanner runs the axe scan before React has finished rendering the page, so it checks an empty DOM. It reported errors that didn't actually exist and immediately created more than 15 repetitive issues, one per URL. I couldn't solve the empty DOM problem.\\nAnd ultimately: under the hood, it's just an axe scan, that's not really \"AI.\" It only checks the initially loaded view, no modals, no forms, no keyboard navigation, no VoiceOver, and above all, no assessment of \"is it actually usable?\" Even if the client-side rendering problem were solved, it wasn't worth the effort to me: you can build axe-core into your existing E2E tests faster than going through the whole setup.\\nLevel 2: Claude Code\\nThe next approach was simpler: I gave Claude Code a maximally simple and deliberately general prompt: \"Make my app accessible.\" Without additional tools, Claude looks at the source code and fixes what it finds.\\nI had expected Claude to only find a few obvious missing \\naria-label\\n attributes, but it found significantly more, for example:\\nmissing button semantics,\\nnon-focusable elements with click handlers,\\ncontrast issues,\\nmissing ARIA states,\\n\u003cdiv\u003e\\n elements acting as buttons,\\nissues with the heading hierarchy\\nWith Playwright MCP, an interface through which AI assistants can call external browser tools, the approach can be extended: Claude can open the running app, navigate through pages, find runtime issues, and fix them directly. It discovered things that the static code review couldn't find:\\npage titles didn't update on route changes\\na combobox had \\naria-label=\"null\"\\n as a string — a runtime bug that looks like a valid variable in the code\\nclickable table rows were partially unreachable for keyboard users\\nthe login form used only placeholders instead of real labels, hard to spot in the code since an external component library is used.\\nThe page got better as a result, but it was still far from fully accessible.\\nThe problem is the lack of systematic approach. Claude does reference WCAG rules when it finds problems, but it doesn't work through a checklist. It walks through the app and fixes what catches its eye. Playwright MCP's \\nbrowser_snapshot\\n would have returned the accessibility tree, but it wasn't even used. With it, Claude could have seen which elements have no understandable name for screen readers and which roles are missing or incorrectly set. The landmark structure from a screen reader's perspective would have been visible too. Instead, it relied on what was visually apparent. In the end, the app was better than before, but I had no confidence in what was still missing.\\nLevel 3: MCP servers for accessibility\\nWith MCP, AI assistants can call external tools that are specifically predefined and developed for the task at hand. From this step, I hoped to gain more systematic structure with specialized MCP servers for accessibility on one hand, and qualitatively better results on the other.\\nI tried different open-source MCP servers. Unfortunately, when it came to live testing, they all had the same login problem as the GitHub Accessibility Scanner. I managed to solve it with a workaround for one server.\\nThe MCP server \\nMCP Accessibility Scanner\\n runs as a Docker container with its own Playwright browser and comes with over 30 different tools. Besides the usual browser tools (navigate, click, type, screenshot), it has dedicated accessibility tools:\\nscan_page\\naxe-core scan with configurable WCAG tag filters (WCAG 2.0 to 2.2, Level A to AAA)\\naudit_keyboard\\nsimulates tab navigation, checks skip links, focus visibility, and focus traps\\nscan_page_matrix\\nrepeats the scan automatically across different viewports, zoom levels, and media features (forced colors, reduced motion)\\naudit_site\\ncrawler that follows internal links and scans all pages found\\nbrowser_snapshot\\nreturns the accessibility tree of the page as a screen reader sees it\\nThe server couldn't log in out of the box either, but with Claude's help and a workaround, it managed: Vite configuration adjusted, login via native JavaScript setters instead of the built-in tools. The result was qualitatively different from the previous levels: a systematic keyboard audit uncovered invisible focus points and focus jumps. It also found a touch target issue according to WCAG 2.2, which a normal axe scan doesn't even check. All results came back as reports with concrete WCAG references.\\nThe MCP server itself finds problems and reports them, but it doesn't understand the code and doesn't suggest fixes. It also only tests the specified URLs in their initial state, no dynamic content like dialogs or error messages. An AI agent could work through the findings and change code, but without expertise in accessibility best practices, the result wouldn't be better than Level 2. The next question was: What happens when you deploy specialized agents that know what to look for?\\nLevel 4: The two-agent workflow\\nI wanted to go a step further and deploy agents specialized in accessibility. At \\nAwesome GitHub Copilot\\n, you can find various open-source agents. I \"hired\" an \\nAccessibility Expert\\n and an \\nAccessibility Runtime Tester\\n for the project and ran them in parallel.\\nThe \\nAccessibility Expert \\nanalyzes source code against WCAG 2.1/2.2: semantic correctness, keyboard and focus behavior, ARIA roles and states, form labeling, focus management in modals, live regions for dynamic updates. It follows a defined protocol and also checks components that aren't currently visible on screen, which is the key difference from Level 2.\\nThe \\nAccessibility Runtime Tester\\n navigates through critical user flows via keyboard, opens dialogs and checks focus behavior, injects axe-core with WCAG filters, and uses \\nbrowser_snapshot\\n to see which elements have no name for screen readers. The tester's guiding question is: \"Can a keyboard user complete this flow from start to finish?\"\\nThe two agents can link their findings, discuss with each other, and help each other out. The Accessibility Expert identified an interactive element without keyboard support in the code, and the Runtime Tester confirmed that it wasn't reachable via keyboard. A static scan delivers only one of those two pieces of information.\\nIn the end, the agents found significantly more problems than Claude alone in Level 2, presumably thanks to best practices and concrete checklists. Although I also had to emphasize here that they should please open ALL popups and modals and please click through EVERYWHERE.\\nA few errors that were found with the MCP server's tools in Level 3 were missed by the agents, but they additionally tested user flows. What was newly discovered:\\ninteractive elements that work via click but aren't reachable via keyboard because \\nrole\\n, \\ntabIndex\\n, or keyboard handlers are missing\\nfocus after closing a dialog: focus jumps to \\n\u003cbody\u003e\\n instead of returning to the triggering element\\nThe setup effort is the lowest of all tested approaches: drop two Markdown files into the project, done. No \\nnpm install\\n, no Docker, no CLI configuration. The result isn't deterministic and isn't suitable as a CI check, but for a one-time structured review from which you can derive targeted E2E tests, I was able to achieve quite convincing results.\\nLevel 5: Combining agents and MCP servers\\nThe logical consequence of everything: deploy the specialized agents from Level 4 together with the MCP server from Level 3. When the Accessibility Runtime Tester has access to the MCP server's tools, it can build them directly into its testing workflow instead of navigating everything manually.\\nThe MCP server provides measurements: contrast ratios, pixel sizes, tab orders. The agent interprets them, links them to the code, and can assess whether a problem actually blocks a user. The tools provide more context, which hopefully means we can expect more precise findings.\\nThe combination of specialized agents and MCP servers delivers more than any approach alone: deterministic measurements from the MCP tools, contextual understanding from the agent, and user flows that a pure scanner would never cover.\\nConclusion\\nCan you build a fully accessible application with AI alone? Based on my experiments: not yet. But you can get significantly further than I expected.\\nAbove all, it allows you to quickly find and fix a lot of obvious problems without specialized knowledge, making applications more accessible than before, but not 100%, even if the AI claims otherwise. Because: \"The tool says it's okay\" doesn't mean \"It's okay.\"\\nThe example of accessibility overlays illustrates this once more: tools like \\naccessiBe\\n promised to make any website accessible via an AI widget. The US Federal Trade Commission \\nfined the company one million dollars\\n in early 2025 for misleading claims.\\nThe specialized agents partially manage to trigger and check dynamic elements like toasts, error messages, or dialogs, but not all of them. With documented user stories as input, this would presumably be more reliable, provided the documentation already exists. And even then: whether VoiceOver announces a button at the right moment depends on the context and the sequence of interactions. Non-technical requirements that need contextual knowledge can't be evaluated by any tool: Is the page structure logical? Are form elements meaningfully labeled? Is the error handling understandable?\\nThe ecosystem is evolving rapidly. What didn't exist a year ago is now available as an open-source project and works: MCP as a standard, specialized accessibility agents, axe-core directly in the IDE. The tools are still young, but the direction is right. AI is already making accessibility audits significantly more efficient today, but it replaces neither the understanding of what accessibility truly means nor manual validation.","html":"Since June 2025, the Barrierefreiheitsstärkungsgesetz (BFSG), Germany's law implementing the European Accessibility Act, has been in effect. Most teams know they should be doing something about it, but in day-to-day work, the topic usually falls by the..."},"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-06-05T12:55:39.937056+00:00","tags":[{"id":"cl8d4p1nvbk3c0drs3bqp6zdd","title":"Accessibility"},{"id":"cl7ccvrt3qczh0cuqdssnyns5","title":"AI"},{"id":"cl7ccurlsql1k0buu39ky7xtr","title":"UX/UI"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"authors":[],"readingTime":11},{"id":"cmpo1frh94y6007uxlkqpqnf9","locale":"en","metaTitle":"Playwright Auth Mocking Done Right","metaDescription":"Learn how to mock auth in Playwright tests with build-time file swapping. No runtime flags, no factory patterns, no test logic in production.","slug":"playwright-auth-mocking-done-right","title":"Playwright Auth Mocking Done Right: No Runtime Flags, No Factory Patterns, No Compromises","brand":null,"articleCreatedAt":"2026-05-28T08:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"When you work on a project that uses a third-party authentication provider, you will inevitably face this question: how do I run my Playwright tests without dealing with real login flows? Real authentication involves browser redirects, multi-factor prompts...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-05-28T08:13:28.731307+00:00","tags":[{"id":"cl7ccu28kqcoq0cuqxnpqlylf","title":"Frontend"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"authors":[{"id":"clf0wtxdkrczi0aw7i58776ux","firstName":"Maryna","lastName":"Tochkova","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/eirltPevQLufs0ljJXzM","width":1200,"imageAltText":null}}],"readingTime":8},{"id":"cmnhfq5z17wbt07upxffhot5y","locale":"en","metaTitle":"16,000 Tests in 4 Days – 80% Test Coverage with Claude Code","metaDescription":"How we generated 16,000 tests in 4 days with Claude Code, raising coverage from 58% to 80%. Lessons learned from a real project.","slug":"16000-tests-in-4-days-reaching-80-percent-test-coverage-with-claude-code","title":"16,000 Tests in 4 Days – Reaching 80% Test Coverage with Claude Code","brand":"main","articleCreatedAt":"2026-05-05T22:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"The Starting Point\nWhen we at codecentric recently took over a codebase from a previous service provider for a client, it quickly became clear that this would be no ordinary challenge. Backends, frontends, batch jobs, services — a grown application landscape...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-06-26T08:42:04.88613+00:00","tags":[{"id":"cl7ccvrt3qczh0cuqdssnyns5","title":"AI"},{"id":"cl7cctq47qktw0buuu600cj3d","title":"Software development"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"authors":[{"id":"cldtvstpjjl4m0bum87oz0f2v","firstName":"Selvarajah","lastName":"Sivarupan","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/gNBKQv6mQ5Sdro7NBdog","width":1200,"imageAltText":null}}],"readingTime":12},{"id":"cmmypablgnm9007un3h4c2l90","locale":"en","metaTitle":"AI Code Tsunami Hits the QA Dam","metaDescription":"AI generates code at breakneck speed, but everything bottlenecks at QA. Learn why the test pyramid is vital today and how to prevent Instant Legacy Code.","slug":"ai-code-tsunami-hits-the-qa-dam","title":"AI Code Tsunami Hits the QA Dam: The End of Balanced Velocity","brand":null,"articleCreatedAt":"2026-03-30T08:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"Note upfront: This article is specifically aimed at teams working on the modernization and further development of existing systems, not at greenfield projects where completely different rules apply. Everyone is talking about the massive productivity ...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-06-26T08:25:10.549145+00:00","tags":[{"id":"cly4fqo9h908j06urkgdev392","title":"Generative AI"},{"id":"cl7ccvrt3qczh0cuqdssnyns5","title":"AI"},{"id":"cl7ccvlilql7l0buuq8j48j4c","title":"DevOps"},{"id":"cl7cctqocqdh00duou2lb9mqk","title":"Test Driven Development"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"authors":[],"readingTime":8},{"id":"cmmiv7oerk6n607tarrw7gncc","locale":"en","metaTitle":"Nested Fixture Pattern for JUnit","metaDescription":"Turn JUnit @Nested classes into declarative scenario trees where fixtures set up once per scope, tear down automatically, and any subtree runs in isolation.","slug":"nested-fixture-pattern-for-junit","title":"Nested Fixture Pattern for JUnit","brand":null,"articleCreatedAt":"2026-03-09T09:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"JUnit's [@Nested][nested] classes are usually presented as a way to group related tests. But combined\nwith [@RegisterExtension][register-extension] and [ExtensionContext.Store][store], they become something more\npowerful: a declarative scenario\ntree ...","contentRichText":null,"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-06-29T10:17:25.529696+00:00","tags":[{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7cctol4qoc20ct5z4hmj2de","title":"Java"},{"id":"cl7cctq47qktw0buuu600cj3d","title":"Software development"}],"authors":[{"id":"cl7cerbqdr7xu0ct57vncekzo","firstName":"Rüdiger","lastName":"zu Dohna","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/YnpmshtQry6nrot8Sxg0","width":1200,"imageAltText":null}}],"readingTime":11},{"id":"cmluybyhbn3i806upb0n7etbm","locale":"en","metaTitle":"No Cheating: Isolated Specification Testing with Claude Code","metaDescription":"AI coding agents can teach themselves to pass your tests. Here's how to keep your specs hidden from Claude Code — and your validation truly independent.","slug":"dont-let-your-ai-cheat-isolated-specification-testing-with-claude-code","title":"Don't Let Your AI Cheat: Isolated Specification Testing with Claude Code","brand":"main","articleCreatedAt":"2026-03-02T09:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"AI agents are powerful — but they will cheat if you let them. Letting the \nsame agent develop and test your application risks one thing: it will no \nlonger fulfill the specification, it will simply learn to pass the tests. \nThis article shows how to ...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-06-29T10:17:25.529696+00:00","tags":[{"id":"cl7ccvrt3qczh0cuqdssnyns5","title":"AI"},{"id":"clsyqmpqdgxya07uid88b4vm7","title":"LLM"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"authors":[{"id":"cl7ceqia2qx030duokr6lo35r","firstName":"Thomas","lastName":"Jaspers","hideLastname":null,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/1xcrjaGOSVqFuqYsJIIM","width":1200,"imageAltText":null}}],"readingTime":12},{"id":"cm38l6vf64u0908umv4usb5y5","locale":"en","metaTitle":"Hexagonal Architecture is just an island","metaDescription":"Discover \"Alistair Island,\" a vibrant analogy explaining hexagonal architecture. Learn how domains, ports, and adapters interconnect seamlessly.","slug":"hexagonal-architecture-is-just-an-island","title":"Hexagonal Architecture is just an island","brand":null,"articleCreatedAt":"2025-01-22T11:05:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"Imagine an island called \"Alistair Island.\" This island is a vibrant place with houses, fertile soil, and a well-coordinated community of residents who live by well-defined routines. Every activity on the island has significance and serves a specific...","contentRichText":null,"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:11:25.111178+00:00","tags":[{"id":"cl7cctwrrqcn00cuq88ijuuje","title":"Software architecture"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7cctq47qktw0buuu600cj3d","title":"Software development"}],"authors":[{"id":"cl7ceqc65qwyx0duo4tsxfb6u","firstName":"Danny","lastName":"Keller","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/BrR7521yTwuL6jMOBY0a","width":1200,"imageAltText":null}}],"readingTime":10},{"id":"cm24he1u0hbr507taz0nmoksn","locale":"en","metaTitle":"Microcks: Contract Testing \u0026 Consistent Mock Environments","metaDescription":"Discover Microcks for API contract testing and consistent mock environments. Automate API validation and streamline integration. Implement Microcks today!","slug":"charge-your-apis-volume-33-definition-based-api-mocking-simulation-and-testing-with-microcks-part-3-contract-testing-and-consistent-mock-environments","title":"Charge your APIs Volume 33 - Definition-Based API Mocking, Simulation, and Testing with Microcks - Part 3: Contract Testing and Consistent Mock Environments","brand":null,"articleCreatedAt":"2024-10-23T06:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":null,"contentRichText":{"text":"Key Takeaways\\nThis article is the third and last one in a three-part series about definition-based API mocking, simulation, and testing with Microcks (make sure you have read the \\nfirst\\n and \\nsecond\\n article)\\nThe previous articles focused on (i) Microcks’ architecture; (ii) its capabilities in automated mock derivation and provisioning; (iii) mock data specification; and (iv) subsequent mock refinement. The present article goes into more advanced core features of Microcks, i.e., mock-guided contract testing and interaction with Microcks’ own API for the provisioning of consistent mock environments.\\nContract testing verifies the conformance between API definition and implementation, and can be automated with Microcks to further increase the value of mocks\\nThe provisioning of consistent mock environments is a prerequisite for mock-based integration testing, and the article shows how to automate the provisioning process and even enable its developer-local execution\\nIntroduction\\nThis article is the last one in a three-part series about definition-based API mocking, simulation, and testing with \\nMicrocks\\n. The \\nfirst article\\n presented Microcks’ architecture and an \\nexample API\\n used throughout the article series to illustrate a selection of Microcks’ core features. Its \\nfollower article\\n dealt with Microcks’ capabilities for mock data specification and mock refinement using parameters constraints and dispatchers. In the following, mock-guided contract testing with Microcks and the usage of the tool’s own API for the provisioning of consistent mock environments for integration testing are described and exemplified.\\nContract Testing\\n\\nContract testing\\n verifies that the implementation of an API conforms to the API’s contract. In general, an API contract is an agreement between an API provider and one or more of its consumers. It is typically expressed in the form of a certain definition format, and determines input and output parameters, protocols and data formats, as well as errors. A provider and a consumer successfully conclude an API contract (i) when the provider agrees to adhere to the contract upon exposing the corresponding API’s implementation; and (ii) when the consumer agrees to respect the contract when interacting with the corresponding API’s implementation.\\nIn Microcks, contract testing assumes the following prerequisites:\\nExistence of operation mocks, e.g., derived from \\nOpenAPI example objects\\n, for the API whose contract shall be tested.\\nExistence of an implementation of that API against which Microcks can run contract tests based on operation mocks.\\nIf both prerequisites are satisfied, contract test execution is feasible from Microcks' \\nweb UI\\n by navigating to the mocked API’s details page, which holds a block called \"Tests\":\\n\\nThe Conformance Index metric indicates how well the contract of a mocked API is covered by sample mock requests and responses, and thus how well an API contract is testable. Microcks calculates the Conformance Index from a variety of characteristics of a mocked API including the number of \\noperation mocks\\n and the \\ncomplexity of dispatchers\\n. The metric then informs about the maximum possible Conformance Score that is achievable from contract testing using the mocked API. For instance, the example API reaches conformance index A or, in numbers, 87.5% maximum achievable conformance when using its mocks for contract testing. That is because each of its operations has at least one example for mock derivation assigned and its dispatchers aim to prescribe the behavior of potential implementations as detailed as possible. Finally, the concrete contract conformance achieved by an API’s implementation from testing it with the respective mock counterpart in Microcks is communicated by the Conformance Score metric.\\nMicrocks' web UI allows for interactive contract testing as follows:\\nClicking the \"+ New Test\" button below the Conformance Score metric\\nIn the subsequent dialog, specifying the test endpoint, i.e., the entrypoint URL of the running API implementation against which the test shall be performed\\nIn the same dialog, selecting the test runner, which depends on the API type and desired test scope: \\nHTTP\\n: Smoke tests HTTP operations by checking that their response statuses range between 200 and 299, which signal successful execution of API operation implementations. \\nSOAP_UI\\n: For API implementations that are expected to conform to definitions modeled with \\nSoapUI\\n, checks that test case assertions are met. \\nPOSTMAN\\n: Executes test scripts from \\nPostman Collections\\n for conformance checking of API implementations.\\nOPEN_API_SCHEMA\\n: Sends mock requests derived from OpenAPI example objects to the API implementation under test and verifies that received responses conform to the mock responses derived from the example objects.\\nMicrocks' \\ndocumentation\\n lists further runners, which seemingly become available in the conformance testing dialog when mocked APIs were uploaded from definition files that follow certain formats such as AsyncAPI.\\nThe \\nOPEN_API_SCHEMA\\n runner is predestined for checking the conformance of an implementation of the example API because the API’s defining \\n\"customers.yaml\"\\n file is expressed in \\nOpenAPI\\n. However, the runner cannot be executed as-is due to the prerequisites that are imposed on mock requests by the various dispatchers for the API’s Microcks-based mock. For instance, several operations such as \\nGET /customer_kinds\\n expect a certain value in the HTTP header \\napi_key\\n, and apply a Mickrocks parameters constraint to ensure this value is present and valid. For such situations, Microcks supports fine-grained configuration of contract test executions, e.g., from the web UI in the \"New Test\" dialog:\\n\\n\\nSubsequent to contract test execution, Microcks' web UI displays a button to add the test to a CI/CD facility such as \\nJenkins\\n or \\nGitHub Actions\\n. After hitting the button and selecting the desired CI/CD technology, Microcks generates a technology-specific test execution command to be copied into CI/CD automation scripts. Hence, this feature enables to leverage Microcks for continuous API validation, e.g., to detect breaking changes and the resulting degradation of API implementation conformance.\\nThe Maven module \\n\"api-implementation-app\"\\n in the Git repository of the example API comprises an implementation of the API and therefore allows further examination of Microcks' contract testing capabilities.\\nProvisioning of Consistent Mock Environments Using Microcks' Own API\\nMicrocks comes with an \\nHTTP-based API\\n that supports automation of mock setup, test execution and reporting before, during, or after application tests are run. The Maven module \\n\"integration-tests\"\\n in the Git repository of the example API implements several tests that execute against Microcks-based mocks of the API within a test environment that builds upon Microcks' \\nTestcontainers module\\n. For illustrative purposes, the Maven module resorts to Microcks' own API in test environment setup to configure parameters constraints, e.g., the HTTP header \\napi_key\\n for the mock of the \\nGET /customer_kinds\\n operation, and dispatchers, e.g., \\nthe SCRIPT dispatcher for the mock of GET /customer\\n. As an alternative to the programmatic usage of Microcks’ own API, such information is declaratively specifiable in \\nsecondary artifacts\\n via Microcks' \\nAPI Metadata format\\n.\\nIn order to configure \\nparameters constraints and dispatchers for mocks of the example API’s operations\\n, the \"integration-tests\" Maven module interacts with a previously started Microcks testcontainer by means of Microcks' own API during \\ntest environment setup\\n. In this step, the module invokes the following operations, which are organized under the mock tag in the \\nOpenAPI definition of Microcks' own API\\n:\\nGET /services/{id}\\n: Microcks subsumes mocked APIs under the term \"Services\" and this operation allows retrieval of information about Microcks Services. The test environment setup in the \"integration-tests\" Maven module relies on the operation to gain access to Microcks' descriptions of the mocks for the example API’s operations. The module then utilizes these descriptions to install parameters constraints and dispatchers prior to test case execution against the operation mocks.\\nPUT /services/{id}/operation\\n: This operation allows modification of operation mocks from their Microcks descriptions. The \"integration-tests\" Maven module employs this operation to extend the mocks for the example API’s operations with the required parameters constraints and dispatchers. Since the operation follows HTTP PUT semantics, it overrides existing operation descriptions with given ones. Therefore, information that was derived from API definitions, e.g., inferred dispatchers, must be always incorporated into operation descriptions that are passed to the operation. The curl command for adding the \\nJSON_BODY dispatcher and api_key header constraint to the mock of the POST /login operation\\n via Microcks' own API is as follows:\\nDISPATCHER_RULES_AS_STRING=$(echo '{\n \"exp\": \"/password\",\n \"operator\": \"equals\",\n \"cases\": {\n \"123456\": \"some_customer\",\n \"default\": \"invalid_credentials\"\n }\n}' | jq '. | @json')\n\ncurl -X PUT \\\t\nhttp://localhost:33047/api/services/66b5.../operation?operationName=POST+%2Flogin \\\n -H \"Content-Type: application/json\" \\\n --data '{\n \"dispatcher\": \"JSON_BODY\",\n \"dispatcherRules\": '$DISPATCHER_RULES_AS_STRING',\n \"parameterConstraints\": [{\n \"name\": \"api_key\",\n \"required\": \"true\",\n \"recopy\": \"false\",\n \"mustMatchRegexp\": \"\\\\QeyJhbGciOiJIUzI1NiJ9....\\\\E\",\n \"in\": \"header\"\n }]\n }'\\nNote that the command assumes the Microcks testcontainer to be running at \\nhttp://localhost:33047\\n and the ID of the Microcks Service of the example API retrieved with \\nGET /services/{id}\\n to be “66b5...”.\\n\\nDiscussion\\nIn the following, we discuss potential use cases and further characteristics of Microcks to support reasoning about its applicability in your own projects. However, it should be noted that Microcks is a \\nCNCF sandbox project\\n and as such \\nunderlies continuous improvements\\n, which is why it makes sense to frequently consult \\nMicrocks' blog\\n to learn about them. For instance, this article series primarily focused on core features of Microcks and omitted advanced, yet powerful, features like stateful mocks from \\nMicrocks' recent 1.10.0 release\\n.\\nIn general, projects that are looking for approaches to increase API development speed and quality should have Microcks on their list of tools for further examination. That is because of Microcks' versatility resulting from (i) its support for the most common API definition formats; (ii) the several options for definition import; (iii) features like parameters constraints and dispatchers to bring API mocks to life without no or low code; (iv) eased integration with modern test frameworks and CI/CD pipelines; (v) the possibility to specify contract tests, either in an automated or interactive fashion; and (vi) an open and passionate community with low response times and comparatively quick bug fixes. Furthermore, while Microcks enables automation via its \\nCLI tool\\n and own API, it also comes with a streamlined web UI. \\nHowever, due to its versatility, the integration of Microcks also incurs a certain learning curve. For example, to integrate with existing projects spanning several teams and/or roles, one should get familiar with the configuration and operation of \\nKeycloak\\n. Furthermore, the effective application of features like JSON_BODY and especially SCRIPT dispatchers require engagement with additional technologies that are not as widespread as everyday programming languages or frameworks like Java and Spring. Concerning the latter kind of dispatcher, debugging capabilities are currently rather limited and its utilization can counteract Microcks’ focus on no code/low code for even mildly complex APIs with only a few interaction constraints. In addition, Microcks adopters should be aware that the tool sometimes provides several ways to achieve the same outcome. For example, one might employ OpenAPI example objects or \\nPostman Collection\\n examples to describe mock requests and responses. Similarly, Microcks' own API can partially fulfill the same purposes as its Metadata format.\\nFor the more technical subtleties, while Microcks supports the most common API definition formats, it inherently assumes that existing definitions conform to those formats for automatic mock derivation. Additionally, Microcks requires definitions in certain formats to comprise versioning information. Also, OpenAPI-based definitions must be accompanied by Postman Collections. Another Microcks feature that the article series did not discuss are Direct APIs. It enables the interactive creation of API definitions from scratch using Microcks’ web UI, but seems currently rather rudimentary as it only generates basic CRUD operations for one resource. Consequently, APIs that are not resource-driven or require more sophisticated operations cannot immediately be modeled as Direct APIs. Furthermore, the subsequent modification of generated Direct API definitions does not seem possible from Microcks' web UI. In any case, Microcks heavily depends on the quality of provided data, i.e., the quality of API definitions, and, at the time of writing, does itself not provide means to actively assist in improving quality deficiencies in mocked APIs besides their detection by mock tests.\\nRegarding contract testing, Microcks' capabilities in test failure reporting make a veritable target for future improvement. For instance, technical details about failed tests like a missing header in a mock request are not visible from Microcks’ web UI but only from technical logs, e.g., by issuing the docker logs command against a running Microcks testcontainer. Moreover, URLs that are suffixed by a redundant forward slash (/) can cause contract tests to fail.\\nLastly, while there is always a community member and even core developer of Microcks to reach out for support, the documentation itself is still sparse, especially for advanced topics, which is likely due to Microcks' fast development cycles and rapid inclusion of new features from community feedback.\\nConclusion\\nThis three-part article series (see the \\nfirst\\n and \\nsecond\\n article) presented and discussed some core features of Microcks—a CNCF sandbox project that develops a multi-protocol tool for API mocking, simulation, and testing. Microcks is able to derive and serve mocks from API definitions based OpenAPI or AsyncAPI, among others. It aims to address the concerns of (i) API implementers by enabling comparatively lightweight integration and contract testing; (ii) API owners and quality assurers with API simulation for conformance assessment; and (iii) platform engineers who are in charge of development and test environment provisioning. In order to support the requirements of this rather broad target audience, Microcks provides several features that allow for mock refinement, e.g., constraint specification for message headers and query parameters of mocked API operations, custom dispatchers to influence mock routing, and automated or interactive contract testing of API implementations guided by previously derived API mocks. The article illustrated these features by means of a Git repository comprising (i) the OpenAPI definition of a coherent example API; (ii) the example API’s instrumentation for mock-based integration testing leveraging Microcks’ Testcontainers module and own API; and (iii) an implementation of the example API for experimenting with Microcks’ capabilities in contract testing. To summarize, Microcks is a very versatile and flexible tool for API mocking, simulation, and testing that bears a broad range of innovative features. On the other hand, teams that need to rely on mature and long-proven technology could be put off by the experimental mindset which Microcks yet implies in some areas and which is expectable from a growing CNCF sandbox project.","html":"Key TakeawaysThis article is the third and last one in a three-part series about definition-based API mocking, simulation, and testing with Microcks (make sure you have read the first and second article)The previous articles focused on (i) Microcks’ ..."},"likes":1,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:12:25.276378+00:00","tags":[{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7ccu1p9qof20ct5mxp953e2","title":"API"}],"authors":[{"id":"cloe4lfdsj3ns0auokx0t8cbb","firstName":"Dr. Florian","lastName":"Rademacher","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/U64hKnGTf6d3Q0kvbuLX","width":1200,"imageAltText":null}}],"readingTime":11},{"id":"cm1upa92z0v3n07umulejgfy6","locale":"en","metaTitle":"Microcks API Mocking: Data, Validation \u0026 Routing","metaDescription":"Master Microcks: specify mock data, validate requests, and route flexibly. Automate and refine your API mocks for efficient testing processes.","slug":"charge-your-apis-volume-32-definition-based-api-mocking-simulation-and-testing-with-microcks-part-2-specification-of-mock-data-request-validations-and-routes","title":"Charge your APIs Volume 32 - Definition-Based API Mocking, Simulation, and Testing with Microcks - Part 2: Specification of Mock Data, Request Validations and Routes","brand":null,"articleCreatedAt":"2024-10-16T06:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":null,"contentRichText":{"text":"Key Takeaways\\nThis article is the second one in a three-part series about definition-based API mocking, simulation, and testing with Microcks (make sure you have read the \\nfirst article\\n)\\nWhile the previous article concentrated on Microcks’ architecture, and its capabilities in automated mock derivation and provisioning, the present article focuses on mock data specification by means of example objects and features for mock refinement, i.e., parameters constraints for request validation mocking and dispatchers for flexible mock routing\\nExample objects make it possible to further increase the degree of automation in mock derivation and provisioning, thereby lowering efforts in mocking\\nParameters constraints and dispatchers allow for raising the level of conformance between API functionality and mocks with low-code and even no-code approaches, depending on the complexity of mocked functionality\\nIntroduction\\nThis article continues the three-part series about definition-based API mocking, simulation, and testing with \\nMicrocks\\n. The \\nfirst article\\n presented Microcks’ architecture and an \\nexample API\\n that got uploaded to a running instance of Microcks which then derived and served mocks from the API’s definition. In the following, further core features of Microcks are described and practically illustrated on the basis of the example API. These features comprise mock data specification from defined example objects, parameters constraints for the mocking of request validations, and dispatchers to influence mock routing. Both latter features constitute comparatively low-effort mechanisms for subsequent mock refinement targeting API functionality that has an increased complexity.\\nExample Objects as Sources for Automated Mock Provisioning\\nMicrocks Importers derive mock structures including operation paths and payload elements from existing API definitions. However, structures alone are not sufficient for effective API mocking, simulation, and testing, all of which assume the possibility to interact with operation mocks by exchanging request and response messages adhering to mock structures. For this purpose, Microcks is able to distill requests and responses of concrete API interaction scenarios from example objects. These objects may be included in API definition files that are uploaded to Microcks. Alternatively, they may be described in excerpts that follow a certain definition format. Microcks considers such excerpts \"secondary artifacts\" as they are separated from a \"primary API definition\" and accompany it with example objects. Upon import of a secondary artifact, Microcks transforms comprised example objects into mock requests and responses by merging the artifact’s definition with a previously selected primary definition that was already uploaded to Microcks. Effectively, the merging of a primary definition with secondary artifacts yields a combined definition that gathers all relevant information for API mocking, i.e., mock structures from the primary definition and example objects for concrete message exchange from the secondary artifact. Secondary artifacts come in handy, e.g., (i) when bloating an already complex API definition with additional information shall be prevented; (ii) when examples comprise critical business or security-relevant information, and must therefore not be included in publicly shared primary definitions; or (iii) when primary definitions stem from external systems, are immutable, and lack examples.\\n\nThe example API illustrates both, the description of example objects in primary API definitions as well as in accompanying secondary artifacts. As for the former, the primary definition file \\n\"customers.yaml\"\\n defines the response \\nOpenAPI example object\\n \\nsome_customer\\n for the operation \\nGET /customer\\n:\\n/customer:\n get: \n responses:\n \"200\":\n ...\n examples:\n some_customer:\n email: \"some_customer@example.org\"\n first_name: \"{{ randomFirstName() }}\"\n last_name: \"{{ randomLastName() }}\" \n address: \"{{ randomStreetAddress() }}, {{ randomCity() }}, {{ randomCountry() }}\"\\nsome_customer\\n consists of four fields of which the \\nemail\\n field has the fixed value \\n\"some_customer@example.org\"\\n. By contrast, values of the three remaining fields are governed by Microcks \\ntemplate expressions\\n for dynamic mock content. Upon mock request, Microcks evaluates such expressions and replaces them with evaluation results. For instance, the template expression \\n\"{{ randomFirstName() }}\"\\n for the field \\nfirst_name\\n leads to a capitalized random string of characters that makes up the potential first name of a person, e.g., \"John\" or \"Jane\". Similarly, the combined template expression \\n\"{{ randomStreetAddress() }}, {{ randomCity() }}, {{ randomCountry() }}\"\\n for the field address evaluates to a hypothetical address consisting of a random street, city, and country.\\n\nWhile the example object for \\nGET /customer\\n is specified for only the operation’s response, Microcks also recognizes pairs of example objects in which a response object is assigned to a certain request object. From those pairs, Microcks derives operation mocks that yield a given pair’s response object when the pair’s request object is sent to a mock. In the context of the example API and \\nits definition\\n, the \\nsome_customer\\n example object of the \\nPOST /login\\n operation denotes an example object that is spread over the operation’s request and response definition parts. In its \\nweb UI\\n, Microcks displays matching pairs of requests and responses in the detailed view of operation mocks:\\n\\nTo illustrate the refinement of primary API definitions with example objects from secondary artifacts, the Git repository of the example API comprises the file \\n\"customers_examples.postman_collection.json.\"\\n It contains the example API in Postman’s Collection format, which was used to specify an example for a successful invocation of the \\nGET /customer_kinds\\n operation:\\n\\nLike primary API definitions, secondary artifacts can be uploaded to Microcks with Importers when ticking the checkbox \"Is a Secondary Artifact?\" in the import dialog. Secondary artifacts are a powerful feature of Microcks because they separate API definitions from the definition of mock messages. Consequently, they support usage scenarios in which, e.g., developers design and implement APIs based on a technical definition format whereas domain experts capture business-inspired API messages using dedicated formats and tools. Another use case for secondary artifacts is the externalization of mock message definitions that depend on Microcks-specific functionality. For example, the Microcks template expressions embodied above in the \\nsome_customer\\n example object for the \\nGET /customer\\n operation aggravate the corresponding API definition’s publication in \\nAPI catalogs\\n. That is because definition users that are unfamiliar with Microcks likely do not know how to correctly interpret the template expressions. Additionally, the expressions make the API definition depend on Microcks with all the potential negative impacts of technology dependence such as decreased maintainability and compatibility. Starting from version 1.10.0, Microcks also comes with its \\nown definition format for API examples\\n.\\nMocking Request Validations with Parameters Constraints\\nFor the mocking of operations that check the values of HTTP headers or URL query parameters for well-formedness, validity, or other structural or semantic properties, Microcks provides the \\nparameters constraints\\n feature.\\nA Microcks parameters constraint consists of the following elements:\\nName\\n: Unique identifier for the constraint. This identifier is equivalent to the name of the constrained HTTP header or URL query parameter.\\n\"Required\" flag\\n: Boolean value indicating whether the constrained HTTP header or URL query parameter of the given name must be present in valid mock requests.\\n\"Recopy\" flag\\n: Boolean value indicating whether the constrained HTTP header or URL query parameter of the given name and its value from a mock request shall be sent back to the caller as an outgoing HTTP header. Helpful to simulate, e.g., transaction propagation.\\nMatch constraint\\n: Regular expression against which the value of a constrained HTTP header or URL query parameter must match for Microcks to forward the received request to a mock.\\nIn the context of the example API, the mock for the \\nGET /customer_kinds\\n operation applies a parameters constraint to determine the expected value of the HTTP header field \\napi_key\\n. Effectively, this constraint simulates the behavior of Bearer tokens. In Microcks' web UI, parameters constraints are configurable from the mock details dialog:\\n\\n\\nFlexible Mock Routing with Dispatchers\\nMicrocks relies on the concept of \\ndispatching\\n to determine the mock that shall be invoked upon request receipt. More precisely, mock dispatchers specify rules for dispatch criteria, i.e., those parts of incoming requests that Microcks shall match with rules to derive the most suitable response.\\nMicrocks is able to automatically infer dispatchers from API definitions. For OpenAPI definitions, the following are commonly inferred dispatchers:\\nURI_PARTS\\n: Inferred for API operations that have only path parameters, e.g., \\nGET /customer_kinds/{id}\\n from the example API. Here, Microcks identifies the id path parameter as the distinguishing request part so that responses are sent depending on a concretely requested customer kind ID. If there is more than one path parameter, all parameters must match in logical conjunction, i.e., a response is only sent if it matches with the values of all requested path parameters.\\nURI_PARAMS\\n: Equivalent to \\nURI_PARTS\\n but for API operations with only query parameters.\\nURI_ELEMENTS\\n: Inferred for API operations with path and query parameters. The matching logic is based on the logical conjunction of path parameters or the logical conjunction of query parameters. That is, for a response to match either all path parameter values, all query parameter values, or both must match.\\n\nOther automatically inferred dispatchers include \\nQUERY_ARGS\\n (for GraphQL or gRPC operations) and \\nQUERY_MATCH\\n (for SOAP operations). Microcks' \\ndocumentation\\n describes those dispatchers in detail.\\nJSON_BODY\\n and \\nSCRIPT\\n represent dispatchers that are not automatically inferred. Instead, they must be specified explicitly, either interactively by means of Microcks' web UI or programmatically by means of Microcks’ own API (see the upcoming last article of the three-part series). Therefore, \\nJSON_BODY\\n and \\nSCRIPT\\n are more advanced and powerful dispatchers than the inferred ones. They are also both applied in the Microcks-based mock provisioning for the example API.\\nJSON_BODY\\n is a dispatcher that matches requests’ JSON bodies against expressions, which are themselves formulated in JSON based on three fields:\\nexp\\n: \\nJSON Pointer\\n that selects a specific body value against which the dispatcher shall match.\\noperator\\n: Comparison operator depending on the following \\ncases\\n clause. A complete list of comparison operators can be found in Microcks' \\ndocumentation\\n.\\ncases\\n: Mapping of selected body values to the names of corresponding mock responses in Microcks. A response is selected and sent back by the dispatcher to the requesting client when the mapped value matches with the value from the response’s \\nbody\\n, as selected by \\nexp\\n, following the matching logic of the specified \\noperator\\n.\\nThe example API applies the \\nJSON_BODY\\n dispatcher for mocking the \\nPOST /login\\n operation. Here, the dispatcher is responsible for matching login requests to \\ncustomer_token\\n responses via the value provided in the \\npassword\\n field of the received request. The corresponding dispatcher code is as follows:\\n{\n \"exp\": \"/password\",\n \"operator\": \"equals\",\n \"cases\": {\n \"123456\": \"some_customer\",\n \"default\": \"invalid_credentials\"\n }\n}\\nWith the \\n\"/password\"\\n JSON pointer, \\nexp\\n selects the value in the password field provided in a structurally valid mock request. The \\n\"equals\"\\n \\noperator\\n then checks for an exact match of the selected value with one of the mapping values in the \\ncases\\n field, e.g., the password \"123456\". The \\n\"default\"\\n case applies when none of the mapping values matches. The string value that is assigned to the mapping value of a case is interpreted by Microcks as the name of the mock response to be sent back when the case applies. For instance, when \"123456\" is received as value in the password field of a mock request, Microcks sends back the response named \\n\"some_customer\"\\n, which is equivalent to sending back the \\ncustomer_token\\n of the customer whose password is \"123456\". As per the dispatcher, all other password values will result in the response named \\n\"invalid_credentials\"\\n. Note that for illustrative purposes and the stripped down example API, this mapping is sufficient. However, for more complex test data with a variety of customers the mapping easily becomes ambiguous when for more than one test customer a trivial test password such as \"123456\" is specified. Such cases are better handled with Microcks \\nSCRIPT\\n dispatchers.\\n\n\\nSCRIPT\\n dispatchers determine mock responses from the execution of \\nGroovy \\nscripts. Since these dispatchers can resort to the functionality of a general-purpose programming language and its ecosystem, they are both the most versatile and error-prone kind of Microcks dispatchers.\\nPrior to the execution of \\nSCRIPT\\n dispatchers, Microcks sets up a runtime environment that enables access to certain elements of incoming requests via specialized Groovy objects stored in global variables:\\nmockRequest\\n: Object providing access to received requests. For instance, the \\nrequestContent\\n attribute holds the request payload, whereas the \\ngetRequestHeaders()\\n method returns a map of request header names to values.\\nrequestContext\\n: Map that acts as a request-scoped storage for arbitrary information. \\nMock templates can access this information\\n for sophisticated dynamic mocking.\\nlog\\n: Object for the invocation of log methods such as \\ninfo()\\n or \\nerror()\\n. Since logging seemingly is the only means for \\nSCRIPT\\n dispatcher debugging, keeping script complexity as low as possible is advisable.\\nstore\\n: Map for string value storage that is persistent to an operation mock and as of Microcks 1.10.0 supports \\nstateful mocks\\n.\\nThe mock of the example \\nGET /customer\\n operation involves a \\nSCRIPT\\n dispatcher to map customer-specific login tokens returned by \\nPOST /login\\n to corresponding mock responses with customer details:\\ndef headers = mockRequest.getRequestHeaders()\ndef loginToken = headers.get(\"customer_token\", \"null\")\nswitch(loginToken) {\n case \"eyJhbGciOiJIUzI1NiJ9....\": return \"some_customer\"\n default: return \"invalid_credentials\"\n}\\n\nFirst, the Groovy script retrieves the customer-specific \\nloginToken\\n from the \\ncustomer_token\\n header of a mock request to \\nGET /customer\\n. Next, the script decides which mock response to return by switch-casing over the \\nloginToken\\n. In case a concrete \\nloginToken\\n is known to the operation mock, the dispatcher returns the name of the mock response, e.g., \\n\"some_customer\"\\n, that represents the customer details JSON object corresponding to the \\nloginToken\\n. This JSON object is then returned by Microcks to the caller. Alternatively, in case a provided \\nloginToken\\n does not map to a known customer mock response, the script returns the default mock response \\n\"invalid_credentials\"\\n. In Microcks' web UI, the configuration of the \\nSCRIPT\\n dispatcher looks as follows:\\n\\n\\nConclusion and Outlook\\nThis second article in a three-part series about definition-based API mocking, simulation, and testing with Microcks described and exemplified further core features of the tool, namely mock data specification from defined example objects, parameters constraints for the mocking of request validations, and dispatchers to influence mock routing. While the derivation of mock data specification increases automation in API mocking, the latter features aim to decrease the efforts in mock refinement with low-code and no-code approaches, thereby targeting API functionality of increased complexity. The next and final article of the series will take a look at mock-guided contract testing with Microcks and the provisioning of consistent mock environments using Microcks’ own API. In addition, this concluding article discusses potential use cases and further characteristics of Microcks to support reasoning about its applicability in your own projects.","html":"Key TakeawaysThis article is the second one in a three-part series about definition-based API mocking, simulation, and testing with Microcks (make sure you have read the first article)While the previous article concentrated on Microcks’ architecture,..."},"likes":1,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:12:25.276378+00:00","tags":[{"id":"cl7ccu1p9qof20ct5mxp953e2","title":"API"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"authors":[{"id":"cloe4lfdsj3ns0auokx0t8cbb","firstName":"Dr. Florian","lastName":"Rademacher","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/U64hKnGTf6d3Q0kvbuLX","width":1200,"imageAltText":null}}],"readingTime":11},{"id":"cm1ucuu3pzrec07umvyrgqxa5","locale":"en","metaTitle":"Microcks: Definition-Based API Mocking \u0026 Testing","metaDescription":"Discover Microcks for definition-based API mocking, simulation, and testing. Automate mock derivation and improve your development efficiency now.","slug":"charge-your-apis-volume-31-definition-based-api-mocking-simulation-and-testing-with-microcks-part-1-introduction","title":"Charge your APIs Volume 31 - Definition-Based API Mocking, Simulation, and Testing with Microcks - Part 1: Introduction","brand":null,"articleCreatedAt":"2024-10-09T06:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":null,"contentRichText":{"text":"Key Takeaways\\nAPI mocking used, e.g., for integration testing, is challenging as it assumes conformance to mocked API functionality, which can incur significant costs as mock complexity increases with API complexity\\nDefinition-based API mocking can reduce these costs by automating the derivation and provisioning of mocks from API definitions that are expressed with established specifications such as OpenAPI or AsyncAPI\\nStill, automatically derived mocks may not be fully conformant with mocked API functionality given the limitations in specifications’ expressiveness\\nWe present and discuss Microcks, a multi-protocol tool for API mocking, simulation, and testing, that enables automated mock derivation and provisioning from API definitions, but also comes with low-effort features for subsequent mock refinement, e.g., dispatchers for flexible mock routing, as well as support for mock-guided contract testing\\nThis article is the first in a three-part series, and focuses on Microcks’ architecture and capabilities in mock derivation and provisioning\\nIntroduction\\nAPI mocking is a challenging task. First, mocks are simplified surrogates of other components whose functionality is intentionally limited to a portion of the behavior of these components. Therefore, mocks facilitate testing of this behavior by optimizing for understandability and short provisioning time. However, the tested behavior must be mimicked correctly to ensure test reliability. Second, mock complexity is proportional to API complexity because mock implementations’ susceptibility to errors increases with the number of API endpoints, operations, and responses. Third, mock implementation can become expensive. This is especially true in the context of APIs which typically require not only structural and behavioral mocking but also additional infrastructure for mock provisioning and serving. As a result, efforts related to API evolution and maintenance expand to mocks, and often incur adaptation both of mock code and mock server code.\\nSince the \\nbenefits of mocks in software testing\\n still outweigh their drawbacks, dedicated means are required to effectively cope with the aforementioned challenges. Enter \\nMicrocks\\n. Microcks is a multi-protocol tool for API mocking, simulation, and testing. It addresses the above challenges by deriving and serving mocks from API definitions that are written in, e.g., \\nOpenAPI\\n or \\nAsyncAPI\\n, or that are wrapped into \\nPostman\\n collections or \\nSoapUI\\n projects. Hence, for certain use cases, Microcks provides a no-code approach to mock provisioning, but on the other hand comes with sophisticated features that allow for manual mock refinement beyond API definitions. Microcks' \\ntarget audience\\n ranges from developers, who want to implement lightweight integration and \\ncontract tests\\n, over API owners and quality assurers, who want to simulate APIs to assess their conformance, to platform engineers, who are responsible for test environment provisioning in \\ndeveloper portals\\n. \\nThis first article in a three-part series about definition-based API mocking, simulation, and testing with Microcks digs into the tool’s architecture and execution modes. In addition, the article introduces an example API, which will be used throughout the series to practically illustrate a selection of Microcks’ core features, and shows how to leverage Microcks to derive and serve mocks from the API’s definition.\\nMicrocks in (More) Depth\\nMicrocks is an application \\nprimarily written in Java and TypeScript\\n. Its logical architecture consists of the following components:\\nbroker\\n: Synchronizes data between Microcks’ components by means of \\nApache Kafka\\n.\\ndatabase\\n: Persists data that is managed by Microcks, e.g., APIs and tests, in a MongoDB database.\\nkeycloak\\n: Implements means for authentication and integration with external identity providers.\\nmicrocks-async-minion\\n: Allows testing of asynchronous API operations that were specified in the webapp component.\\nmicrocks-postman-runtime\\n: Executes API tests from Postman Collections and stores test results.\\nwebapp\\n: Gathers Microcks' UI resources and API endpoints.\\nA visualization of this architecture is available from \\nMicrocks' documentation\\n. \\nMicrocks can run as a permanent server, e.g., based on a \\ndedicated Docker image\\n, which allows for its deployment as a centralized API mocking platform. A development team may then use this platform to (i) maintain mocks of its API definitions; (ii) track mock evolution with Microcks' integrated versioning tracking; and (iii) provide mocks to other teams, thereby enabling all \\nflavors of contract testing\\n. Alternatively, Microcks can be executed as an ephemeral container for integration testing on local developer hardware or as part of remote CI/CD pipelines. For this purpose, Microcks' \\nTestcontainers module\\n comes into play. \\nIndependent of its execution mode, Microcks pursues three goals:\\nShorten feedback loops when creating, adapting, and evolving APIs and their definitions.\\nSpeed up development processes by ad-hoc mock derivation from API definitions. This approach enables, among others, the resolution of team dependencies in which one team has to wait for the implementation of an API by another team before being able to integrate with this API.\\nRecognize discrepancies in the conformance of API implementations with their definitions each time when changes to one of these artifacts occur.\\nThe Example API: Customer Management\\nDisclaimer: \\nWe discovered the example API, which we are relying on to practically illustrate a selection of Microcks’ core features during the article series, in the wild, and found it quite coherent, understandable, and therefore suitable to exemplify and discuss a selection of Microcks' core features. However, this API also bears some potential for optimization and does not reflect a style of API design \\nthat we would advise\\n.\\nThe example API represents functionality for customer management. More precisely, it specifies (i) the retrieval of customer kinds which the provider, i.e., the provider, offers for customer categorization; (ii) a credential-based login mechanism for access token retrieval; and (iii) the obtainment of details about managed customers.\\nThe example API is synchronous, HTTP-based, and comprises the following operations for the aforementioned use cases:\\nGET /customer_kinds\\n: This operation allows the retrieval of information about the kinds of customers the provider supports for customer categorization. In order to invoke the operation, the caller must provide a fixed, predefined API key in the form of a \\nJSON Web Token (JWT)\\n in the HTTP header field \\napi_key\\n. The following JSON snippet shows an example response of the operation to a valid request. Structurally, the response links the ID of a customer kind with its English description:\n\\n{\n \"1\": \"Private person\",\n \"2\": \"Commercial enterprise\",\n \"3\": \"Public institution\"\n}\\nGET /customer_kinds/{id}\\n: This operation delivers further information about a certain customer kind. For its valid invocation, the operation expects the same API key as \\nGET /customer_kinds\\n. Furthermore, the customer kind, which is identified by the path parameter id, must correspond to one of the customer kind IDs in the response to a valid request against \\nGET /customer_kinds\\n. For instance, a call of \\nGET /customer_kinds/3\\n could yield a response similar to this one:\n\\n{\n \"id\": \"3\",\n \"kind\": \"Public institution\",\n \"createdOn\": \"12.07.2024 12:32:59\",\n \"updatedOn\": \"\"\n}\\nPOST /login\\n: This operation enables customers to log into the provider, e.g., to review their name or address information (see below). \\nPOST /login\\n expects the same API key as \\nGET /customer_kinds\\n and \\nGET /customer_kinds/{id}\\n. Additionally, requests against the operation must comprise a JSON object that specifies values for the two fields \\nemail\\n (as an equivalent to the customer’s username in the provider) and \\npassword\\n (to complete the customer’s credentials). Note that the example API leverages this kind of basic authentication only for the purpose of demonstrating some Microcks features in a self-contained fashion. Due to its insecure nature, basic authentication should not be applied in real-world software projects as there exist better alternatives like \\ntoken-based authentication\\n. In case of valid requests that include the correct API key and matching credentials, the operation emits JSON responses similar to the following:\n\\n{\n \"customer_token\": \"eyJhbGciOiJIUzI1NiJ9....\"\n}\n\\nThe value of the field \\ncustomer_token\\n represents a JWT of a customer who successfully logged into the provider.\\nGET /customer\\n: With a valid \\ncustomer_token\\n issued by the previous operation, this operation enables users to retrieve certain information about their customer record in the provider. For this purpose, the \\ncustomer_token\\n must be transmitted via the HTTP header field \\ncustomer_token\\n. A valid request against \\nGET /customer\\n may then result in a response similar to the following:\n\\n{\n \"email\": \"some_customer@example.org\",\n \"first_name\": \"Casey\",\n \"last_name\": \"Rice\",\n \"company_name\": \"\",\n \"address\": \"6377 Fallon Pine, North Emoryburgh, Anguilla\"\n}\\nA typical interaction scenario with the above operations of the example API is as follows:\\nInvocation of \\nGET /customer_kinds\\n with the fixed \\napi_key\\n to retrieve all supported customer kinds.\\nFor each customer kind \\nid\\n returned by the previous call, invocation of \\nGET /customer_kinds/{id}\\n with the same \\napi_key\\n as before, e.g., to display the corresponding kind’s description on the UI of a consuming application.\\nAnother interaction scenario comprises the following steps:\\nInvocation of \\nPOST /login\\n with the fixed \\napi_key\\n and a customer’s credentials in order to obtain their \\ncustomer_token\\n.\\nInvocation of \\nGET /customer\\n with this token to obtain further customer information.\\nThe OpenAPI definition of the example API is contained in the file \\n“customers.yaml”\\n in the \\nGit repository\\n dedicated to the article series. The repository also gathers two Java applications. \\nThe first one\\n is a complete demo implementation of the example API and enables experimentation with Microcks’ capabilities in contract testing. \\nThe second one\\n shows how to use Microcks for integration testing leveraging its Testcontainers module. The following section shows how to register the example API in Microcks to derive and provision mocks. The followup articles then draw on the API and its accompanying Java applications to describe and illustrate the practical usage of further Microcks core features.\\nGetting APIs Into Microcks\\nMicrocks offers several opportunities for API registration to make subsequent mock provisioning feasible:\\nDirect APIs:\\n This functionality allows for the manual creation of definitions for synchronous or asynchronous APIs. To this end, Microcks' web UI integrates an interactive workflow to configure API properties. These properties comprise interaction style (synchronous or asynchronous), and API name, version, resource, and reference payload. After workflow completion, Microcks first converts configured API properties into definitions whose format and structure depend on the selected interaction style. For synchronous APIs, Microcks generates OpenAPI definitions with CRUD operations for resource manipulation. For asynchronous APIs, Microcks generates AsyncAPI definitions with resource subscription operations. The previously mentioned reference payload enables further differentiation of generated operations. From the generated definition, which can be downloaded from Microcks' web UI, Microcks serves mocks for the specified API operations.\\nImporters:\\n Importers enable the upload of existing API definitions from which Microcks derives and serves mocks. Definition imports can also be automated leveraging the Import Jobs feature. It supports continuous mock provisioning, e.g., from periodic scanning of source code repositories. \\nThe \\nexisting definition for the example API\\n introduced above can be uploaded to Microcks with the OpenAPI Importer. That is, \\nfrom a running Microcks instance\\n select the “Importers” category from the main navigation in Microcks' web UI, click on “Upload”, browse to the definition file, and hit the “Upload” button. After successful upload and navigating to the “APIs | Services” category in Microcks' main navigation, Microcks displays the imported API:\\n\\nThe “Details” button leads to an overview of the imported API operations, for which Microcks already serves mocks after their successful import:\\n\\n\\nCollapsing an operation displays details about served mocks, including mock URL and response:\\n\\n\\nConclusion and Outlook\\nThis article is the starter of a three-part series about definition-based API mocking, simulation, and testing with Microcks - a tool for API mocking that enables automated mock derivation and provisioning from API definitions, and also integrates features for subsequent mock refinement and mock-guided contract testing. While this article focused on Microcks’ architecture, and showed how to derive and serve mocks from API definitions, the next article of the series will cover the details of mock data specification as well as mock refinement with request validations and routing.","html":"Key TakeawaysAPI mocking used, e.g., for integration testing, is challenging as it assumes conformance to mocked API functionality, which can incur significant costs as mock complexity increases with API complexityDefinition-based API mocking can reduce..."},"likes":2,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:12:25.276378+00:00","tags":[{"id":"cl7ccu1p9qof20ct5mxp953e2","title":"API"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"authors":[{"id":"cloe4lfdsj3ns0auokx0t8cbb","firstName":"Dr. Florian","lastName":"Rademacher","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/U64hKnGTf6d3Q0kvbuLX","width":1200,"imageAltText":null}}],"readingTime":9},{"id":"cltzr6h9yzbjb07ukj2la41a5","locale":"en","metaTitle":"Playwright Tests and API Mocking","metaDescription":"This blog post describes how to mock requests with your own response in playwright tests.","slug":"playwright-tests-and-api-mocking","title":"Playwright tests and API Mocking","brand":null,"articleCreatedAt":"2024-05-10T11:01:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"Problem definition\nPlaywright tests can sometimes depend on external services such as APIs, which might happen to be unavailable at times. In this case there are several options for executing these tests adequately, as described below. Actually call the...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":3,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:13:58.404098+00:00","tags":[{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"}],"authors":[{"id":"clf9nuaw46j2v0aunr07djf8l","firstName":"Ege","lastName":"Inanc","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/TvcARJoRS5Geufzla5mE","width":1200,"imageAltText":null}}],"readingTime":4},{"id":"cltyny92fatc607utp9161lgp","locale":"en","metaTitle":"Charge your APIs Volume 25: Contract Testing","metaDescription":"Contract testing is a powerful API testing method in software development, ensuring seamless integration, reducing development cycles, and minimizing the risk of errors. ","slug":"charge-your-apis-volume-25-contract-testing","title":"Charge your APIs Volume 25: Contract Testing","brand":null,"articleCreatedAt":"2024-04-02T22:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":null,"contentRichText":{"text":"\nI feel the way we do integration testing is sort of like setting your house on fire to test your smoke alarm. It is excessive, tiresome and way too costly.\n\n\n\\nThis is not a quote from myself. I typically don't come up with such good ideas when I need them. I stumbled upon it during my research on this topic, and – for me – it perfectly illustrates the issue with API testing.\\nAPIs typically undergo testing more or less late in the overall development process and compared to unit tests, these integration and end-to-end tests, they are costly. You wonder why? Let's start with a bit of theory upfront to show you why. (If you feel confident with the theory, you can proceed directly to the chapter on contract testing.)\n\nFor the german-speaking audience, my colleague Sebastian Tiemann has also written a related article on the topic \\nWarum schlechte APIs teuer sind\\n.\\nTest Pyramid\\nAn important concept is the so-called Test Pyramid for software tests. It states that different types of tests in the development of applications should be weighted according to their position within the pyramid. Specifically, tests at the lowest level – the unit tests – should contribute the largest proportion of all tests. Accordingly, each subsequent level should represent a smaller proportion, as higher levels involve greater integration between systems, resulting in increased effort, decreased speed, and therefore higher costs.\n\nThere are various interpretations of the Test Pyramid tailored to individual project environments. However, for the understanding of this article, a simple version based on \\nMike Cohn's \\nconcept is sufficient.\\n\\n\nLet's define shortly the different levels.\\nUnit Tests\\nThe bottom level of the pyramid is formed by unit tests. They represent the functionality of the smallest testable units of an application. They are typically executed in isolation from other units. Unit tests are an essential part of modern software development. The advantages are clear. They are usually quickly created or adjusted, can be automated and executed within a short period, and reveal a large portion of errors early on.\\nIntegration Tests\\nWhile unit tests focus on testing isolated fragments, integration tests aim to verify the correct interaction between multiple, often independently developed, connected components.\\nEnd-to-End Tests\\nEnd-to-End tests are a comprehensive form of software testing aimed at verifying the entire functionality of an application by simulating the entire process from start to finish. Unlike integration tests, which focus on the interaction between modules, end-to-end tests evaluate the behavior of the application in a realistic environment. These tests simulate typical user interactions on the UI to ensure that all components and interfaces function correctly, and the application as a whole delivers the expected results.\\nWhat's the problem?\\nSo, in theory, we now know what an ideal testing world should look like. However, in reality, the pyramid is often, quite literally, turned upside down. Time and resources are limiting factors and tempt both developers and project managers to downgrade unit tests to something like \"nice to have\" and push them to an unspecified future date under the motto of \"technical debt\". And even if we have a broad base of unit tests, the human pursuit of security leads to a significantly higher number of integration and/or end-to-end tests being defined and created – because better safe than sorry, and there's also the good feeling of having tested everything with systems that are as close to production as possible.\\nAt this point, the pain typically begins, which may not be noticeable at first, especially in new projects where you're only dealing with a small number of interfaces. At this stage, it may still feel like we have a complete overview of everything. However, even these integration tests already assume that the systems to be tested are available in appropriate test environments and ideally kept up to date with the latest, mutually compatible versions. If teams start to drift apart due to delays or differences in their overall development speed, this can potentially lead to incompatibilities between the test environments. This may or probably will slow down the working speed of other teams and create a backlog.\\nBut not only the working speed of the teams can be a problem. Integration or end-to-end tests are comparatively slow because each request must pass through all the involved systems, and preparing the tests, such as provisioning the necessary data foundations, can also require a big amount of time.\\nAs we continue to create more and more test scenarios for integration and end-to-end tests, we end up with a considerable mountain of tests which we are naturally very proud of because all these tests give us even more confidence. However, unfortunately, our project leader comes up with some \"minor adjustments\" that require us to revise all tests. While this may not be a problem for a few tests, the effort increases not linearly but exponentially as the number of tests grows larger.\\n\\nSearching for errors in the integration and end-to-end testing environment can also be challenging, as it's not always immediately apparent whether a flaw is due to one's own shortcomings or an issue in another involved system. This can lead to numerous questions. Have we used the correct test data in the appropriate environment? Has the version of one of the involved services changed, or has an error been built into them? So you enter into a chat with the tester, potentially discussing what actions were taken to reproduce the error, and you begin looking into the log data. In the best-case scenario, if one can even calls it that, it's discovered that an error in our own code led to the undesired result, and the tester's time was well spent. In the worst-case scenario, one receives a cryptic error message from one of the invoked external systems and has no idea what actually went wrong. Thus, the investigation continues, and further individuals must be involved. The entire process has now consumed a significant amount of time and likely created frustration for all people involved, despite the initial intention just to ensure that the application integrates into the overall system as expected. Just as with the effort for tests, it's worth noting that the risk increases more significantly with rising complexity when it comes to errors.\\n\\nIn summary, it can be concluded that there are many factors contributing to the challenges associated with integration and end-to-end testing, which can have a negative impact on our development cycle. And it is precisely at this point that contract testing comes into play.\\nContract Testing\\nContract testing, like the previously mentioned unit, integration and end-to-end testing, is a method in software testing. Interestingly, the concept of contract testing is not new, but it has seen a noticeable surge in popularity lately. \\nIn this method, interfaces are tested based on contracts. A contract represents an agreement between a consumer and a provider (not always both as we will see soon). It typically includes input and output parameters, formats, errors and protocols that the interacting parties must adhere to for the test to be positively validated.\n\nOnce contract testing is setup you are able to test solely against the defined contracts and you do not depend on any implementations nor have to setup any environments for testing while having the security to always align to the definition. This leads to a \\nShift-Left\\n because tests which have been created and executed in late stages before may now executed early in the process.\\n\\nOut there in the contract testing universe exist multiple different strategies and methodologies. \\nStrategies\\nRegarding strategies, contract testing classically consists of the \\nconsumer-driven\\n and the \\nprovider-driven\\n approach. The main difference is: who is setting the expectations into the contract or in modern language: who is making the rules. \\nIn \\nconsumer-driven contract testing\\n the consumer of a service describes in the contract for every provider what the interface should look like, resulting in perfectly tailored solutions without overhead. \\nIn \\nprovider-driven contract testing\\n typically presents the whole repository of interfaces of the provider in a contract.\\nA third strategy, perhaps slightly divergent from the other two, is the \\nprovider contract test\\n mentioned in \\nMatt Fellows's article on schema-based contract testing\\n, which ensures that an API provider aligns with its own published schemas and does not rely on any dependencies to other teams.\\nMethodologies\\nIn terms of methodologies, \\ncode-based contract testing\\n involves validating contracts at a code level. This means that actual code needs to be executed on both the consumer and provider sides for this approach to work. Its brings multiple advantages into play:\\nCode-based contract tests ensure that the code and contracts remain aligned, minimizing the risk of divergence between them\\nTests generated within the code reflect real-world message exchanges, enhancing the authenticity and reliability of the testing process\\nOffers valuable insights into the inner workings of the implementation, aiding in understanding and troubleshooting\\nThe detailed nature of code-based contract tests increases the likelihood of detecting bugs related to interfaces\\nOnce established, code-based contract tests provide a robust foundation that teams can depend on during subsequent code modifications\\nIn contrast, \\nschema-based contract\\n \\ntesting\\n verifies that sent messages adhere to a given schema. It brings multiple advantages compared to code-based contract testing:\\nMany API developers are already used to schema validation, which reduces the learning curve and therefore allowing them to adapt quickly\\nOffers a short ramp-up time that enables teams to start testing quickly\\nThey typically require less maintenance over time, as they focus primarily on validating schema differences rather than code implementations. This also results in swift test runs\\nRemoves the complexity of creating test data\\nThe method of creating schemas doesn't matter as long as the schema remains valid. There's a wide array of tools available to support developers in creating and managing schemas, offering flexibility and convenience\\nSchema-based testing allows for both black-box and white-box testing approaches fostering a broader base of test authors\\nSounds good? I think so! But nevertheless there are some disadvantages when using schema-based contract testing compared to the code-based apporach.\\nSchemas may still require manual creation or at least manual review to ensure accuracy and completeness\\nIncomplete or inaccurate schema declarations may lead to uncertainties, for example regarding the expected codes and attributes in specific situations\\nJust because a definition exists in a schema doesn't guarantee that it's implemented in the same way within the system\\nThe effectiveness of schema-based validation hinges on the quality of the schema itself. Poorly written schemas may provide a false sense of security\\nAutomatically generating code from schemas may introduce overhead by including information that the actual process doesn't actually require\\nWhat's better now?\\nIt depends! If you prioritize comprehensive testing with a very high guarantee on perfectly working interfaces, \\nconsumer-driven contract testing\\n could be your choice. But keep it mind it may contain a lot of obstacles to overcome. You have to convince all parties to accept and work with this concept because it doesn't make sense to start without these agreements.\\nOn the other hand, the\\n schema-based contract testing \\napproach provides a swift start without a steep learning curve and you are not dependent on any other parties while still providing you great confidence on having stable APIs.\\nThe \"new\" Pyramid\\nThe introduction of contract testing has \"altered\" the testing pyramid adding contract tests as a new layer right above the unit tests.\\n\\nSince this new layer has the capability to fetch most interface related issues early on it reduces the effort we have to spent on the following layers. Those tests now can focus on important business cases instead of interface-related topics and this reduces the overall complexity. The graph which has been grown exponentially before now has a linear growth regarding effort for adjustments and risk. (Of course we are talking about a perfect world scenario with linear growth, but I hope the intention becomes clear)\\n\\nPossible Complications\\nAs already said, \\ncode-based contract testing\\n presents a significant hurdle: convincing all parties involved of its value as an extension to your usual testing stack. This is because it requires an upfront definition of contracts and the establishment of the technical base. It's crucial to persuade people of its long-term benefits. This can be challenging, particularly with project managers or executives who may only see short-term additional effort and tend to prioritise tasks which return an immediate success.\\nMeanwhile \\nschema-based contract\\n testing might be the approach most projects can way easier start working with.\\nTools\\nThere are multiple tools on the market regarding contract testing. A good starting point for \\ncode-based\\n solutions are \\nPact\\n or \\nSpring Cloud Contract\\n. \n\nFor the \\nschema-based\\n approach, \\nPortman \\nis a great choice.\n\nWhile you can run all tests locally with these tools, they unfold their full potential when integrated into a CI/CD pipeline.\\nConclusion\\nContract testing is a valuable addition to your usual testing repository. It reduces the risk of late findings of interface errors and supports a fast deployment lifecycle by pushing the confidence of the team. Ultimately it will save time and therefore money – or at least the time usually used for fixing these unnecessary errors that can be spent in a better way with tasks that create business value! \n\nIf you want to give it a try but don't want to spent a long time on learning and ramping up, \\nschema-based contract testing\\n is a great way to start optimizing your API testing capabilities.\n\\nReferences\\n\\nhttps://www.amazon.de/-/en/Mike-Cohn/dp/0321579364\\n (Book)\\n\\nhttps://www.mountaingoatsoftware.com/blog/the-forgotten-layer-of-the-test-automation-\\n\\npyramid\\n\\n\\nhttps://martinfowler.com/bliki/ContractTest.html\\n\\n\\nhttps://pactflow.io/blog/contract-testing-using-json-schemas-and-open-api-part-1/\\n\\n\\nhttps://pactflow.io/blog/contract-testing-vs-integration-testing/\\n\\n\\nhttps://pactflow.io/what-is-contract-testing-page/\\n\\n\\nhttps://martinfowler.com/articles/practical-test-pyramid.html#ContractTests\\n\\n","html":"I feel the way we do integration testing is sort of like setting your house on fire to test your smoke alarm. It is excessive, tiresome and way too costly. This is not a quote from myself. I typically don't come up with such good ideas when I need..."},"likes":20,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:13:58.404098+00:00","tags":[{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7cctq47qktw0buuu600cj3d","title":"Software development"},{"id":"cl7ccu1p9qof20ct5mxp953e2","title":"API"}],"authors":[{"id":"cl7cecglnr4do0ct58mulyfg9","firstName":"Pasquale","lastName":"Brunelli","hideLastname":null,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/cms7hzqahv2qc07uhv0jesk07","width":1200,"imageAltText":"Profilbild männlicher Avatar"}}],"readingTime":11},{"id":"clsyu19dwtupa07uq7ngqb8x9","locale":"en","metaTitle":"A/B Testing: Tool support and testing GrowthBook","metaDescription":"GrowthBook presents an appealing entry point into the world of A/B testing as an open-source solution, eliminating the need for an initial purchase.","slug":"ab-testing-tool-support-testing-growthbook","title":"A/B Testing: Tool support and testing GrowthBook","brand":null,"articleCreatedAt":"2024-03-18T15:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"In the previous blog post we introduced some general concepts of A/B testing: we explored the main aspects, defined test types and explained the most common statistical methods. \nNow we want to explore the areas in which A/B testing tools can provide...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":1,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:13:33.142369+00:00","tags":[{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7ccwwabqe0h0duov4hdm9rc","title":"Python"},{"id":"cl7ccvdxxqdr60duooxjm6wk9","title":"Data"},{"id":"cl7ccurlsql1k0buu39ky7xtr","title":"UX/UI"},{"id":"clseqm8wlrqcn0buk7f04moju","title":"Analysis"},{"id":"cl7ccu6vbqgzj0ateozp8ta4e","title":"JavaScript"}],"authors":[{"id":"cl7ceql24qx150duo5y2dq4rq","firstName":"Francesca","lastName":"Diana","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/aJX5gx3SMmWHNwO1Llnv","width":1200,"imageAltText":null}}],"readingTime":20},{"id":"clq6p1l9fz9gz0buo6tc53xvc","locale":"en","metaTitle":"A/B Tests: Introduction","metaDescription":"We are going through the main aspects and notions in A/B testing. We present a detailed overview of the most common statistical methods used to evaluate the results.","slug":"ab-testing-an-introduction","title":"A/B Testing: An introduction","brand":null,"articleCreatedAt":"2024-02-06T07:32:00+00:00","syntaxHighlightingTheme":"solarizedLight","contentMarkdown":"This blog series aims to aid teams who are contemplating adding A/B testing to their toolkit but are unsure of which tool to use. In addition to helping with tool selection, the series also provides the entire team with a consistent initial understanding...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":3,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:14:59.07413+00:00","tags":[{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7ccvdxxqdr60duooxjm6wk9","title":"Data"},{"id":"cl7ccurlsql1k0buu39ky7xtr","title":"UX/UI"},{"id":"clseqm8wlrqcn0buk7f04moju","title":"Analysis"}],"authors":[{"id":"cl7ceql24qx150duo5y2dq4rq","firstName":"Francesca","lastName":"Diana","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/aJX5gx3SMmWHNwO1Llnv","width":1200,"imageAltText":null}}],"readingTime":29},{"id":"clpic4p8a9zcy0buuz53yb23z","locale":"en","metaTitle":"Charge your APIs Volume 19: Understanding Problem Details for HTTP APIs - A Deep Dive into RFC 7807 and RFC 9457","metaDescription":"RFC 7807 and 9457 establish a standardised format for error responses in HTTP APIs, improving transparency, reliability, and user-friendliness.","slug":"charge-your-apis-volume-19-understanding-problem-details-for-http-apis-a-deep-dive-into-rfc-7807-and-rfc-9457","title":"Charge your APIs Volume 19: Understanding Problem Details for HTTP APIs - A Deep Dive into RFC 7807 and RFC 9457","brand":null,"articleCreatedAt":"2023-11-30T07:00:00+00:00","syntaxHighlightingTheme":"dark","contentMarkdown":"In today's ever-changing web development landscape, HTTP APIs have become indispensable, powering a myriad of applications and services across the internet. They act as the vital communication backbone, enabling smooth data exchanges between different...","contentRichText":null,"likes":5,"jobPage":null,"isEnglish":null,"publishedAt":"2026-02-24T11:14:08.191215+00:00","tags":[{"id":"cl7ccu1p9qof20ct5mxp953e2","title":"API"},{"id":"cl7ccwjmmqd3j0cuqte62rbft","title":"Resilience"}],"authors":[{"id":"cl7ceqdn8r2750butknear1pa","firstName":"Daniel","lastName":"Kocot","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/2BliEDPmQUKkgbGgoMjP","width":1200,"imageAltText":""}}],"readingTime":16},{"id":"clkwrpg1z7qsj0bw8znjq3b2t","locale":"en","metaTitle":"Repository integration tests with Hibernate Statistics","metaDescription":"How to use Hibernate Statistics to avoid pitfalls such as the N+1 problem by counting executed queries within automated tests.","slug":"count-your-queries-repository-integration-tests-hibernate-statistics","title":"Count your queries! Repository integration tests with Hibernate Statistics","brand":null,"articleCreatedAt":"2023-08-07T10:00:00+00:00","syntaxHighlightingTheme":null,"contentMarkdown":"If you are using Spring Data JPA as a data access framework, Hibernate is almost certainly hiding under the hood. And although this setup takes a lot of work off your hands by doing a lot of awesome things, the final outcome should better be checked....","contentRichText":null,"likes":3,"jobPage":null,"isEnglish":null,"publishedAt":"2025-09-12T09:16:23.016646+00:00","tags":[{"id":"cl7cctol4qoc20ct5z4hmj2de","title":"Java"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7cctrrrqk220but6gdqq96o","title":"Spring"},{"id":"cl7ccva6sqong0ct535qy74i9","title":"Database"}],"authors":[{"id":"cl7cermx2qyv10atetx6q44jg","firstName":"Kevin","lastName":"Peters","hideLastname":null,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/2dZ7KKy0T42Szax5VZGZ","width":1200,"imageAltText":null}}],"readingTime":6},{"id":"clisrkely0kou0bw6gg3e18ot","locale":"en","metaTitle":"Perfect Your APIOps: k6 for API Load Testing","metaDescription":"Integrate k6 for API load testing into your GitHub Actions APIOps pipeline. Ensure your APIs handle real-world stress and optimize performance today.","slug":"charge-your-apis-volume-6-perfecting-your-apiops-harnessing-the-power-of-k6-for-api-testing","title":"Charge your APIs Volume 6: Perfecting Your APIOps - Harnessing the Power of k6 for API Testing","brand":null,"articleCreatedAt":"2023-06-14T06:00:00+00:00","syntaxHighlightingTheme":"dark","contentMarkdown":"Our journey through the expansive landscape of API Operations (APIOps) has led us through various territories. We've delved into Continuous Integration and Deployment, ensuring seamless transitions from coding to production-ready APIs with minimal friction...","contentRichText":null,"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-02-24T11:14:08.191215+00:00","tags":[{"id":"cl7ccu1p9qof20ct5mxp953e2","title":"API"},{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7ccxwd1qlst0buu1wrik0yl","title":"GitHub"}],"authors":[{"id":"cl7ceqdn8r2750butknear1pa","firstName":"Daniel","lastName":"Kocot","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/2BliEDPmQUKkgbGgoMjP","width":1200,"imageAltText":""}}],"readingTime":2},{"id":"cli80qpfrmv7h0buudg8qofj5","locale":"en","metaTitle":"Charge your APIs Vol 4: CI for API Operations","metaDescription":"Streamline API operations with Continuous Integration. Implement automated CI pipelines using GitHub Actions for efficient, reliable development. Optimize now!","slug":"charge-your-apis-volume-4-streamlining-api-operations-with-continuous-integration","title":"Charge your APIs Volume 4: Streamlining API Operations with Continuous Integration","brand":null,"articleCreatedAt":"2023-05-31T06:00:00+00:00","syntaxHighlightingTheme":"dark","contentMarkdown":"API operations refer to the maintenance and management of APIs (Application Programming Interfaces) throughout their lifecycle. This includes everything from design and development to testing, deployment, and ongoing maintenance.\nContinuous Integration...","contentRichText":{"text":"","html":"\u003cp\u003e\u003c/p\u003e"},"likes":null,"jobPage":null,"isEnglish":null,"publishedAt":"2026-02-24T11:14:08.191215+00:00","tags":[{"id":"cl7cctp4hqcl00cuql7h9xflq","title":"Testing"},{"id":"cl7ccu1p9qof20ct5mxp953e2","title":"API"}],"authors":[{"id":"cl7ceqdn8r2750butknear1pa","firstName":"Daniel","lastName":"Kocot","hideLastname":false,"image":{"height":1200,"url":"https://eu-central-1.graphassets.com/AiE4QoWSSiIQO3k152ugkz/output=format:webp/2BliEDPmQUKkgbGgoMjP","width":1200,"imageAltText":""}}],"readingTime":6}],"locale":"en","isStaging":false},"__N_SSG":true},"page":"/knowledge-hub/blog/[...slug]","query":{"slug":["chaos-engineering"]},"buildId":"jBfnzTvNzHvvFOTTO2y2r","isFallback":false,"gsp":true,"locale":"en","locales":["de","en"],"defaultLocale":"de","scriptLoader":[]}</script></body></html> |