{"id":184,"date":"2026-10-21T15:00:00","date_gmt":"2026-10-21T15:00:00","guid":{"rendered":"https:\/\/devopsschool.cn\/blog\/?p=184"},"modified":"2026-10-21T15:00:00","modified_gmt":"2026-10-21T15:00:00","slug":"testops-flaky-team-story","status":"publish","type":"post","link":"https:\/\/devopsschool.cn\/blog\/testops-flaky-team-story\/","title":{"rendered":"A Quarter of TestOps: One Team&#8217;s Flaky-Test Story"},"content":{"rendered":"<p>The team lead printed a screenshot of the CI dashboard and pinned it to the wall of the standup room. Ninety days of build history, and the red-green pattern looked like static on a broken television. &#8220;This,&#8221; she said, &#8220;is our quality signal.&#8221; Nobody argued, which was itself the problem. This is the story of what that twelve-person platform team did over the following quarter, told here because their situation is ordinary and their recovery is repeatable. The discipline they stumbled into has a name &mdash; TestOps, the practice of running your automated checks like a production service rather than a pile of scripts &mdash; and every step they took can be copied without asking anyone&#8217;s permission.<\/p>\n<h2>Week One: Counting the Damage<\/h2>\n<p>The first move was not a tool. It was a tally. For two weeks, whenever a build failed, someone recorded the cause: real defect, environment trouble, or a check that failed and later passed with no change to the code. The results shocked nobody and convinced everybody. Roughly four failures in five fell into the last bucket, which meant the team was spending its evenings arbitrating arguments between machines. Their verdict stream, they finally admitted, was not a signal at all. It was weather.<\/p>\n<h2>What TestOps Would Call This Moment<\/h2>\n<p>Every operations discipline begins with the admission that a service is failing its users. Here the users were the developers, the promised product was a trustworthy pass-or-fail verdict per change, and the service was defaulting on the promise daily. The <a href=\"https:\/\/www.xopsschool.com\/testops\/\">Ops Atlas write-up of TestOps<\/a> frames the whole discipline around that promise, which is what makes it a useful label for the quarter that followed: the team stopped asking &#8220;how do we fix this build?&#8221; and started asking &#8220;how do we run a verdict service people can believe?&#8221;<\/p>\n<h2>Week Three: Naming the Flakes Out Loud<\/h2>\n<p>Morale improved the moment the problem got vocabulary. Google&#8217;s engineers, publishing their own fleet-wide numbers in 2016, reported that about 1.5 percent of test runs were affected by flakiness, that roughly 16 percent of their tests showed some flaky behaviour, and that when a run flipped from green to red, 84 percent of the time the culprit was a flake, not a true defect. The team&#8217;s wall chart matched the shape of those numbers almost exactly. That was the turning point in the argument with management: the pattern was not a local failure of discipline, it was the documented default state of large suites everywhere, and it had standard remedies.<\/p>\n<h2>Week Six: Quarantine With Dates Attached<\/h2>\n<p>The first remedy was containment. Each check confirmed as unreliable was moved out of the blocking path &mdash; but every quarantine entry now carried three things it had never had before: the name of the person responsible, a ticket tracking the fix, and a date after which the check would be deleted rather than forgiven. The rule was simple and posted on the wall next to the dashboard: a check sits in quarantine to be repaired, not to retire. Within a fortnight the green builds started meaning something again, because a green now said &#8220;no defects and no known liars,&#8221; instead of &#8220;nobody re-ran it enough times yet.&#8221;<\/p>\n<h2>Week Ten: Burn-In for Newcomers<\/h2>\n<p>Then the team attacked the supply side. Research on flaky tests &mdash; Luo&#8217;s analysis is the usual citation &mdash; has found that about 78 percent of flaky checks are flaky from the moment they are first written, which reframes the whole hiring pipeline for new tests: a check that has just been merged is a suspect, not a colleague. So new checks entered a probation period, running daily without the power to block anyone, and earned gating rights only after a clean stretch. The false-red rate on fresh code, which had quietly been the worst in the suite, fell to near zero. Training teams take note: this single habit &mdash; prove a check before you trust it &mdash; is worth more than any tool purchase the team considered all quarter.<\/p>\n<h2>Week Twelve: Running the Numbers Like a TestOps Team<\/h2>\n<p>The last habit arrived late and stayed longest. Every Monday, fifteen minutes: the false-red share for the week, the typical time a change waited for its verdict, and the slowest tenth of those waits. The team kept the review short and the chart small, and resisted the temptation to add metrics nobody acted on. What the ritual bought them was early warning. When the false-red share ticked up two weeks in a row, the cause &mdash; a batch of new checks someone had rushed past probation &mdash; was found while it was still one conversation long. In the TestOps way of working, this weekly look at a handful of honest numbers is the entire management overhead; everything else is just engineering responding to what the numbers say.<\/p>\n<h2>What the Team Would Tell You Now<\/h2>\n<p>Asked what mattered, the lead gave four answers, in order:<\/p>\n<ul>\n<li>Count failures by cause for two weeks before changing anything; the numbers win the arguments you are tired of having.<\/li>\n<li>Give every unreliable check a responsible name, a tracking ticket and a deletion date &mdash; quarantine exists so a check can be repaired, not so it can be forgotten.<\/li>\n<li>Put new checks on probation; most flaky tests are born flaky, and probation catches them cheaply.<\/li>\n<li>Keep reporting the two numbers leadership cares about: how often the verdict is false, and how long a verdict takes.<\/li>\n<\/ul>\n<p>Their suite still ran long. Their dashboards still occasionally glowed red. But the red now pointed at code, and the team could look at it without a sigh. For readers plotting a similar career route, the skills exercised that quarter sit close to the material in <a href=\"https:\/\/devopsschool.cn\/blog\/friendly-steps-to-master-site-reliability-engineering-training\/\">site reliability engineering training, explained step by step<\/a> &mdash; service levels, error budgets and calm incident handling, pointed at a test suite instead of a website. If you are heading toward certification while working a job like theirs, it pays to <a href=\"https:\/\/devopsschool.cn\/blog\/helpful-tips-to-avoid-mistakes-during-devops-certification-preparation\/\">avoid the usual mistakes during DevOps certification preparation<\/a>, and to know the <a href=\"https:\/\/devopsschool.cn\/blog\/great-job-paths-after-devops-certification-training\/\">job paths that open up after DevOps certification training<\/a> &mdash; because teams that fixed what this team fixed tend to hire from within first.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A fictional platform team spends ninety days turning a red-green static screen into a verdict engineers trust. Here is the whole TestOps story.<\/p>\n","protected":false},"author":3,"featured_media":185,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[197],"tags":[],"class_list":["post-184","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops-training"],"_links":{"self":[{"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/posts\/184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/comments?post=184"}],"version-history":[{"count":1,"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/posts\/184\/revisions"}],"predecessor-version":[{"id":195,"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/posts\/184\/revisions\/195"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/media\/185"}],"wp:attachment":[{"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/media?parent=184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/categories?post=184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devopsschool.cn\/blog\/wp-json\/wp\/v2\/tags?post=184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}