CI: improve QUnit tests stability#34150
Merged
EugeniyKiyashko merged 9 commits intoJul 1, 2026
Merged
Conversation
ca94974 to
dce039a
Compare
dce039a to
615cd77
Compare
Contributor
There was a problem hiding this comment.
Pull request overview
This PR targets CI stability for DevExtreme’s QUnit and TestCafe suites by simplifying QUnit suite metadata/selection, adding more deterministic waits in several flaky tests, and improving runner/CI observability and scheduling.
Changes:
- Simplifies QUnit category metadata (
__meta.json) and removes runner support for legacyExplicit/RunOnDevicesflags. - Reworks several QUnit tests to reduce timing flakiness (polling/wait helpers, loading-panel waits, mock loading), and adds a global QUnit test timeout.
- Improves CI behavior/telemetry (runner logs per-test runtime, adjusts QUnit workflow matrix/parallelism, tweaks watchdog logging; marks/adjusts some TestCafe tests).
Reviewed changes
Copilot reviewed 63 out of 67 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/devextreme/testing/tests/Memory Leaks/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.vectorMap/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.vectorMap.utils/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.treeMap/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.sparklines/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.sankey/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.renderers/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.rangeSelector/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.gauges/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.funnel/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.core/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.core.series/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.viz.charts/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.utils/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.treeList/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.pivotGrid/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.htmlEditor/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.form/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.events/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.serverSide/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.serverSide.htmlEditor/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.localization/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.knockout/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.jquery/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.exporter/__meta.json | Moves exporter tests into ui.grid constellation; removes unused flags. |
| packages/devextreme/testing/tests/DevExpress.data/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.core/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.common/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.aspnet/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.animation/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/Bundles/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/Bootstrap Integration/__meta.json | Removes unused category flags; keeps only constellation. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets/mapParts/azureTests.js | Refactors Azure mock loading and makes some tests async. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js | Replaces fixed timeouts with “wait until animation settled” polling. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets/fileManagerParts/toolbar.tests.js | Removes a skipped test block. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets/fileManagerParts/contextMenu.tests.js | Removes a skipped test block. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/messageList.tests.js | Introduces polling helper and converts multiple scroll-related tests to async waits. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets/chatParts/chat.tests.js | Adds async wait helpers for editing preview animation timing; refactors tests away from fixed timeouts. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/common.tests.js | Adds an explicit wait for load panel removal. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.monthView.tests.js | Uses waitForAsync to wait for appointments rendering. |
| packages/devextreme/testing/tests/DevExpress.ui.widgets.scheduler/appointment.editing.tests.js | Adjusts instance creation/waits to reduce timing flakiness. |
| packages/devextreme/testing/runner/templates/run-suite.template.html | Sets global QUnit testTimeout to 40 seconds. |
| packages/devextreme/testing/runner/templates/run-all.template.html | Sends per-test runtime to the runner backend. |
| packages/devextreme/testing/runner/templates/index.template.html | Removes “explicit” category UI/logic; defaults to selecting all categories. |
| packages/devextreme/testing/runner/lib/types.ts | Removes export constellation and Explicit/RunOnDevices fields from category types. |
| packages/devextreme/testing/runner/lib/suites.ts | Removes device/explicit filtering logic and stops reading removed meta flags. |
| packages/devextreme/testing/runner/index.ts | Logs test/suite runtime in seconds; removes deviceMode handling. |
| packages/devextreme/project.json | Adjusts Nx inputs to better reflect dependent outputs/env for caching. |
| packages/devextreme/js/__internal/scheduler/scheduler.ts | Guards workspace refresh/focus after disposal to avoid runtime errors. |
| packages/devextreme/js/__internal/scheduler/scheduler_options_base_widget.ts | Declares _disposed typing used by scheduler guard. |
| packages/devextreme/docker-ci.sh | Reduces retries and improves watchdog stall logging with idle seconds. |
| e2e/testcafe-devextreme/tests/dataGrid/common/aiColumn/virtualScrolling.functional.ts | Marks a TestCafe test as unstable. |
| e2e/testcafe-devextreme/tests/common/pivotGrid/fieldPanel/dragAndDropFieldItems.ts | Adjusts fixture/test metadata related to reloads/unstable tagging. |
| e2e/testcafe-devextreme/tests/cardView/headerFilter/common.functional.ts | Adds intermediate assertions for tree expansion to reduce flakiness. |
| e2e/testcafe-devextreme/tests/cardView/columnChooser/functional.ts | Waits for widget readiness after toggling column visibility. |
| .github/workflows/testcafe_tests.yml | Tunes matrix concurrency for some suites/themes. |
| .github/workflows/qunit_tests.yml | Adjusts QUnit constellation matrix (incl. ui.grid) and reduces worker counts for stability. |
Comments suppressed due to low confidence (2)
packages/devextreme/testing/tests/DevExpress.ui.widgets/mapParts/azureTests.js:318
- This test is declared as
async(so QUnit will finish it when the returned promise resolves) but it also usesassert.async()/done(). In anasynctest, the promise resolves as soon as the function body completes, which can end the test beforeonReadyruns, causing "assertion after test finished" errors or silent false positives. Prefer returning/awaiting a promise that resolves ononReadyand removeassert.async().
packages/devextreme/testing/tests/DevExpress.ui.widgets/mapParts/azureTests.js:389 - Same issue as above:
asynctest +assert.async()risks completing the test before theonReadycallback runs. Removedone()and await a promise tied toonReady.
alexslavr
approved these changes
Jul 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.