Page MenuHomePhabricator

Clean up QUnit test runner for MW (2020)
Open, MediumPublic

Description

It's high time to clean up a bit of technical debt. The below is a sequence of minor and incremental changes that together will hopefully result in the underlying model and intent being clearer to users, and also making QUnit tests easier to run and debug.

The below is about the built-in QUnit runner for MediaWiki, which includes support for integration tests and API tests. We currently use it to run "pure" unit tests as well. An RFC about the latter exists at T212521.

1. Offer a debug mode that uses packageFiles-style debug mode for all modules

The old debug mode tries to maintain 100% file references, and as such it has to load files raw which means the execution context changes from module scope to global scope. It also means that because there is no longer the ability to control execution time, each file has to be loaded in order one by one.

We can keep the 100% file reference parity option for those that want to keep this, but making the packageFiles-style debug mode available for everything is probably on the whole an improvement.

2. Enable debug mode by default in test context
  • Running in debug mode has the benefit of being easy to debug, and yet without requiring developers to switch contexts.
  • The bandwidth-saving measures of minification aren't needed in test context.
  • Disabling this will make the tests load even quicker in CI (currently loading and running all core QUnit tests takes about 4 seconds).
  • Disabling this will make the tests load faster in MediaWiki-Vagrant, which is (or was) known to have problems running the minifier in a timely fashion, sometimes timing out. I don't know if that's still the case today with PHP 7.2 and opcache, but one less thing to worry about either way.

This depends on step 1 first completing, as otherwise debug mode will cause behaviour differences compared to production (legacy global scope, and inefficient sequential file loading).

3. Cut the last remaining LocalSettings influence

See also T89434: SpecialJavaScriptTest should not export page-specific mw.config
See also T212521#6028568.

Settings exposed in the test runner must never be influenced by LocalSettings.php. Any case of that happening is either a bug in the test case or a bug in core's test runner.

In the 2013 and 2015 refactors, the entire skin layer was gradaually phased out of the QUnit runner. But, one part remained for compatibility with a handful of tests that still needed it (against best practice).

The test runner is standalone and doesn't implement things like uselang or useskin (per the above). But because some extension tests relied (unintentionally) on indirectly asserting the output of an interface message, we kept the default of lang=en as ContentLanguage, and per T212521#6028568 that indeed means it can be influenced by LocalSettings.php

  1. ContentLanguage
    • Set ContentLanguage explicitly to en instead of inheriting developer's local settings.
    • At this point, we wil have removed the last remaining LocalSettings.php influence that was accidentally left exposed in 2015 (namely wgContentLanguage) and thus makes local development consistent with WMF CI in terms of test behaviour.
    • Disable localisation in test context entirely by switching from en to qqx and fix any would-be CI failures.
    • We already do this for many PHPUnit integration tests, and ResourceLoader internally has qqx as its default as wel..
  2. mw.config:
    • Draft a commit that removes the last remaining mw.config exports (effectively fixing T89434).
    • Fix whatever fails in CI by ensuring its values are mocked via the standard QUnit.newMwEnvironment (simple change), or where existing injection options exist, inject it instead.
    • Enjoy strict requirement that any mw.config values relied upon are declared by the test.
4. Add component dropdown

The "filter" and "module" parameters that QUnit offers by default (in the UI and via the query parameters) allow running of a specific test suite only instead of all tests, and to run all tests from a specific feature or extension (for example "mw.rcfilters" for all RCFilters test).

But, the string matching isn't very intuitive and becomes more difficult when the test suites don't have unique prefix. To make test selection easier, we can utilize the 'QUnitTestModule' attribute introduced in 2018 in extension.json. This removes the need for dealing with the QUnit.module() name and such, and instead allows you to select by the high-level components. For example "MediaWik core", "My Extension" or "My Skin".

5. Landing page

The current test page immediately starts loading and running the tests. This is fine if you decide what to run based on which exensions are enabled in LocalSettings.php (switch by commenting out etc.), or if you have used it before and already have the url with relevant filters applied.

But, when you run it for the first time and have numerous extenions enabled, this means you have to wait several seconds for most of these tests to run before the test runner becomes visible and interactive.

  • Make the test runner URL default to showinng the UI without running any tests.
  • When refreshing it should not require any kind of confirmation and still work as before. Same for CLI.

This means the default landing page will be where you select what to run and then run it.


After these smaller incremental changes, a possible next step (or done sooner / in parallel) could be to enable the Karma/Instanbul test coverage preset, but I'll leave that to be discussed at T212521 first.

Details

