diff --git a/pkgs/test/test/runner/parse_metadata_test.dart b/pkgs/test/test/runner/parse_metadata_test.dart
index 21066c1..aa10b7c 100644
--- a/pkgs/test/test/runner/parse_metadata_test.dart
+++ b/pkgs/test/test/runner/parse_metadata_test.dart
@@ -3,77 +3,65 @@
 // BSD-style license that can be found in the LICENSE file.
 
 @TestOn('vm')
-import 'dart:io';
-
-import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 import 'package:test_api/src/backend/platform_selector.dart';
 import 'package:test_api/src/backend/runtime.dart';
 import 'package:test_api/src/backend/suite_platform.dart';
 import 'package:test_core/src/runner/parse_metadata.dart';
 
-import 'package:test_core/src/util/io.dart';
-
-String _sandbox;
-String _path;
+final _path = 'test.dart';
 
 void main() {
-  setUp(() {
-    _sandbox = createTempDir();
-    _path = p.join(_sandbox, 'test.dart');
-  });
-
-  tearDown(() {
-    Directory(_sandbox).deleteSync(recursive: true);
-  });
-
   test('returns empty metadata for an empty file', () {
-    File(_path).writeAsStringSync('');
-    var metadata = parseMetadata(_path, Set());
+    var metadata = parseMetadata(_path, '', Set());
     expect(metadata.testOn, equals(PlatformSelector.all));
     expect(metadata.timeout.scaleFactor, equals(1));
   });
 
   test('ignores irrelevant annotations', () {
-    File(_path).writeAsStringSync('@Fblthp\n@Fblthp.foo\nlibrary foo;');
-    var metadata = parseMetadata(_path, Set());
+    var metadata =
+        parseMetadata(_path, '@Fblthp\n@Fblthp.foo\nlibrary foo;', Set());
     expect(metadata.testOn, equals(PlatformSelector.all));
   });
 
   test('parses a prefixed annotation', () {
-    File(_path).writeAsStringSync("@foo.TestOn('vm')\n"
-        "import 'package:test/test.dart' as foo;");
-    var metadata = parseMetadata(_path, Set());
+    var metadata = parseMetadata(
+        _path,
+        "@foo.TestOn('vm')\n"
+        "import 'package:test/test.dart' as foo;",
+        Set());
     expect(metadata.testOn.evaluate(SuitePlatform(Runtime.vm)), isTrue);
     expect(metadata.testOn.evaluate(SuitePlatform(Runtime.chrome)), isFalse);
   });
 
   group('@TestOn:', () {
     test('parses a valid annotation', () {
-      File(_path).writeAsStringSync("@TestOn('vm')\nlibrary foo;");
-      var metadata = parseMetadata(_path, Set());
+      var metadata = parseMetadata(_path, "@TestOn('vm')\nlibrary foo;", Set());
       expect(metadata.testOn.evaluate(SuitePlatform(Runtime.vm)), isTrue);
       expect(metadata.testOn.evaluate(SuitePlatform(Runtime.chrome)), isFalse);
     });
 
     test('ignores a constructor named TestOn', () {
-      File(_path).writeAsStringSync("@foo.TestOn('foo')\nlibrary foo;");
-      var metadata = parseMetadata(_path, Set());
+      var metadata =
+          parseMetadata(_path, "@foo.TestOn('foo')\nlibrary foo;", Set());
       expect(metadata.testOn, equals(PlatformSelector.all));
     });
 
     group('throws an error for', () {
       test('multiple @TestOns', () {
-        File(_path)
-            .writeAsStringSync("@TestOn('foo')\n@TestOn('bar')\nlibrary foo;");
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(
+                _path, "@TestOn('foo')\n@TestOn('bar')\nlibrary foo;", Set()),
+            throwsFormatException);
       });
     });
   });
 
   group('@Timeout:', () {
     test('parses a valid duration annotation', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @Timeout(const Duration(
     hours: 1,
     minutes: 2,
@@ -82,8 +70,8 @@
     microseconds: 5))
 
 library foo;
-''');
-      var metadata = parseMetadata(_path, Set());
+''',
+          Set());
       expect(
           metadata.timeout.duration,
           equals(Duration(
@@ -95,7 +83,9 @@
     });
 
     test('parses a valid duration omitting const', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @Timeout(Duration(
     hours: 1,
     minutes: 2,
@@ -104,8 +94,8 @@
     microseconds: 5))
 
 library foo;
-''');
-      var metadata = parseMetadata(_path, Set());
+''',
+          Set());
       expect(
           metadata.timeout.duration,
           equals(Duration(
@@ -117,7 +107,9 @@
     });
 
     test('parses a valid duration with an import prefix', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @Timeout(core.Duration(
     hours: 1,
     minutes: 2,
@@ -125,8 +117,8 @@
     milliseconds: 4,
     microseconds: 5))
 import 'dart:core' as core;
-''');
-      var metadata = parseMetadata(_path, Set());
+''',
+          Set());
       expect(
           metadata.timeout.duration,
           equals(Duration(
@@ -138,126 +130,138 @@
     });
 
     test('parses a valid int factor annotation', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @Timeout.factor(1)
 
 library foo;
-''');
-      var metadata = parseMetadata(_path, Set());
+''',
+          Set());
       expect(metadata.timeout.scaleFactor, equals(1));
     });
 
     test('parses a valid int factor annotation with an import prefix', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @test.Timeout.factor(1)
 import 'package:test/test.dart' as test;
-''');
-      var metadata = parseMetadata(_path, Set());
+''',
+          Set());
       expect(metadata.timeout.scaleFactor, equals(1));
     });
 
     test('parses a valid double factor annotation', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @Timeout.factor(0.5)
 
 library foo;
-''');
-      var metadata = parseMetadata(_path, Set());
+''',
+          Set());
       expect(metadata.timeout.scaleFactor, equals(0.5));
     });
 
     test('parses a valid Timeout.none annotation', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @Timeout.none
 
 library foo;
-''');
-      var metadata = parseMetadata(_path, Set());
+''',
+          Set());
       expect(metadata.timeout, same(Timeout.none));
     });
 
     test('ignores a constructor named Timeout', () {
-      File(_path).writeAsStringSync("@foo.Timeout('foo')\nlibrary foo;");
-      var metadata = parseMetadata(_path, Set());
+      var metadata =
+          parseMetadata(_path, "@foo.Timeout('foo')\nlibrary foo;", Set());
       expect(metadata.timeout.scaleFactor, equals(1));
     });
 
     group('throws an error for', () {
       test('multiple @Timeouts', () {
-        File(_path).writeAsStringSync(
-            '@Timeout.factor(1)\n@Timeout.factor(2)\nlibrary foo;');
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(_path,
+                '@Timeout.factor(1)\n@Timeout.factor(2)\nlibrary foo;', Set()),
+            throwsFormatException);
       });
     });
   });
 
   group('@Skip:', () {
     test('parses a valid annotation', () {
-      File(_path).writeAsStringSync('@Skip()\nlibrary foo;');
-      var metadata = parseMetadata(_path, Set());
+      var metadata = parseMetadata(_path, '@Skip()\nlibrary foo;', Set());
       expect(metadata.skip, isTrue);
       expect(metadata.skipReason, isNull);
     });
 
     test('parses a valid annotation with a reason', () {
-      File(_path).writeAsStringSync("@Skip('reason')\nlibrary foo;");
-      var metadata = parseMetadata(_path, Set());
+      var metadata =
+          parseMetadata(_path, "@Skip('reason')\nlibrary foo;", Set());
       expect(metadata.skip, isTrue);
       expect(metadata.skipReason, equals('reason'));
     });
 
     test('ignores a constructor named Skip', () {
-      File(_path).writeAsStringSync("@foo.Skip('foo')\nlibrary foo;");
-      var metadata = parseMetadata(_path, Set());
+      var metadata =
+          parseMetadata(_path, "@foo.Skip('foo')\nlibrary foo;", Set());
       expect(metadata.skip, isFalse);
     });
 
     group('throws an error for', () {
       test('multiple @Skips', () {
-        File(_path)
-            .writeAsStringSync("@Skip('foo')\n@Skip('bar')\nlibrary foo;");
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(
+                _path, "@Skip('foo')\n@Skip('bar')\nlibrary foo;", Set()),
+            throwsFormatException);
       });
     });
   });
 
   group('@Tags:', () {
     test('parses a valid annotation', () {
-      File(_path).writeAsStringSync("@Tags(['a'])\nlibrary foo;");
-      var metadata = parseMetadata(_path, Set());
+      var metadata = parseMetadata(_path, "@Tags(['a'])\nlibrary foo;", Set());
       expect(metadata.tags, equals(['a']));
     });
 
     test('ignores a constructor named Tags', () {
-      File(_path).writeAsStringSync("@foo.Tags(['a'])\nlibrary foo;");
-      var metadata = parseMetadata(_path, Set());
+      var metadata =
+          parseMetadata(_path, "@foo.Tags(['a'])\nlibrary foo;", Set());
       expect(metadata.tags, isEmpty);
     });
 
     group('throws an error for', () {
       test('multiple @Tags', () {
-        File(_path)
-            .writeAsStringSync("@Tags(['a'])\n@Tags(['b'])\nlibrary foo;");
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(
+                _path, "@Tags(['a'])\n@Tags(['b'])\nlibrary foo;", Set()),
+            throwsFormatException);
       });
 
       test('String interpolation', () {
-        File(_path)
-            .writeAsStringSync("@Tags(['\$a'])\nlibrary foo;\nconst a = 'a';");
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(
+                _path, "@Tags(['\$a'])\nlibrary foo;\nconst a = 'a';", Set()),
+            throwsFormatException);
       });
     });
   });
 
   group('@OnPlatform:', () {
     test('parses a valid annotation', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @OnPlatform({
   'chrome': Timeout.factor(2),
   'vm': [Skip(), Timeout.factor(3)]
 })
-library foo;''');
-      var metadata = parseMetadata(_path, Set());
+library foo;''',
+          Set());
 
       var key = metadata.onPlatform.keys.first;
       expect(key.evaluate(SuitePlatform(Runtime.chrome)), isTrue);
@@ -274,14 +278,16 @@
     });
 
     test('parses a valid annotation with an import prefix', () {
-      File(_path).writeAsStringSync('''
+      var metadata = parseMetadata(
+          _path,
+          '''
 @test.OnPlatform({
   'chrome': test.Timeout.factor(2),
   'vm': [test.Skip(), test.Timeout.factor(3)]
 })
 import 'package:test/test.dart' as test;
-''');
-      var metadata = parseMetadata(_path, Set());
+''',
+          Set());
 
       var key = metadata.onPlatform.keys.first;
       expect(key.evaluate(SuitePlatform(Runtime.chrome)), isTrue);
@@ -298,34 +304,40 @@
     });
 
     test('ignores a constructor named OnPlatform', () {
-      File(_path).writeAsStringSync("@foo.OnPlatform('foo')\nlibrary foo;");
-      var metadata = parseMetadata(_path, Set());
+      var metadata =
+          parseMetadata(_path, "@foo.OnPlatform('foo')\nlibrary foo;", Set());
       expect(metadata.testOn, equals(PlatformSelector.all));
     });
 
     group('throws an error for', () {
       test('a map with a unparseable key', () {
-        File(_path).writeAsStringSync(
-            "@OnPlatform({'invalid': Skip()})\nlibrary foo;");
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(
+                _path, "@OnPlatform({'invalid': Skip()})\nlibrary foo;", Set()),
+            throwsFormatException);
       });
 
       test("a map with an invalid value", () {
-        File(_path).writeAsStringSync(
-            "@OnPlatform({'vm': const TestOn('vm')})\nlibrary foo;");
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(_path,
+                "@OnPlatform({'vm': const TestOn('vm')})\nlibrary foo;", Set()),
+            throwsFormatException);
       });
 
       test('a map with an invalid value in a list', () {
-        File(_path).writeAsStringSync(
-            "@OnPlatform({'vm': [const TestOn('vm')]})\nlibrary foo;");
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(
+                _path,
+                "@OnPlatform({'vm': [const TestOn('vm')]})\nlibrary foo;",
+                Set()),
+            throwsFormatException);
       });
 
       test('multiple @OnPlatforms', () {
-        File(_path).writeAsStringSync(
-            '@OnPlatform({})\n@OnPlatform({})\nlibrary foo;');
-        expect(() => parseMetadata(_path, Set()), throwsFormatException);
+        expect(
+            () => parseMetadata(
+                _path, '@OnPlatform({})\n@OnPlatform({})\nlibrary foo;', Set()),
+            throwsFormatException);
       });
     });
   });
