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
practicalThe 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
practicalThe W3C standard for browser automation — where it still wins, the waiting model that decides whether a suite is stable, and Grid for scale.
Cypress
practicalIn-browser test execution, automatic retry-ability and time-travel debugging — what Cypress's architecture buys, and the constraints that come with it.
Jest
practicalThe default JavaScript test runner — configuration, projects, snapshot testing, fake timers, and the choices that keep a large Jest suite fast.
Jest Mocking
practicalModule mocks, spies, manual mocks and timer control — how Jest's mocking works, and the patterns that keep it from taking over a suite.
Vitest
practicalA 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
practicalThe .NET runner with a fresh instance per test — Facts, Theories, fixtures, parallelism and the design opinions baked into it.
NUnit
practicalThe longest-serving .NET test framework — its constraint-based assertion model, attribute set, and the shared-instance behaviour you have to work with.
MSTest
practicalMicrosoft'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
practicalThe Java standard — Jupiter's extension model, parameterised tests, nested classes, assertions with AssertJ, and running it all in CI.
pytest
practicalPython's test framework — plain assert, the fixture model that makes it different, parameterisation, and the plugins worth having.
RSpec
practicalRuby's specification-style framework — describe and context blocks, let and subject, matchers, and the readability trade it makes.
Mocking Frameworks
practicalMoq, NSubstitute, Mockito, unittest.mock, Sinon and the rest — what each ecosystem's mocking library does well, and the failure modes they share.
Moq
practicalThe .NET mocking library in practical detail — setups, argument matchers, verification, loose versus strict behaviour, and what to use instead where it strains.
Testcontainers
practicalRunning real databases, brokers and services as disposable containers from inside your test suite — the pattern that made integration testing cheap.
WireMock
practicalA programmable HTTP server for tests — stubbing responses, injecting failures, verifying requests, and recording real traffic to replay.
Appium
practicalOne WebDriver-based API across iOS and Android — how the drivers map onto XCUITest and UIAutomator, locator strategies, and the cost of cross-platform tests.