Related Changes in Gerrit:
SubjectRepoBranchLines +/-
mediawiki/extensions/VisualEditormaster+5 -2
mediawiki/coremaster+38 -12
mediawiki/coremaster+51 -51
mediawiki/coremaster+0 -8
mediawiki/coremaster+3 -1
mediawiki/coremaster+3 -0
mediawiki/coremaster+13 -14
mediawiki/coremaster+34 -14
mediawiki/coremaster+41 -19
mediawiki/coremaster+58 -58
mediawiki/coremaster+65 -71
mediawiki/coremaster+0 -7
mediawiki/extensions/VisualEditormaster+10 -0
mediawiki/coremaster+338 -39
mediawiki/extensions/WikimediaEventsmaster+8 -12
mediawiki/coremaster+94 -142
mediawiki/coremaster+31 -2
mediawiki/coremaster+84 -105
mediawiki/coremaster+201 -233
mediawiki/coremaster+90 -111
mediawiki/coremaster+129 -169
mediawiki/coremaster+54 -60
mediawiki/coremaster+2 -0
mediawiki/coremaster+3 -2
mediawiki/coremaster+8 -11
mediawiki/coremaster+1 -5
mediawiki/coremaster+0 -30
mediawiki/coremaster+4 -84
mediawiki/coremaster+4 -13
mediawiki/coremaster+9 -12
mediawiki/coremaster+52 -5
mediawiki/coremaster+8 -8
mediawiki/coremaster+29 -29
mediawiki/coremaster+88 -82
mediawiki/coremaster+15 -66
mediawiki/coremaster+5 -48
mediawiki/extensions/GrowthExperimentsmaster+3 -3
mediawiki/extensions/CentralNoticewmf_deploy+6 -6
mediawiki/coremaster+26 -26
mediawiki/extensions/WikibaseLexememaster+2 -2
mediawiki/skins/MinervaNeuemaster+4 -4
mediawiki/extensions/UploadWizardmaster+2 -2
mediawiki/extensions/Wikibasemaster+40 -40
mediawiki/extensions/ContentTranslationmaster+2 -2
mediawiki/extensions/MultimediaViewermaster+10 -10
mediawiki/extensions/MultimediaViewermaster+9 -3
mediawiki/extensions/CentralNoticemaster+6 -6
mediawiki/extensions/CentralAuthmaster+2 -2
mediawiki/extensions/Echomaster+2 -2
mediawiki/extensions/Translatemaster+27 -35
mediawiki/extensions/Wikispeechmaster+8 -13
mediawiki/extensions/GuidedTourmaster+2 -2
mediawiki/extensions/WikiEditormaster+10 -12
mediawiki/extensions/Thanksmaster+25 -26
mediawiki/coremaster+108 -140
mediawiki/coremaster+18 -44
mediawiki/coremaster+7 -6
mediawiki/coremaster+106 -62
mediawiki/coremaster+16 -34
mediawiki/coremaster+1 -0
mediawiki/coremaster+31 -5
mediawiki/coremaster+18 -16
mediawiki/coremaster+2 -2
mediawiki/coremaster+6 -9
mediawiki/coremaster+5 -3
mediawiki/coremaster+10 -9
mediawiki/coremaster+1 K -679
mediawiki/coremaster+2 -5
mediawiki/coremaster+32 -66
mediawiki/coremaster+6 -22
mediawiki/coremaster+13 -24
mediawiki/extensions/WikibaseLexememaster+0 -1
mediawiki/extensions/Wikibasemaster+148 -216
Show related patches Customize query in gerrit

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes

Change 813352 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] tests: Remove intermediary `suites` concept from /tests/qunit

https://gerrit.wikimedia.org/r/813352

Change 813355 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] tests: Fix outdated /tests/qunit structure and flatten a bit

https://gerrit.wikimedia.org/r/813355

Change 813352 merged by jenkins-bot:

[mediawiki/core@master] tests: Remove intermediary `suites` concept from /tests/qunit

https://gerrit.wikimedia.org/r/813352

Change 813355 merged by jenkins-bot:

[mediawiki/core@master] tests: Fix outdated /tests/qunit structure and flatten a bit

https://gerrit.wikimedia.org/r/813355

Change 815614 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] tests: Flatten /tests/qunit for jquery.* module tests as well

https://gerrit.wikimedia.org/r/815614

Change 815614 merged by jenkins-bot:

[mediawiki/core@master] tests: Flatten /tests/qunit for jquery.* module tests as well

https://gerrit.wikimedia.org/r/815614

Change 890495 had a related patch set uploaded (by Krinkle; author: Kosta Harlan):

[mediawiki/core@master] tests: Improve --qunit-watch handling in Gruntfile