diff --git a/pkgs/test_core/lib/src/runner/loader.dart b/pkgs/test_core/lib/src/runner/loader.dart
index 1ea3693..74fe5f2 100644
--- a/pkgs/test_core/lib/src/runner/loader.dart
+++ b/pkgs/test_core/lib/src/runner/loader.dart
@@ -168,7 +168,8 @@
       String path, SuiteConfiguration suiteConfig) async* {
     try {
       suiteConfig = suiteConfig.merge(SuiteConfiguration.fromMetadata(
-          parseMetadata(path, _runtimeVariables.toSet())));
+          parseMetadata(
+              path, File(path).readAsStringSync(), _runtimeVariables.toSet())));
     } on AnalyzerErrorGroup catch (_) {
       // Ignore the analyzer's error, since its formatting is much worse than
       // the VM's or dart2js's.
diff --git a/pkgs/test_core/lib/src/runner/parse_metadata.dart b/pkgs/test_core/lib/src/runner/parse_metadata.dart
index 7654de5..90946a1 100644
--- a/pkgs/test_core/lib/src/runner/parse_metadata.dart
+++ b/pkgs/test_core/lib/src/runner/parse_metadata.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
-
 // ignore: deprecated_member_use
 import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
@@ -16,7 +14,7 @@
 import 'package:test_api/src/utils.dart'; // ignore: implementation_imports
 import '../util/dart.dart';
 
-/// Parse the test metadata for the test file at [path].
+/// Parse the test metadata for the test file at [path] with [contents].
 ///
 /// The [platformVariables] are the set of variables that are valid for platform
 /// selectors in suite metadata, in addition to the built-in variables that are
@@ -24,11 +22,9 @@
 ///
 /// Throws an [AnalysisError] if parsing fails or a [FormatException] if the
 /// test annotations are incorrect.
-///
-/// If [contents] is `null` then it will be read as a [File] using [path].
-Metadata parseMetadata(String path, Set<String> platformVariables,
-        {String contents}) =>
-    _Parser(path, platformVariables, contents: contents).parse();
+Metadata parseMetadata(
+        String path, String contents, Set<String> platformVariables) =>
+    _Parser(path, contents, platformVariables).parse();
 
 /// A parser for test suite metadata.
 class _Parser {
@@ -48,10 +44,8 @@
   /// The actual contents of the file.
   String _contents;
 
-  _Parser(String path, this._platformVariables, {String contents})
-      : _path = path,
-        _contents = contents ?? File(path).readAsStringSync() {
-    var directives = parseDirectives(_contents, name: path).directives;
+  _Parser(this._path, this._contents, this._platformVariables) {
+    var directives = parseDirectives(_contents, name: _path).directives;
     _annotations = directives.isEmpty ? [] : directives.first.metadata;
 
     // We explicitly *don't* just look for "package:test" imports here,
