Skip to content

Commit bbad7a2

Browse files
authored
Add --coverage-package option (#2566)
1 parent cba5c15 commit bbad7a2

File tree

11 files changed

+189
-39
lines changed

11 files changed

+189
-39
lines changed

pkgs/test/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 1.29.0-wip
2+
3+
* Add `--coverage-package` flag, which filters the coverage report to specific
4+
packages using RegExps.
5+
16
## 1.28.0
27

38
* Add `isSorted` and related matchers for iterables.

pkgs/test/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: test
2-
version: 1.28.0
2+
version: 1.29.0-wip
33
description: >-
44
A full featured library for writing and running Dart tests across platforms.
55
repository: https://github.com/dart-lang/test/tree/master/pkgs/test
@@ -36,7 +36,7 @@ dependencies:
3636

3737
# Use an exact version until the test_api and test_core package are stable.
3838
test_api: 0.7.8
39-
test_core: 0.6.14
39+
test_core: 0.6.15-wip
4040

4141
typed_data: ^1.3.0
4242
web_socket_channel: '>=2.0.0 <4.0.0'

pkgs/test/test/io.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ Future<TestProcess> runTest(
100100
bool forwardStdio = false,
101101
String? packageConfig,
102102
Iterable<String>? vmArgs,
103+
String? workingDirectory,
103104
}) async {
104105
concurrency ??= 1;
105106
var testExecutablePath = _testExecutablePath;
@@ -127,6 +128,7 @@ Future<TestProcess> runTest(
127128
description: 'dart bin/test.dart',
128129
forwardStdio: forwardStdio,
129130
packageConfig: packageConfig,
131+
workingDirectory: workingDirectory,
130132
);
131133
}
132134