https://gerrit.wikimedia.org/r/890495

Change 759239 merged by jenkins-bot:

[mediawiki/core@master] QUnit: CLI option for watching test and source files

https://gerrit.wikimedia.org/r/759239

Change 890495 merged by jenkins-bot:

[mediawiki/core@master] tests: Improve --qunit-watch handling in Gruntfile

https://gerrit.wikimedia.org/r/890495

Change 890910 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Enable debug=2 by default for SpecialJavaScriptTest

https://gerrit.wikimedia.org/r/890910

Change 890910 merged by jenkins-bot:

[mediawiki/core@master] qunit: Enable debug=2 by default for SpecialJavaScriptTest

https://gerrit.wikimedia.org/r/890910

Change 891929 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Remove old $.fx and $.ajax tracking from testrunner

https://gerrit.wikimedia.org/r/891929

Change 891929 merged by jenkins-bot:

[mediawiki/core@master] qunit: Remove old $.fx and $.ajax tracking from testrunner

https://gerrit.wikimedia.org/r/891929

Change 890910 merged by jenkins-bot:

[mediawiki/core@master] qunit: Enable debug=2 by default for SpecialJavaScriptTest

https://gerrit.wikimedia.org/r/890910

This is temporarily reverted due to a flaky CI failure identified at T330314: CI failure - TypeError: Cannot read property 'registerCompiler' of undefined.

In a nut shell, it appears that when enabling debug mode in CI (both debug=2 and debug=1, presumed), the localhost web server or database get more loaded than we currently permit, resulting in one or two requests failing, and thus a somewhat random subset of modules remains undefined, leading to the flaky test failure.

/load.php?debug=2&modules=mediawiki.rcfilters.filters.ui&version=ztntf   DBQueryDisconnectedError: A connection error occurred during a query. 
Query: COMMIT
Function: MediaWiki::restInPeace
Error: 1927 Connection was killed

#5 /workspace/src/includes/libs/rdbms/loadbalancer/LoadBalancer.php(1572): Wikimedia\Rdbms\Database->commit(string, string)
#6 /workspace/src/includes/libs/rdbms/lbfactory/LBFactory.php(383): Wikimedia\Rdbms\LoadBalancer->commitPrimaryChanges(string)
#7 /workspace/src/includes/MediaWiki.php(1104): Wikimedia\Rdbms\LBFactory->commitPrimaryChanges(string)
#8 /workspace/src/includes/MediaWiki.php(848): MediaWiki->restInPeace()
#9 /workspace/src/load.php(61): MediaWiki->doPostOutputShutdown()

/load.php?debug=2&modules=mediawiki.rcfilters.filters.ui&version=ztntf   DBTransactionError: Commit failed […]: A connection error occurred during a query. 
Query: COMMIT
Function: MediaWiki::restInPeace
Error: 1927 Connection was killed

#1 /workspace/src/includes/MediaWiki.php(1104): Wikimedia\Rdbms\LBFactory->commitPrimaryChanges(string)
#2 /workspace/src/includes/MediaWiki.php(848): MediaWiki->restInPeace()
#3 /workspace/src/load.php(61): MediaWiki->doPostOutputShutdown()

So perhaps it is a database connection issue […]?

Ack, that could be it. Perhaps too much concurrency for the database to handle. Although these shouldn't be making pre-send database changes. I guess that's a side-effect of wgForceDeferredUpdatesPreSend being set for the benefit of Selenium tests.

Change 902493 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Remove non-standard assertTrue() and assertFalse() methods

https://gerrit.wikimedia.org/r/902493

Change 902525 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Move <div id="qunit-fixture"> from JS to HTML

https://gerrit.wikimedia.org/r/902525

Change 902493 merged by jenkins-bot:

[mediawiki/core@master] qunit: Remove non-standard assertTrue() and assertFalse() methods

https://gerrit.wikimedia.org/r/902493

Change 902525 merged by jenkins-bot:

[mediawiki/core@master] qunit: Move <div id="qunit-fixture"> from JS to HTML

https://gerrit.wikimedia.org/r/902525

Change 904661 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Always restore mw.config/mw.messages to original values

https://gerrit.wikimedia.org/r/904661

Change 904661 abandoned by Krinkle:

[mediawiki/core@master] qunit: Always restore mw.config/mw.messages to original values

Reason:

Not practical. Some messages and config get defined by source code between loading of qunit and loading of tests. For this to work, we'd need to add a file between loading of source deps and test suites, which is infeasible as each source/test pair is its own QUnitTestModule.

https://gerrit.wikimedia.org/r/904661

