<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Darya Belaya</title>
    <description>The latest articles on DEV Community by Darya Belaya (@ariless).</description>
    <link>https://dev.to/ariless</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3953778%2Fa13511a7-74dc-43cd-b9b9-765e9cdd4638.jpg</url>
      <title>DEV Community: Darya Belaya</title>
      <link>https://dev.to/ariless</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ariless"/>
    <language>en</language>
    <item>
      <title>Why green CI doesn't mean your system works</title>
      <dc:creator>Darya Belaya</dc:creator>
      <pubDate>Wed, 27 May 2026 11:25:00 +0000</pubDate>
      <link>https://dev.to/ariless/why-green-ci-doesnt-mean-your-system-works-42af</link>
      <guid>https://dev.to/ariless/why-green-ci-doesnt-mean-your-system-works-42af</guid>
      <description>&lt;p&gt;&lt;em&gt;A case study: how a TypeScript migration doubled my test runs — with zero failures&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;CI was green. Tests were passing. PRs were merging.&lt;/p&gt;

&lt;p&gt;The system was broken. And nothing in the logs showed it.&lt;/p&gt;

&lt;p&gt;After migrating my test project from JavaScript to TypeScript, I noticed something odd: CI started taking almost twice as long to run. No failures. No errors. Just... slower.&lt;/p&gt;

&lt;p&gt;I assumed it was normal. TypeScript compilation overhead, probably. I moved on.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I found it
&lt;/h2&gt;

&lt;p&gt;By accident.&lt;/p&gt;

&lt;p&gt;Near the end of the migration, when I started deleting the original &lt;code&gt;.js&lt;/code&gt; files, the test count dropped by almost half:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before: ~240 tests&lt;/li&gt;
&lt;li&gt;After: ~120 tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That number didn't make sense. Not slightly off — structurally wrong.&lt;/p&gt;

&lt;p&gt;I hadn't removed any tests. I only deleted old JavaScript files that were supposed to be gone already.&lt;/p&gt;

&lt;p&gt;That's when I stopped debugging performance. I was debugging duplicated reality.&lt;/p&gt;




&lt;h2&gt;
  
  
  What was actually happening
&lt;/h2&gt;

&lt;p&gt;Playwright was picking up both &lt;code&gt;.spec.js&lt;/code&gt; and &lt;code&gt;.spec.ts&lt;/code&gt; files at the same time.&lt;/p&gt;

&lt;p&gt;Every test in the suite was running twice. The same assertions, the same setup, the same teardown — duplicated silently, without a single warning.&lt;/p&gt;

&lt;p&gt;The worst part wasn't the wasted time. It was that CI made it look like things were improving. Runtime crept up gradually, which read as "normal post-migration slowdown." I had a plausible story for the symptom, so I stopped looking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Root cause: one missing line
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;playwright.config.ts&lt;/code&gt; had no explicit &lt;code&gt;testMatch&lt;/code&gt;. Playwright was just picking up both &lt;code&gt;.js&lt;/code&gt; and &lt;code&gt;.ts&lt;/code&gt; files — its default glob matches both. So it picked up everything.&lt;/p&gt;

&lt;p&gt;The fix was one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;testMatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/*.spec.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Getting to that line took a lot longer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this taught me
&lt;/h2&gt;

&lt;p&gt;CI does not validate correctness. It validates execution.&lt;/p&gt;

&lt;p&gt;Green CI only means: nothing crashed during execution.&lt;/p&gt;

&lt;p&gt;It doesn't mean: the right tests ran, in the right quantity, with the right assumptions about the environment.&lt;/p&gt;

&lt;p&gt;In my case, the problem could have been caught with a simple discovered tests counter in CI — if the count deviates from the expected value, fail the build explicitly instead of staying silent.&lt;/p&gt;

&lt;p&gt;That counter is now part of the pipeline. The buggy branch (intentionally broken config) is part of the portfolio — so anyone working through it can reproduce, diagnose, and fix it themselves.&lt;/p&gt;




&lt;h2&gt;
  
  
  The broader pattern
&lt;/h2&gt;

&lt;p&gt;Most problems in test systems don't show up as failures. They show up as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;duplicated execution&lt;/li&gt;
&lt;li&gt;silent performance degradation&lt;/li&gt;
&lt;li&gt;runner behaviour changes with no test changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And none of them have alerts — because we don't design for them.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Failure signature&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI green&lt;/li&gt;
&lt;li&gt;runtime doubled&lt;/li&gt;
&lt;li&gt;test count doubled&lt;/li&gt;
&lt;li&gt;zero warnings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The hidden assumption&lt;/strong&gt; "I assumed a slower CI run meant normal post-migration overhead. The runner had been doing twice the work for weeks — silently, without a single warning."&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part of the **Silent Failures in Test Automation&lt;/em&gt;* series.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Full project (API + UI + E2E + CI + AI endpoint): &lt;a href="https://github.com/Ariless/clinic-booking-api-tests" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




</description>
      <category>testing</category>
      <category>playwright</category>
      <category>typescript</category>
      <category>ci</category>
    </item>
  </channel>
</rss>
