Skip to content

Commit a3944f7

Browse files
authored
testing: add data for test failures (microsoft#209883)
* testing: add data for test failures * fixup test
1 parent 4ba3d65 commit a3944f7

File tree

5 files changed

+35
-9
lines changed

5 files changed

+35
-9
lines changed

src/vs/workbench/contrib/testing/common/testResult.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { IObservable, observableValue } from 'vs/base/common/observable';
1212
import { language } from 'vs/base/common/platform';
1313
import { WellDefinedPrefixTree } from 'vs/base/common/prefixTree';
1414
import { localize } from 'vs/nls';
15+
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
1516
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
1617
import { IComputedStateAccessor, refreshComputedState } from 'vs/workbench/contrib/testing/common/getComputedState';
1718
import { TestCoverage } from 'vs/workbench/contrib/testing/common/testCoverage';
@@ -334,6 +335,7 @@ export class LiveTestResult extends Disposable implements ITestResult {
334335
public readonly id: string,
335336
public readonly persist: boolean,
336337
public readonly request: ResolvedTestRunRequest,
338+
@ITelemetryService private readonly telemetry: ITelemetryService,
337339
) {
338340
super();
339341
}
@@ -481,6 +483,21 @@ export class LiveTestResult extends Disposable implements ITestResult {
481483

482484
this._completedAt = Date.now();
483485
this.completeEmitter.fire();
486+
487+
this.telemetry.publicLog2<
488+
{ failures: number; passes: number; controller: string },
489+
{
490+
owner: 'connor4312';
491+
comment: 'Test outcome metrics. This helps us understand magnitude of feature use and how to build fix suggestions.';
492+
failures: { comment: 'Number of test failures'; classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
493+
passes: { comment: 'Number of test failures'; classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
494+
controller: { comment: 'The test controller being used'; classification: 'SystemMetaData'; purpose: 'FeatureInsight' };
495+
}
496+
>('test.outcomes', {
497+
failures: this.counts[TestResultState.Errored] + this.counts[TestResultState.Failed],
498+
passes: this.counts[TestResultState.Passed],
499+
controller: this.request.targets.map(t => t.controllerId).join(',')
500+
});
484501
}
485502

486503
/**

src/vs/workbench/contrib/testing/common/testResultService.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Disposable, DisposableStore, dispose, toDisposable } from 'vs/base/comm
1111
import { generateUuid } from 'vs/base/common/uuid';
1212
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1313
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
14+
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
1415
import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingContextKeys';
1516
import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService';
1617
import { ITestResult, LiveTestResult, TestResultItemChange, TestResultItemChangeReason } from 'vs/workbench/contrib/testing/common/testResult';
@@ -110,6 +111,7 @@ export class TestResultService extends Disposable implements ITestResultService
110111
@IContextKeyService contextKeyService: IContextKeyService,
111112
@ITestResultStorage private readonly storage: ITestResultStorage,
112113
@ITestProfileService private readonly testProfiles: ITestProfileService,
114+
@ITelemetryService private readonly telemetryService: ITelemetryService,
113115
) {
114116
super();
115117
this._register(toDisposable(() => dispose(this._resultsDisposables)));
@@ -137,7 +139,7 @@ export class TestResultService extends Disposable implements ITestResultService
137139
public createLiveResult(req: ResolvedTestRunRequest | ExtensionRunTestsRequest) {
138140
if ('targets' in req) {
139141
const id = generateUuid();
140-
return this.push(new LiveTestResult(id, true, req));
142+
return this.push(new LiveTestResult(id, true, req, this.telemetryService));
141143
}
142144

143145
let profile: ITestRunProfile | undefined;
@@ -162,7 +164,7 @@ export class TestResultService extends Disposable implements ITestResultService
162164
});
163165
}
164166

165-
return this.push(new LiveTestResult(req.id, req.persist, resolved));
167+
return this.push(new LiveTestResult(req.id, req.persist, resolved, this.telemetryService));
166168
}
167169

168170
/**

src/vs/workbench/contrib/testing/common/testServiceImpl.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,28 @@ import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cance
88
import { Emitter } from 'vs/base/common/event';
99
import { Iterable } from 'vs/base/common/iterator';
1010
import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
11+
import { isDefined } from 'vs/base/common/types';
1112
import { localize } from 'vs/nls';
13+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1214
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
1315
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1416
import { INotificationService } from 'vs/platform/notification/common/notification';
1517
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
18+
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
1619
import { IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust';
20+
import { getTestingConfiguration, TestingConfigKeys } from 'vs/workbench/contrib/testing/common/configuration';
1721
import { MainThreadTestCollection } from 'vs/workbench/contrib/testing/common/mainThreadTestCollection';
1822
import { MutableObservableValue } from 'vs/workbench/contrib/testing/common/observableValue';
1923
import { StoredValue } from 'vs/workbench/contrib/testing/common/storedValue';
20-
import { ResolvedTestRunRequest, TestDiffOpType, TestsDiff } from 'vs/workbench/contrib/testing/common/testTypes';
2124
import { TestExclusions } from 'vs/workbench/contrib/testing/common/testExclusions';
2225
import { TestId } from 'vs/workbench/contrib/testing/common/testId';
2326
import { TestingContextKeys } from 'vs/workbench/contrib/testing/common/testingContextKeys';
2427
import { canUseProfileWithTest, ITestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService';
2528
import { ITestResult } from 'vs/workbench/contrib/testing/common/testResult';
2629
import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService';
2730
import { AmbiguousRunTestsRequest, IMainThreadTestController, ITestService } from 'vs/workbench/contrib/testing/common/testService';
31+
import { ResolvedTestRunRequest, TestDiffOpType, TestsDiff } from 'vs/workbench/contrib/testing/common/testTypes';
2832
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
29-
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
30-
import { getTestingConfiguration, TestingConfigKeys } from 'vs/workbench/contrib/testing/common/configuration';
31-
import { isDefined } from 'vs/base/common/types';
32-
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
3333

3434
export class TestService extends Disposable implements ITestService {
3535
declare readonly _serviceBrand: undefined;

src/vs/workbench/contrib/testing/test/common/testResultService.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { CancellationTokenSource } from 'vs/base/common/cancellation';
1010
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
1111
import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService';
1212
import { NullLogService } from 'vs/platform/log/common/log';
13+
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
1314
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
1415
import { TestId } from 'vs/workbench/contrib/testing/common/testId';
1516
import { TestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService';
@@ -45,7 +46,7 @@ suite('Workbench - Test Results Service', () => {
4546
persist: boolean,
4647
request: ResolvedTestRunRequest,
4748
) {
48-
super(id, persist, request);
49+
super(id, persist, request, NullTelemetryService);
4950
ds.add(this);
5051
}
5152

@@ -217,6 +218,7 @@ suite('Workbench - Test Results Service', () => {
217218
new MockContextKeyService(),
218219
storage,
219220
ds.add(new TestProfileService(new MockContextKeyService(), ds.add(new TestStorageService()))),
221+
NullTelemetryService,
220222
));
221223
});
222224

@@ -235,6 +237,7 @@ suite('Workbench - Test Results Service', () => {
235237
new MockContextKeyService(),
236238
storage,
237239
ds.add(new TestProfileService(new MockContextKeyService(), ds.add(new TestStorageService()))),
240+
NullTelemetryService,
238241
));
239242

240243
assert.strictEqual(0, results.results.length);
@@ -260,6 +263,7 @@ suite('Workbench - Test Results Service', () => {
260263
'',
261264
false,
262265
defaultOpts([]),
266+
NullTelemetryService,
263267
));
264268
results.clear();
265269

@@ -272,6 +276,7 @@ suite('Workbench - Test Results Service', () => {
272276
'',
273277
false,
274278
defaultOpts([]),
279+
NullTelemetryService,
275280
));
276281

277282
assert.deepStrictEqual(results.results, [r2, r]);

src/vs/workbench/contrib/testing/test/common/testResultStorage.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { range } from 'vs/base/common/arrays';
88
import { DisposableStore } from 'vs/base/common/lifecycle';
99
import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils';
1010
import { NullLogService } from 'vs/platform/log/common/log';
11+
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
1112
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
1213
import { ITestResult, LiveTestResult } from 'vs/workbench/contrib/testing/common/testResult';
1314
import { InMemoryResultStorage, RETAIN_MAX_RESULTS } from 'vs/workbench/contrib/testing/common/testResultStorage';
@@ -22,7 +23,8 @@ suite('Workbench - Test Result Storage', () => {
2223
const t = ds.add(new LiveTestResult(
2324
'',
2425
true,
25-
{ targets: [] }
26+
{ targets: [] },
27+
NullTelemetryService,
2628
));
2729

2830
t.addTask({ id: taskName, name: undefined, running: true });

0 commit comments

Comments
 (0)