Change 907514 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] ResourceLoader: Remove 1/2 inDebugMode() calls in SpecialJavaScriptTest

https://gerrit.wikimedia.org/r/907514

Change 907514 merged by jenkins-bot:

[mediawiki/core@master] ResourceLoader: Remove 1/2 inDebugMode() calls in SpecialJavaScriptTest

https://gerrit.wikimedia.org/r/907514

Change 908394 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] mediawiki.util: Increase isIPv6Address test coverage

https://gerrit.wikimedia.org/r/908394

An example of test coverage using Chrome's built-in devtools and debug=2 on Special:JavaScriptTest. This displays coverage of the mediawiki.util module.

Screenshot 2023-04-12 at 20.27.32.png (1×2 px, 497 KB)
Screenshot 2023-04-12 at 20.45.31.png (1×2 px, 485 KB)

Change 908394 merged by jenkins-bot:

[mediawiki/core@master] mediawiki.util: Increase isIPv6Address test coverage

https://gerrit.wikimedia.org/r/908394

Change 908980 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] jquery.color: Simplify async test with native async-await

https://gerrit.wikimedia.org/r/908980

Change 908980 merged by jenkins-bot:

[mediawiki/core@master] jquery.color: Simplify async test with native async-await

https://gerrit.wikimedia.org/r/908980

Per T335329#8803718 it looks like we need to update the Gruntfile.js argument processing.

Change 912939 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] jquery.highlightText: Adopt QUnit.test.each() and clean up

https://gerrit.wikimedia.org/r/912939

Change 912942 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] jquery.lengthLimit: Adopt QUnit.test.each() and clean up

https://gerrit.wikimedia.org/r/912942

Change 912945 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] mediawiki.util: Adopt QUnit.test.each() for IPV4_CASES/IPV6_CASES

https://gerrit.wikimedia.org/r/912945

Change 912942 merged by jenkins-bot:

[mediawiki/core@master] jquery.lengthLimit: Adopt QUnit.test.each() and clean up

https://gerrit.wikimedia.org/r/912942

Change 912945 merged by jenkins-bot:

[mediawiki/core@master] mediawiki.util: Adopt QUnit.test.each() for IPV4_CASES/IPV6_CASES

https://gerrit.wikimedia.org/r/912945

Change 912939 merged by jenkins-bot:

[mediawiki/core@master] jquery.highlightText: Adopt QUnit.test.each() and clean up

https://gerrit.wikimedia.org/r/912939

Per T335329#8803718 it looks like we need to update the Gruntfile.js argument processing.

Thanks. Chromium 110 changes how it parses command-line arguments. Fixed!

Change 911909 merged: [mediawiki/core] build: Avoid extra space in Chromium command via CHROMIUM_FLAGS. https://gerrit.wikimedia.org/r/911909

Change 913635 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] mediawiki.string: Adopt QUnit.test.each() and clean up

https://gerrit.wikimedia.org/r/913635

Change 913635 merged by jenkins-bot:

[mediawiki/core@master] mediawiki.String: Adopt QUnit.test.each() and clean up

https://gerrit.wikimedia.org/r/913635

Change 776352 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] resourceloader: Allow require() on private files when under test

https://gerrit.wikimedia.org/r/776352

Change 917958 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/extensions/WikimediaEvents@master] clientError: Import private file directly instead of repacking another module

https://gerrit.wikimedia.org/r/917958

Change 776352 merged by jenkins-bot:

[mediawiki/core@master] resourceloader: Allow require() on private files when under test

https://gerrit.wikimedia.org/r/776352

Change 926662 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] mediawiki.Uri: Modernize test syntax, adopt test.each(), propContains()

https://gerrit.wikimedia.org/r/926662

Change 926662 merged by jenkins-bot:

[mediawiki/core@master] mediawiki.Uri: Modernize test syntax, adopt test.each(), propContains()

https://gerrit.wikimedia.org/r/926662

Change 917958 merged by jenkins-bot:

[mediawiki/extensions/WikimediaEvents@master] clientError: Import private file directly instead of repacking another module

https://gerrit.wikimedia.org/r/917958

Change 759705 abandoned by Kosta Harlan:

[mediawiki/core@master] [WIP] QUnit: Add support for generating coverage reports

Reason:

https://gerrit.wikimedia.org/r/759705

Change #1055512 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] tests: Remove unstyled text atop Special:JavaScriptTest

https://gerrit.wikimedia.org/r/1055512

Change #1055511 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/extensions/VisualEditor@master] tests: Fix DesktopArticleTarget dirtying location.href

https://gerrit.wikimedia.org/r/1055511

