Skip to content
End To End Tester

Tools & Frameworks

Playwright, Selenium, Cypress, Jest, xUnit, NUnit, JUnit, pytest, RSpec, Moq, Testcontainers and WireMock — what each is for, and when to pick it.

17 articles · updated 19 September 2026

Tools matter less than teams think and more than purists admit. Less, because a disciplined suite in an unfashionable framework beats a careless one in the newest; more, because the tool decides what is easy, and over a few years a team does what is easy.

These pages are not documentation. Every tool here has docs that are better than any summary, and where that is the answer the article says so and links out. What the docs do not tell you is the shape of the decision: what the tool assumes about your application, what it costs when the suite is big, and what it looks like when it goes wrong.

#Browser automation

Playwright is the default in 2026 and the articles assume it unless they say otherwise: auto-waiting, one API across Chromium, Firefox and WebKit, tracing that makes a CI failure diagnosable, and sharding that is built in rather than bolted on.

Selenium WebDriver remains the only one of the three that is a W3C standard, which is exactly why large organisations still run it — grid infrastructure, device clouds and language bindings nobody else has. Cypress has the best developer experience of the three and a fundamentally different execution model that is worth understanding even if you never adopt it.

#Test runners, by language

Jest and Vitest for JavaScript and TypeScript; xUnit, NUnit and MSTest for .NET; JUnit for Java; pytest for Python; RSpec for Ruby. They differ more in philosophy than capability — xUnit's fresh instance per test and pytest's fixtures are opinions about isolation, not features.

#Fakes, mocks and the real thing

Mocking frameworks surveys the field; Moq and jest mocking get their own pages because they are the two most used and the two most misused.

Testcontainers and WireMock are the counter-argument to mocking: rather than fake the database or the upstream API, run a real one in a container and a programmable HTTP server in front of the other. For a great many integration tests that is now the cheaper option, and it changes what "unit test" is worth arguing about.

#Mobile and desktop

Appium for native mobile, and the platform sections cover iOS, Android, Flutter and Avalonia in their own terms.

Everything in Tools & Frameworks

Playwright

practical

The default browser automation tool in 2026 — auto-waiting locators, tracing, sharding and fixtures — with the configuration that matters and the mistakes that still cause flakiness.

Selenium WebDriver

practical

The W3C standard for browser automation — where it still wins, the waiting model that decides whether a suite is stable, and Grid for scale.

Cypress

practical

In-browser test execution, automatic retry-ability and time-travel debugging — what Cypress's architecture buys, and the constraints that come with it.

Jest

practical

The default JavaScript test runner — configuration, projects, snapshot testing, fake timers, and the choices that keep a large Jest suite fast.

Jest Mocking

practical

Module mocks, spies, manual mocks and timer control — how Jest's mocking works, and the patterns that keep it from taking over a suite.

Vitest

practical

A Vite-native test runner with a Jest-compatible API — faster startup, native ESM and TypeScript, and the cases where it is the better default.

xUnit.net

practical

The .NET runner with a fresh instance per test — Facts, Theories, fixtures, parallelism and the design opinions baked into it.

NUnit

practical

The longest-serving .NET test framework — its constraint-based assertion model, attribute set, and the shared-instance behaviour you have to work with.

MSTest

practical

Microsoft's own .NET test framework — where it sits against xUnit and NUnit, what MSTest 3 improved, and when it is the right organisational choice.

JUnit 5

practical

The Java standard — Jupiter's extension model, parameterised tests, nested classes, assertions with AssertJ, and running it all in CI.

pytest

practical

Python's test framework — plain assert, the fixture model that makes it different, parameterisation, and the plugins worth having.

RSpec

practical

Ruby's specification-style framework — describe and context blocks, let and subject, matchers, and the readability trade it makes.

Mocking Frameworks

practical

Moq, NSubstitute, Mockito, unittest.mock, Sinon and the rest — what each ecosystem's mocking library does well, and the failure modes they share.

Moq

practical

The .NET mocking library in practical detail — setups, argument matchers, verification, loose versus strict behaviour, and what to use instead where it strains.

Testcontainers

practical

Running real databases, brokers and services as disposable containers from inside your test suite — the pattern that made integration testing cheap.

WireMock

practical

A programmable HTTP server for tests — stubbing responses, injecting failures, verifying requests, and recording real traffic to replay.

Appium

practical

One WebDriver-based API across iOS and Android — how the drivers map onto XCUITest and UIAutomator, locator strategies, and the cost of cross-platform tests.