An agent opened a pull request on my repo last week. Eleven files changed, three new tests, all green.
So what do you actually check?
You can read the diff. You can read the test file and see what it asserts. Both of those tell you what the agent b...
A Vue component's job is to produce DOM in a browser. Most component tests ask it to do that somewhere else: in Node, against a DOM that jsdom simulates. That has been the default since npm create vue@latest started offering Vitest with jsdom, and fo...
Every Testing Library test you have written runs against a simulated DOM. You know this. You accepted it years ago, along with the small pile of things that come with it: no real layout, nothing ever drawn on a screen, jsdom throwing on APIs it does ...
You open a frontend pull request. The diff is 400 lines, an AI agent wrote most of it, and the description says "adds the checkout flow". CI is green.
You read the diff. It looks reasonable. You still have no idea what the UI actually does.
So you ...
Microfrontends split a frontend into apps that build, deploy and version on their own. One team ships React 19, another is still on React 17 and migrating away from it, a third runs Vue. That independence is the point, and it is usually why the archi...
Open Cellshttps://www.opencells.dev is an open-source framework from BBVA for building web apps out of Web Components. It leans on Lithttps://lit.dev, real Shadow DOM, a hash-based router, and channels for state. If you build with Cells, you are work...
HTMX apps are refreshingly simple: the server returns HTML fragments, and HTMX swaps them into the page in response to hx-get, hx-post, and friends. There is usually no bundler and no client framework. That simplicity is the point, and it is also why...
Not every app has a bundler. Plenty of real software is still a folder of HTML and JavaScript served as static files: internal tools, landing pages, small products, and anything deliberately kept simple. These apps ship and they matter, but their tes...
Create React App was officially deprecatedhttps://react.dev/blog/2025/02/14/sunsetting-create-react-app in February 2025. The apps built with it didn't disappear. If you maintain one, you know the drill: the app works, it ships, and the Vite migratio...
Automated accessibility testing usually means one thing: point a scanner at the page, let it check the initial HTML against a set of WCAG rules, and turn green. Missing alt text, an unlabeled input, low-contrast text at load. Caught. Done.
Then a us...
Testing components in a simulated DOM jsdom, happy-dom has always felt like a compromise. What we actually want is tests that run in a real browser. So when Vitest Browser Mode shipped, I was genuinely excited to try it.
I co-maintain TWD Testing Wh...
You just built a Nuxt todo page. It loads from a Nitro route, adds a todo, deletes one, and it works when you click around. Now you want a test that proves it keeps working.
The usual answer is to leave the app, stand up a separate test stack, and r...
I had both Playwrighthttps://playwright.dev/docs/intro and TWDtwd.dev pointed at the same small app for a working day. Same backend, same UI, the same bugs to chase. The point wasn't to declare a winner. It was to notice what each one feels like to l...
You wrote a React Router v7 route. It has a loader, an action, a form, some interactivity. Now you want to test it. The official docshttps://reactrouter.com/start/framework/testing hand you two paths and neither one covers the case you actually have....
The first time you try to test a TanStack app the way the React Testing Library docs suggest, the test file gets bigger than the component. You spin up a memory router, instantiate a new QueryClient per test, wrap everything in QueryClientProvider an...
Setting up TWDhttps://www.npmjs.com/package/twd-js used to mean adding a block of dev-only code to your app's entry file — a dynamic import for the runner, a test glob, a service-worker config, and a twd-relayhttps://www.npmjs.com/package/twd-relay b...
You have unit tests in Vitest or Jest. You have E2E tests in Playwright. CI runs both. Coverage works for each, until you try to look at a single number.
Then it gets weird.
Two runtimes, two coverage outputs
Unit tests run in Node, instrumented b...
Payment integrations are one of the hardest things to test in a web app. The SDK renders its own UI, controls its own form fields, and fires callbacks when the user completes a payment. You can't programmatically fill in a credit card number. You can...
Every mock you write is a claim about what your backend returns. The moment the backend changes — a renamed field, a tightened enum, a new required property — that claim becomes a lie. Your tests still pass. Production breaks.
This is mock drift, an...