@@ -140,6 +142,7 @@ Future<TestProcess> runDart(
140142
String? description,
141143
bool forwardStdio = false,
142144
String? packageConfig,
145+
String? workingDirectory,
143146
}) async {
144147
var allArgs = <String>[
145148
'--packages=${packageConfig ?? await Isolate.packageConfig}',
@@ -149,7 +152,7 @@ Future<TestProcess> runDart(
149152
return await TestProcess.start(
150153
p.absolute(Platform.resolvedExecutable),
151154
allArgs,
152-
workingDirectory: d.sandbox,
155+
workingDirectory: workingDirectory ?? d.sandbox,
153156
environment: environment,
154157
description: description,
155158
forwardStdio: forwardStdio,
@@ -160,11 +163,12 @@ Future<TestProcess> runDart(
160163
Future<TestProcess> runPub(
161164
Iterable<String> args, {
162165
Map<String, String>? environment,
166+
String? workingDirectory,
163167
}) {
164168
return TestProcess.start(
165169
p.absolute(Platform.resolvedExecutable),
166170
['pub', ...args],
167-
workingDirectory: d.sandbox,
171+
workingDirectory: workingDirectory ?? d.sandbox,
168172
environment: environment,
169173
description: 'pub ${args.first}',
170174
);

pkgs/test/test/runner/coverage_test.dart

Lines changed: 110 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void main() {
2121

2222
group('with the --coverage flag,', () {
2323
late Directory coverageDirectory;
24-
late d.DirectoryDescriptor packageDirectory;
24+
late String pkgDir;
2525

2626
Future<void> validateTest(TestProcess test) async {
2727
expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
@@ -47,9 +47,10 @@ void main() {
4747
'test_coverage',
4848
);
4949

50-
packageDirectory = d.dir(d.sandbox, [
51-
d.dir('lib', [
52-
d.file('calculate.dart', '''
50+
final outerDirectory = d.dir(d.sandbox, [
51+
d.dir('fake_package', [
52+
d.dir('lib', [
53+
d.file('calculate.dart', '''
5354
int calculate(int x) {
5455
if (x % 2 == 0) {
5556
return x * 2;
@@ -58,9 +59,9 @@ void main() {
5859
}
5960
}
6061
'''),
61-
]),
62-
d.dir('test', [
63-
d.file('test.dart', '''
62+
]),
63+
d.dir('test', [
64+
d.file('test.dart', '''
6465
import 'package:fake_package/calculate.dart';
6566
import 'package:test/test.dart';
6667
@@ -70,30 +71,66 @@ void main() {
7071
});
7172
}
7273
'''),
73-
]),
74-
d.file('pubspec.yaml', '''
74+
]),
75+
d.file('pubspec.yaml', '''
7576
name: fake_package
7677
version: 1.0.0
7778
environment:
7879
sdk: ^3.5.0
7980
dev_dependencies:
8081
test: ^1.26.2
8182
'''),
83+
]),
84+
d.dir('fake_client', [
85+
d.dir('lib', [
86+
d.file('calculate.dart', '''
87+
import 'package:fake_package/calculate.dart' as fake_package;
88+
89+
int calculate(int x) {
90+
return fake_package.calculate(x);
91+
}
92+
'''),
93+
]),
94+
d.dir('test', [
95+
d.file('test.dart', '''
96+
import 'package:fake_client/calculate.dart';
97+
import 'package:test/test.dart';
98+
99+
void main() {
100+
test('test 1', () {
101+
expect(calculate(6), 12);
102+
});
103+
}
104+
'''),
105+
]),
106+
d.file('pubspec.yaml', '''
107+
name: fake_client
108+
version: 1.0.0
109+
environment:
110+
sdk: ^3.5.0
111+
dependencies:
112+
fake_package:
113+
path: ../fake_package
114+
dev_dependencies:
115+
test: ^1.26.2
116+
'''),
117+
]),
82118
]);
83-
await packageDirectory.create();
119+
await outerDirectory.create();
120+
pkgDir = p.join(d.sandbox, 'fake_package');
84121
});
85122

86123
tearDown(() async {
87124
await coverageDirectory.delete(recursive: true);
88125
});
89126

90127
test('gathers coverage for VM tests', () async {
91-
await (await runPub(['get'])).shouldExit(0);
92-
var test = await runTest([
93-
'--coverage',
94-
coverageDirectory.path,
95-
'test/test.dart',
96-
], packageConfig: p.join(d.sandbox, '.dart_tool/package_config.json'));
128+
await (await runPub(['get'], workingDirectory: pkgDir)).shouldExit(0);
129+
var test = await runTest(
130+
['--coverage', coverageDirectory.path, 'test/test.dart'],
131+
packageConfig: p.join(pkgDir, '.dart_tool/package_config.json'),
132+
workingDirectory: pkgDir,
133+
);
97134
final coverage = await validateCoverage(test, 'test/test.dart.vm.json');
98135
final hitmap = coverage['package:fake_package/calculate.dart']!;
99136
expect(hitmap.lineHits, {1: 1, 2: 2, 3: 1, 5: 0});
@@ -102,7 +139,7 @@ dev_dependencies:
102139
});
103140

104141
test('gathers branch coverage for VM tests', () async {
105-
await (await runPub(['get'])).shouldExit(0);
142+
await (await runPub(['get'], workingDirectory: pkgDir)).shouldExit(0);
106143
var test = await runTest(
107144
[
108145
'--coverage',
@@ -111,7 +148,8 @@ dev_dependencies:
111148
'test/test.dart',
112149
],
113150
vmArgs: ['--branch-coverage'],
114-
packageConfig: p.join(d.sandbox, '.dart_tool/package_config.json'),
151+
packageConfig: p.join(pkgDir, '.dart_tool/package_config.json'),
152+
workingDirectory: pkgDir,
115153
);
116154
final coverage = await validateCoverage(test, 'test/test.dart.vm.json');
117155
final hitmap = coverage['package:fake_package/calculate.dart']!;
@@ -121,16 +159,51 @@ dev_dependencies:
121159
});
122160

123161
test('gathers lcov coverage for VM tests', () async {
124-
await (await runPub(['get'])).shouldExit(0);
162+
await (await runPub(['get'], workingDirectory: pkgDir)).shouldExit(0);
125163
final lcovFile = p.join(coverageDirectory.path, 'lcov.info');
126-
var test = await runTest([
127-
'--coverage-path',
128-
lcovFile,
129-
'test/test.dart',
130-
], packageConfig: p.join(d.sandbox, '.dart_tool/package_config.json'));
164+
var test = await runTest(
165+
['--coverage-path', lcovFile, 'test/test.dart'],
166+
packageConfig: p.join(pkgDir, '.dart_tool/package_config.json'),
167+
workingDirectory: pkgDir,
168+
);
131169
await validateTest(test);
132170
expect(File(lcovFile).readAsStringSync(), '''
133-
SF:${p.join(d.sandbox, 'lib', 'calculate.dart')}
171+
SF:${p.join(pkgDir, 'lib', 'calculate.dart')}
172+
DA:1,1
173+
DA:2,2
174+
DA:3,1
175+
DA:5,0
176+
LF:4
177+
LH:3
178+
end_of_record
179+
''');
180+
});
181+
182+
test('gathers coverage for tests in multiple pacakges', () async {
183+
final clientPkgDir = p.join(d.sandbox, 'fake_client');
184+
await (await runPub([
185+
'get',
186+
], workingDirectory: clientPkgDir)).shouldExit(0);
187+
final lcovFile = p.join(coverageDirectory.path, 'lcov.info');
188+
var test = await runTest(
189+
[
190+
'--coverage-path',
191+
lcovFile,
192+
'--coverage-package=fake_.*',
193+
'test/test.dart',
194+
],
195+
packageConfig: p.join(clientPkgDir, '.dart_tool/package_config.json'),
196+
workingDirectory: clientPkgDir,
197+
);
198+
await validateTest(test);
199+
expect(File(lcovFile).readAsStringSync(), '''
200+
SF:${p.join(clientPkgDir, 'lib', 'calculate.dart')}
201+
DA:3,1
202+
DA:4,1
203+
LF:2
204+
LH:2
205+
end_of_record
206+
SF:${p.join(pkgDir, 'lib', 'calculate.dart')}
134207
DA:1,1
135208
DA:2,2
136209
DA:3,1
@@ -142,14 +215,18 @@ end_of_record
142215
});
143216

144217
test('gathers coverage for Chrome tests', () async {
145-
await (await runPub(['get'])).shouldExit(0);
146-
var test = await runTest([
147-
'--coverage',
148-
coverageDirectory.path,
149-
'test/test.dart',
150-
'-p',
151-
'chrome',
152-
], packageConfig: p.join(d.sandbox, '.dart_tool/package_config.json'));
218+
await (await runPub(['get'], workingDirectory: pkgDir)).shouldExit(0);
219+
var test = await runTest(
220+
[
221+
'--coverage',
222+
coverageDirectory.path,
223+
'test/test.dart',
224+
'-p',
225+
'chrome',
226+
],
227+
packageConfig: p.join(pkgDir, '.dart_tool/package_config.json'),
228+
workingDirectory: pkgDir,
229+
);
153230
await validateCoverage(test, 'test/test.dart.chrome.json');
154231
});
155232

pkgs/test/test/runner/runner_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ $_runtimeCompilers
9696
Implies --debug.
9797
--branch-coverage Include branch coverage information in the coverage report.
9898
Must be paired with --coverage or --coverage-path.
99+
--coverage-package=<regexp> A regular expression matching packages names to include in
100+
the coverage report (if coverage is enabled). If unset,
101+
matches the current package name.
99102
--[no-]chain-stack-traces Use chained stack traces to provide greater exception details
100103
especially for asynchronous code. It may be useful to disable
101104
to provide improved test performance but at the cost of

pkgs/test/test/utils.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ Configuration configuration({
226226
String? coverage,
227227
String? coverageLcov,
228228
bool? branchCoverage,
229+
List<RegExp>? coveragePackages,
229230
int? concurrency,
230231
int? shardIndex,
231232
int? totalShards,
@@ -278,6 +279,7 @@ Configuration configuration({
278279
coverage: coverage,
279280
coverageLcov: coverageLcov,
280281
branchCoverage: branchCoverage,
282+
coveragePackages: coveragePackages,
281283
concurrency: concurrency,
282284
shardIndex: shardIndex,
283285
totalShards: totalShards,

pkgs/test_core/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 0.6.15-wip
2+
3+
* Add `--coverage-package` flag, which filters the coverage report to specific
4+
packages using RegExps.
5+
16
## 0.6.14
27

38
* Fix type cast when parsing a `null` hit map.

0 commit comments

Comments
 (0)