Repository navigation
[test_reflective_loader] Use test groups instead of combining names - #2107
Conversation
|
@scheglov this is not a priority, but if you have chance to confirm this change wouldn't negatively affect you, I will work on some tests and changelog/etc. |
|
With this change everything works fine for me. The presentation is obviously slightly different vs new We seem to not include With separators it was a tiny bit easier to read, but this is very small, and probably should be solved the way it was, with combining names, but in the test reporter instead. |
|
I think if the generated groups have the name like |
|
It will probably look bad in VS Code then, which is the point of this change :-) |
Ah, well spotted, I'll look into that (and ensure there are tests).
Hmm, I'm not sure how we could do this without affecting other uses of group('foo', () {
test('bar', () {And package test joins them automatically with spaces. I think usually they are written in a way that this makes sense, but I agree it seems odd here. @jakemac53 do you know if there are any existing ways in package:test to control how the names would be combined, without inserting characters into the name that would show up in the JSON (and therefore the VS Code tree)?
Actually, I'm not sure about this, I'll have to do some testing. The |
|
Sure, the default behavior is to join with spaces as separators, and not everyone wants or likes using something different. My guess is that we might theoretically have a separate |
Not that I know of, no. |
I have some recollection that you can't control the reporter unless running from Although, if you're likely to continue to run from the terminal with a patched version of I'll tidy this PR up and add some tests (and fix the |
|
It turns out that I only handled I've pushed changes to handle this - essentially we know create our own hierarchy of group/tests now, and then walk that tree in I diffed the output versus the current version for analyzer, and everything seemed the same (besides pipes, and some differences in the printed timestamps). |
This happens if |
Ah, interesting. One of the failures was |
|
Oh, I see the problem... It's these (some of those tests like They do not await anything so the tests that have I don't know why it works the other way though (not calling any |
|
With the latest changes I see spamming on the console when I have a single |
Oh, good spot. I think this is This isn't good though - if there's no way to suppress this (@jakemac53?) then we might have to switch back to handling it locally and just not calling group/test for those things. |
It is imo good for it to have the same behavior as regular package:test. If we want to change the default way package:test handles |
|
"Just to avoid spam" is a quite important reason for me. |
I am not saying it shouldn't spam, its just that we should address that issue in package:test itself, its not an issue specific to this use case. |
Ah, that way of solving this problem I do like. If |
|
We do have |
|
I agree that changing this in |
|
@scheglov do you know if you are using the expanded reporter also? If you are seeing spam for passed tests it indicates you are probably not getting the compact reporter. Update: I did just confirm that skipped tests always spam even in compact mode, we should just fix that imo. |
|
Do I have choice? I'm running using PatchYou can add a headerdiff --git a/pkgs/test_api/lib/src/backend/invoker.dart b/pkgs/test_api/lib/src/backend/invoker.dart
index 58f1001d..57201df8 100644
--- a/pkgs/test_api/lib/src/backend/invoker.dart
+++ b/pkgs/test_api/lib/src/backend/invoker.dart
@@ -378,7 +378,7 @@ class Invoker {
_controller.setState(const State(Status.running, Result.success));
_runCount++;
- Chain.capture(() {
+ // Chain.capture(() {
_guardIfGuarded(() {
runZoned(() async {
// Run the test asynchronously so that the "running" state change
@@ -415,7 +415,7 @@ class Invoker {
zoneSpecification:
ZoneSpecification(print: (_, __, ___, line) => _print(line)));
});
- }, when: liveTest.test.metadata.chainStackTraces, errorZone: false);
+ // }, when: liveTest.test.metadata.chainStackTraces, errorZone: false);
}
/// Runs [callback], in a [Invoker.guard] context if [_guarded] is `true`.
diff --git a/pkgs/test_core/lib/src/scaffolding.dart b/pkgs/test_core/lib/src/scaffolding.dart
index ffcb0083..d060623b 100644
--- a/pkgs/test_core/lib/src/scaffolding.dart
+++ b/pkgs/test_core/lib/src/scaffolding.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
+import 'dart:io';
import 'package:meta/meta.dart' show isTest, isTestGroup;
import 'package:path/path.dart' as p;
@@ -13,6 +14,7 @@ import 'package:test_api/src/backend/invoker.dart'; // ignore: implementation_im
import 'runner/engine.dart';
import 'runner/plugin/environment.dart';
+import 'runner/reporter/compact.dart';
import 'runner/reporter/expanded.dart';
import 'runner/runner_suite.dart';
import 'runner/suite.dart';
@@ -60,7 +62,8 @@ Declarer get _declarer {
var engine = Engine();
engine.suiteSink.add(suite);
engine.suiteSink.close();
- ExpandedReporter.watch(engine, PrintSink(),
+// ExpandedReporter.watch(engine, PrintSink(),
+ CompactReporter.watch(engine, stdout,
color: true, printPath: false, printPlatform: false);
var success = await runZoned(() => Invoker.guard(engine.run),
diff --git a/pkgs/test_core/lib/src/util/io.dart b/pkgs/test_core/lib/src/util/io.dart
index 98bb23b2..39259b29 100644
--- a/pkgs/test_core/lib/src/util/io.dart
+++ b/pkgs/test_core/lib/src/util/io.dart
@@ -20,7 +20,7 @@ import 'pretty_print.dart';
/// The default line length for output when there isn't a terminal attached to
/// stdout.
-const _defaultLineLength = 200;
+const _defaultLineLength = 100;
/// Whether the test runner is running on Google-internal infrastructure.
final bool inGoogle = Platform.version.contains('(google3)'); |
|
The default reporter is the compact reporter when using the test runner, if you are just directly invoking the test files though then maybe that is the code path you are editing? All kinds of things won't work doing that though and you should move to just using |
|
Using If using |
|
@scheglov interested in your thoughts on the above... is using It does remove the hierarchy that is currently added by the |
|
TIL! |
|
Friendly ping for the comment above:
|
|
FYI @scheglov, @jakemac53 Noting that dart-lang/test#2542 has been completed so new versions of So landing this would not be as much of a problem anymore. |
b0bf6ac to
16226a2
Compare
|
I rebased these changes and fixed the conflicts (with Gemini's help :) they were quite awkward and it apparently is good at this!). When I run analyzer tests locally with
However, if I run without
I think this is because the fix was in the compact runner but as @scheglov noted above:
So I'm not sure where that leaves this change. Do we need to have the skip-spam in the expanded reporter (@jakemac53)? Is it reasonable to say you should run these tests with |
|
I don't run analyzer tests with But it is probably fair that if |
Package publishing
Documentation at https://github.com/dart-lang/ecosystem/wiki/Publishing-automation. |
PR HealthLicense Headers ✔️
All source files should start with a license header. Unrelated files missing license headers
This check can be disabled by tagging the PR with API leaks ✔️The following packages contain symbols visible in the public API, but not exported by the library. Export these symbols or remove them from your publicly visible API.
This check can be disabled by tagging the PR with Breaking changes ✔️
This check can be disabled by tagging the PR with Unused Dependencies ✔️
For details on how to fix these, see dependency_validator. This check can be disabled by tagging the PR with Coverage ✔️
This check for test coverage is informational (issues shown here will not fail the PR). This check can be disabled by tagging the PR with Changelog Entry ✔️
Changes to files need to be accounted for in their respective changelogs. This check can be disabled by tagging the PR with |
Otherwise on GH we get ticks instead of numbers
I feel like we discussed being able to override the test reporter somewhere, but I'm unable to find any related issue now. Maybe @jakemac53 remembers?
Presumably there is an overhead to compiling/running each suite individually compared to However, it requires https://dart-review.googlesource.com/c/sdk/+/478663 because there was a test with I've pushed what I hope to fix the failing test - it turns out pkg:test uses a different reporter on GitHub that outputs ticks instead of numbers. I've changed that test to set the reporter explicitly so it should behave consistently between GH and locally now. You'll likely have to trigger the bots again though, I don't think they'll re-run automatically. |
|
At least in the past we have decided not to invest in supporting directly invoked tests without the test runner. There are many many features that are not supported when running that way, and fixing this one isn't going to really move the needle. cc @natebosch to confirm this is still accurate. Really we should try and solve the issue of compilation taking longer than running the tests. |
These weren't necessary and prevented running these tests with `dart test`, because they could call `test()` asynchronously after tests had started. See dart-lang/tools#2107 (comment) Change-Id: I789a20a29d111e0600e39340ee04641507db25a0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/478663 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
|
We do have some limited support for customizing the test behavior when executing without the test runner. It is not very fleshed out and currently not prioritized for changes. The only supported use is in Flutter integration test framework, but if it helps in the short term you can use it and hardcode the reporter to compact. I expect to spend time later this quarter on the test loading and compiling implementation in the test runner, and adding an option to combine test suites into a single compile is something we can try out. |
|
Indeed, I can run my tests using import 'package:test_core/src/direct_run.dart';
import 'package:test_core/src/runner/reporter/compact.dart';
main() {
directRunTests(
() {
defineReflectiveSuite(() {
defineReflectiveTests(ClassDeclarationResolutionTest);
defineReflectiveTests(ClassDeclarationResolutionTest_constructor_super);
defineReflectiveTests(
ClassDeclarationResolutionTest_primaryConstructor_super,
);
defineReflectiveTests(UpdateNodeTextExpectations);
});
},
reporterFactory: (engine) => CompactReporter.watch(
engine,
stdout,
color: true,
printPath: true,
printPlatform: false,
),
);
// defineReflectiveSuite(() {
// defineReflectiveTests(ClassDeclarationResolutionTest);
// defineReflectiveTests(ClassDeclarationResolutionTest_constructor_super);
// defineReflectiveTests(
// ClassDeclarationResolutionTest_primaryConstructor_super,
// );
// defineReflectiveTests(UpdateNodeTextExpectations);
// });
} |
Yes, this is a feature aimed at implementors of alternative test runners where breaking compatibility with The workaround is to keep import 'test_all.dart' as tests;
void main() {
directRunTests(tests.main);
}This solution also handles async test declaring as long as the callback returns a |
|
Apparently there's some difference in the test output between the Dart dev and Dart 3.5 bots too. I've tweaked the tests to only check for the combined test names (and not any @scheglov please could you trigger the bots again (hopefully for the last time 🤞); thanks! |
|
@scheglov the bots are green now. Are you happy with this, or do you think we still need to resolve/change anything? I don't have powers to merge so that's probably for you too, but if you still have concerns I'm happy to make changes. |
Revisions updated by `dart tools/rev_sdk_deps.dart`. tools (https://github.com/dart-lang/tools/compare/3e1d1c4..119a499): 119a4990 Fri Feb 13 08:10:29 2026 +0100 Sigurd Meldgaard Prepare yaml_edit 2.2.4 (dart-lang/tools#2309) 5132ef9b Thu Feb 12 17:35:41 2026 +0000 Danny Tuppeny [test_reflective_loader] Use test groups instead of combining names (dart-lang/tools#2107) f4c21219 Thu Feb 12 02:10:16 2026 +0100 Mohellebi Abdessalem [UA] Bump dart to 3.10 (dart-lang/tools#2324) dc3c224b Tue Feb 10 14:21:12 2026 -0800 Nate Bosch Add --disable-session-crashed-bubble (dart-lang/tools#2321) Change-Id: I98414cb639590e2c29bd8d26d6c0f6fa56334c2e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/481120 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>




@scheglov this change switches to using
package:testgroups instead of just combining names (#2104). This would improve how things appear in the VS Code test runner because there would be groups instead of everything being flat at the top:I don't know if it might negatively affect you - one difference when running from the terminal (without the test runner) is that there won't be pipe-separated names, they will just be space-separated (which is what
package:testdoes for groups/tests:If we want to go ahead, this will need a little more work (tests, versions/changelog updating etc.) but I wanted to get your input first.