test: DRY up parsing and validating coverage JSON
diff --git a/test/collect_coverage_api_test.dart b/test/collect_coverage_api_test.dart
index 9fa1c0a..9046d29 100644
--- a/test/collect_coverage_api_test.dart
+++ b/test/collect_coverage_api_test.dart
@@ -18,11 +18,7 @@
 
 void main() {
   test('collect_coverage_api', () async {
-    final json = await _collectCoverage();
-    expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
-    expect(json, containsPair('type', 'CodeCoverage'));
-
-    final coverage = json['coverage'] as List;
+    final coverage = coverageDataFromJson(await _collectCoverage());
     expect(coverage, isNotEmpty);
 
     final sources = coverage.sources();
@@ -37,12 +33,9 @@
   });
 
   test('collect_coverage_api with scoped output', () async {
-    final json =
-        await _collectCoverage(scopedOutput: <String>{}..add('coverage'));
-    expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
-    expect(json, containsPair('type', 'CodeCoverage'));
-
-    final coverage = json['coverage'] as List;
+    final coverage = coverageDataFromJson(
+      await _collectCoverage(scopedOutput: <String>{}..add('coverage')),
+    );
     expect(coverage, isNotEmpty);
 
     final sources = coverage.sources();
@@ -54,20 +47,14 @@
   });
 
   test('collect_coverage_api with isolateIds', () async {
-    final json = await _collectCoverage(isolateIds: true);
-    expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
-    expect(json, containsPair('type', 'CodeCoverage'));
-
-    final coverage = json['coverage'] as List<Map<String, dynamic>>;
+    final coverage =
+        coverageDataFromJson(await _collectCoverage(isolateIds: true));
     expect(coverage, isEmpty);
   });
 
   test('collect_coverage_api with function coverage', () async {
-    final json = await _collectCoverage(functionCoverage: true);
-    expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
-    expect(json, containsPair('type', 'CodeCoverage'));
-
-    final coverage = json['coverage'] as List;
+    final coverage =
+        coverageDataFromJson(await _collectCoverage(functionCoverage: true));
     expect(coverage, isNotEmpty);
 
     final sources = coverage.sources();
@@ -84,11 +71,8 @@
   });
 
   test('collect_coverage_api with branch coverage', () async {
-    final json = await _collectCoverage(branchCoverage: true);
-    expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
-    expect(json, containsPair('type', 'CodeCoverage'));
-
-    final coverage = json['coverage'] as List;
+    final coverage =
+        coverageDataFromJson(await _collectCoverage(branchCoverage: true));
     expect(coverage, isNotEmpty);
 
     final sources = coverage.sources();
diff --git a/test/collect_coverage_test.dart b/test/collect_coverage_test.dart
index cc3c84f..3840768 100644
--- a/test/collect_coverage_test.dart
+++ b/test/collect_coverage_test.dart
@@ -26,12 +26,9 @@
     final resultString = await _getCoverageResult();
 
     // analyze the output json
-    final jsonResult = json.decode(resultString) as Map<String, dynamic>;
+    final coverage =
+        coverageDataFromJson(json.decode(resultString) as Map<String, dynamic>);
 
-    expect(jsonResult.keys, unorderedEquals(<String>['type', 'coverage']));
-    expect(jsonResult, containsPair('type', 'CodeCoverage'));
-
-    final coverage = jsonResult['coverage'] as List;
     expect(coverage, isNotEmpty);
 
     final sources = coverage.sources();
diff --git a/test/run_and_collect_test.dart b/test/run_and_collect_test.dart
index 4e2cb49..8a5a63e 100644
--- a/test/run_and_collect_test.dart
+++ b/test/run_and_collect_test.dart
@@ -16,11 +16,7 @@
 void main() {
   test('runAndCollect', () async {
     // use runAndCollect and verify that the results match w/ running manually
-    final json = await runAndCollect(testAppPath);
-    expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
-    expect(json, containsPair('type', 'CodeCoverage'));
-
-    final coverage = json['coverage'] as List<Map<String, dynamic>>;
+    final coverage = coverageDataFromJson(await runAndCollect(testAppPath));
     expect(coverage, isNotEmpty);
 
     final sources = coverage.sources();
diff --git a/test/test_util.dart b/test/test_util.dart
index 9274f63..2e5dd90 100644
--- a/test/test_util.dart
+++ b/test/test_util.dart
@@ -6,6 +6,7 @@
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
 import 'package:test_process/test_process.dart';
 
 final String testAppPath = p.join('test', 'test_files', 'test_app.dart');
@@ -23,6 +24,13 @@
       ],
     );
 
+List<Map<String, dynamic>> coverageDataFromJson(Map<String, dynamic> json) {
+  expect(json.keys, unorderedEquals(<String>['type', 'coverage']));
+  expect(json, containsPair('type', 'CodeCoverage'));
+
+  return (json['coverage'] as List).cast<Map<String, dynamic>>();
+}
+
 final _versionPattern = RegExp('([0-9]+)\\.([0-9]+)\\.([0-9]+)');
 bool platformVersionCheck(int minMajor, int minMinor) {
   final match = _versionPattern.matchAsPrefix(Platform.version);