# What changed in qunit

> 21 changes in qunit 2 to 3 from its official release notes, upgrade guides and advisories: 10 breaking, 3 new APIs and options. Each one cited. Sources checked 2026-10-29. HTML: https://unstale.sh/npm/qunit/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## qunit 3

### Breaking changes

- QUnit no longer provides a built-in AMD export for the qunit.js file; applications and tests can still be loaded with AMD/RequireJS. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- New releases are no longer published to the Bower registry. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- The undocumented details.modules[].tests field is removed from the QUnit.begin() event. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- Legacy HTML Reporter markup is no longer supported; use <div id="qunit"> instead. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- The no-tests condition is now reported as a native error instead of a fake test. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- Support for Node.js 10–16 is removed; Node.js 18 or later is required. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- Support for PhantomJS is removed. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- The undocumented QUnit.dump.HTML property is removed. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- The undocumented QUnit.dump.multiline property is removed. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- Using an async QUnit.module() callback is now an error instead of a warning. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)

### New APIs and options

- QUnit adds a native ESM distribution, which Node.js uses automatically when importing with the import keyword. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)

### Behavior and default changes

- The QUnit global is now exported unconditionally. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)

### Fixes and other changes

- The after hook receives module context, enabling inheritance between parent and child modules and fixing leaks between the last test and after hooks. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- The before hook receives module context, enabling inheritance between parent and child modules and fixing leaks between the last test and after hooks. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- The confusing "No tests" message after an early uncaught error is fixed. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- Fixes a crash when a global module hook returns a bad thenable. (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)
- Fixes a crash when test.only() is used together with module.only(). (3.0.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/3.0.0)

## qunit 2

### New APIs and options

- Introduces QUnit.config.ignoreUnhandledRejections. (2.26.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/2.26.0)
- The CLI supports using a local script with --reporter. (2.26.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/2.26.0)

### Behavior and default changes

- assert.rejects() now returns the error value. (2.26.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/2.26.0)
- assert.throws() now returns the error value. (2.26.0) — [release notes](https://github.com/qunitjs/qunit/releases/tag/2.26.0)