Change #1055511 merged by jenkins-bot:

[mediawiki/extensions/VisualEditor@master] tests: Fix DesktopArticleTarget dirtying location.href

https://gerrit.wikimedia.org/r/1055511

Change #1055512 merged by jenkins-bot:

[mediawiki/core@master] tests: Remove unstyled text atop Special:JavaScriptTest

https://gerrit.wikimedia.org/r/1055512

Change #1064463 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Move testrunner.js precheck from noisy module to QUnit.begin

https://gerrit.wikimedia.org/r/1064463

Change #1064463 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Move testrunner.js precheck from noisy module to QUnit.begin

https://gerrit.wikimedia.org/r/1064463

BeforeAfter
Screenshot 2024-08-21 at 21.16.50.png (1×1 px, 394 KB)
Screenshot 2024-08-21 at 21.15.37.png (675×1 px, 169 KB)

Change #1064476 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Refactor newMwEnvironment() to function literal

https://gerrit.wikimedia.org/r/1064476

Change #1064477 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Replace slow mw.messages reset with empty object reset

https://gerrit.wikimedia.org/r/1064477

Change #1064507 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Support 'component' param on Special:JavaScriptTest

https://gerrit.wikimedia.org/r/1064507

Change #1064463 merged by jenkins-bot:

[mediawiki/core@master] qunit: Move testrunner.js precheck from noisy module to QUnit.begin

https://gerrit.wikimedia.org/r/1064463

Change #1064476 merged by jenkins-bot:

[mediawiki/core@master] qunit: Refactor newMwEnvironment() to function literal

https://gerrit.wikimedia.org/r/1064476

Change #1064477 merged by jenkins-bot:

[mediawiki/core@master] qunit: Replace slow mw.messages reset with empty object reset

https://gerrit.wikimedia.org/r/1064477

Change #1064507 merged by jenkins-bot:

[mediawiki/core@master] qunit: Support 'component' param on Special:JavaScriptTest

https://gerrit.wikimedia.org/r/1064507

Change #1114148 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/extensions/VisualEditor@master] ve.ui.MWSaveDialogAction: Skip register() when in test

https://gerrit.wikimedia.org/r/1114148

Change #1114152 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] mediawiki.api: Remove console warning for legacy token type

https://gerrit.wikimedia.org/r/1114152

Change #1114152 merged by jenkins-bot:

[mediawiki/core@master] mediawiki.api: Remove console warning for legacy token type

https://gerrit.wikimedia.org/r/1114152

Change #1114426 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] ResourceLoader: Silence "unavailable module" warning in error handling test

https://gerrit.wikimedia.org/r/1114426

Change #1114427 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] jquery.tablesorter: Silence an expected "sort-rowspan-error" warning

https://gerrit.wikimedia.org/r/1114427

Change #1114426 merged by jenkins-bot:

[mediawiki/core@master] ResourceLoader: Silence "unavailable module" warning in error handling test

https://gerrit.wikimedia.org/r/1114426

Change #1114427 merged by jenkins-bot:

[mediawiki/core@master] jquery.tablesorter: Silence an expected "sort-rowspan-error" warning

https://gerrit.wikimedia.org/r/1114427

Change #1129556 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Remove 'debug' checkbox from SpecialJavaScriptTest

https://gerrit.wikimedia.org/r/1129556

Change #1129557 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Add "Component" menu to QUnit toolbar

https://gerrit.wikimedia.org/r/1129557

Change #1129557 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Add "Component" menu to QUnit toolbar

https://gerrit.wikimedia.org/r/1129557

Screenshot 2025-03-19 at 17.42.28.png (1×1 px, 334 KB)

Change #1129587 had a related patch set uploaded (by Krinkle; author: Krinkle):

[mediawiki/core@master] qunit: Move 'testrunner' tests to its own file

https://gerrit.wikimedia.org/r/1129587

Change #1129556 merged by jenkins-bot:

[mediawiki/core@master] qunit: Remove 'debug' checkbox from SpecialJavaScriptTest

https://gerrit.wikimedia.org/r/1129556

Change #1129557 merged by jenkins-bot:

[mediawiki/core@master] qunit: Add "Component" menu to QUnit toolbar

https://gerrit.wikimedia.org/r/1129557

Change #1129587 merged by jenkins-bot:

[mediawiki/core@master] qunit: Move 'testrunner' tests to its own file

https://gerrit.wikimedia.org/r/1129587

Change #1114148 merged by jenkins-bot:

[mediawiki/extensions/VisualEditor@master] ve.ui.MWSaveDialogAction: Skip register() when in test

https://gerrit.wikimedia.org/r/1114148