Teardown

Two weeks, 200 tests, and the part everyone skips

Lingvano migrated 200+ Cypress tests to Playwright in a fortnight and published the numbers; the instructive parts are the AI tool that failed first, the 27-point gap between their two headline figures, and the dependencies that broke after the tests went green.

Who published it
Lingvano, Lisa Weilguni
When
October 2023
Scale
200+ Cypress tests
Outcome
Local run from 1 min 27 s to 25 s (71%); CI from 6 min 38 s to 3 min 43 s (44%). Post title rounds to “70%”.

What made them move

Lingvano is an Austrian app for learning sign language. By October 2023 their end-to-end suite had grown to more than 200 Cypress tests. The team’s complaint was not that Cypress had failed catastrophically; it was four specific limitations wearing them down together.

Local runs were slow enough that engineers were isolating tests with .only markers during active development: a workflow that solves the immediate problem and quietly accumulates debt. Each marker that stays in the codebase is a test that is no longer running by default, and a suite with enough of them can drift significantly from covering the real application. Sharding, the obvious remedy for a slow suite, sat behind Cypress’s paid plan. WebKit support was listed as experimental. Lisa Weilguni, who published the team’s account on the Lingvano engineering blog in October 2023, concluded that the combination made moving worthwhile.

The AI tool that came first

Before settling on a working method, the team tried GPT-4 for the conversion. The result was described plainly in the post:

It “suggested non-existing assertions and outdated syntax.”

They abandoned that approach. This is the most useful line in the article, and it is easy to pass over.

GPT-4 did not produce garbled output. It produced plausible-looking Playwright code: code that referenced API methods formatted in the correct style, failing only because those methods do not exist. That is the failure mode that matters. A tool that generates obvious nonsense gets caught in the first review. A tool that generates confident-looking wrong code gets caught in the test run, or after merge, or not at all if the original coverage was thin.

The reason GitHub Copilot, used inline alongside Playwright’s own migration tool and third-party converters, did better is not a question of model quality. It is a question of context. Copilot, working against real files, sees the surrounding imports, the actual Playwright version in use, and the assertion patterns already present in the project. A standalone prompt to GPT-4 sees only what you put into it. The model that produces better output is frequently the one that has been given more verified context to constrain its suggestions against.

What they actually did, and why the timeline held

The final workflow combined three things: GitHub Copilot for inline suggestions as the team worked through the test files, Playwright’s own migration tool for straightforward structural transformations, and third-party converters for additional mechanical work. The team moved all 200+ tests over roughly two weeks.

Two weeks was achievable here for reasons worth naming explicitly. The suite was a known, bounded size. The team understood the application. And Cypress and Playwright are syntactically close enough that many tests translated with minimal manual work. Other published migration timelines vary enormously depending on suite age, source language, and how tightly the tests are coupled to framework internals. A migration from Selenium in Java, or from a suite built up over many years with substantial custom infrastructure, will not share these properties. Two weeks is a real result from a specific context, not a general benchmark.

The two numbers, and why you need both

The post’s title says 70%. That number comes from the local run.

Local execution fell from 1 minute 27 seconds to 25 seconds. measured

The same suite, run locally Cypress 1 min 27 s; Playwright 25 s. A 71% reduction. This is the number their post’s title rounds to 70%. The same suite, run locally Where the difference is felt every day, not once per push. Cypress 1 min 27 s Playwright 25 s A 71% reduction. This is the number their post’s title rounds to 70%.

CI duration fell from 6 minutes 38 seconds to 3 minutes 43 seconds. measured

Suite runtime in GitHub CI Cypress 6 min 38 s; Playwright 3 min 43 s. Measured and published by Lingvano. A 44% reduction. Suite runtime in GitHub CI Lingvano, Austria. 200+ tests, Cypress to Playwright. Cypress 6 min 38 s Playwright 3 min 43 s Measured and published by Lingvano. A 44% reduction.

The local improvement is 71%, which the post’s title rounds to 70%. That is a defensible editorial choice for a headline. The CI improvement is 44%. The gap between those two figures is not a rounding error. It is structural.

A local run measures what the framework controls directly: process startup, browser initialisation, test execution. When Playwright handles those more efficiently than Cypress, the saving shows up in full. A CI pipeline contains all of that, plus checkout, dependency installation, build steps, artefact upload, and reporting. Playwright touches none of those. Whatever proportion of your pipeline time sits outside the test runner, that portion does not move at all. The more overhead your pipeline carries, the smaller the visible net improvement.

A manager who reads “70% faster” and builds a cost-reduction case around that figure will find a 44% outcome instead. This is a predictable consequence of measuring a framework change against a full pipeline, and it is exactly the kind of expectation gap that damages confidence in a project retrospectively. The two numbers should always be quoted together.

What the green tests did not mean

Once the suite was passing, two new problems appeared.

WebKit support (one of Playwright’s headline selling points over Cypress) turned out to be “quite slow and flaky in our GitHub CI pipeline,” in Weilguni’s words, despite working correctly on a Mac locally. This is a known pattern: Playwright’s WebKit runs on a compiled port rather than a system browser, and its behaviour on Linux CI can differ from a native macOS environment. The team gained cross-browser coverage, but they inherited maintenance overhead they had not anticipated.

The more significant constraint was Mock Service Worker. The team had been using MSW to intercept network requests in their Cypress tests. Playwright, as Weilguni notes, lacks support for MSW in its window context, which forced the team to abandon their existing MSW setup in favour of Playwright’s built-in network interception.

MSW is a good example of a wider pattern: tooling dependencies that seem peripheral until you migrate, at which point they are either unsupported or require a full replacement strategy. The useful pre-migration audit is not only the test files themselves. It is every library those tests depend on, with a clear answer for each one’s path forward in the new environment.

What we take from this

The fortnight is real. Lingvano’s timeline is a first-person account from the team that did the work, with specific figures that hold up to scrutiny. But it represents a set of conditions that do not generalise automatically: a suite of known, bounded size, an application the team understood thoroughly, syntactic similarity between the source and target frameworks, and no significant custom infrastructure to unpick. Published timelines for comparable or larger migrations vary enormously depending on the language, the coupling, and how much of the original test code was written to describe behaviour rather than to navigate a specific version of Cypress. Two weeks is one end of a real range.

The more transferable lesson is about how to evaluate a conversion tool before you trust it. The question is not whether it produces code that looks right. GPT-4 produced code that looked right. The question is whether it produces code that is wrong in ways your review process will catch. Assertions that do not exist will fail at runtime. Outdated syntax may fail only under certain conditions. Incorrect wait behaviour may not fail at all until a test passes that should not have. Context is the constraint that separates useful AI assistance from plausible-sounding mistakes: a tool that sees your real files, your real dependencies, and the patterns already in use is not necessarily a better model, but it is working with better evidence.

And the two numbers bear repeating: 71% local, 44% in CI. Whoever is making the case for a migration deserves both figures, not the rounding. If you would like a frank read on where your suite sits before committing to either number, write to hello@qualitylabs.eu.

Sources

  1. How We Reduced Testing Time By 70% by Moving From Cypress to Playwright. Lingvano engineering blog (Medium), Lisa Weilguni, 2 October 2023. First-person account of the migration; all timing figures, tool choices, and post-migration findings cited in this teardown come from this post.