パルカワ2

最近はFlutterをやっています

flutter test --coverageが遅い

 $ flutter --version
Flutter 2.5.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ffb2ecea52 (9 weeks ago) • 2021-09-17 15:26:33 -0400
Engine • revision b3af521a05
Tools • Dart 2.14.2

原因

github.com

一時的な対応

github.com

根本対応

Flutterのmasterには対応が入ってるっぽい

github.com

じぶんはどうしたか

stableから変更したくなかったので一時的な対応を行った。こういうスクリプトを書いてcoverageを取得したい時にscriptを実行して作成されたファイルを実行するようにした。

import 'dart:io';

Future<void> main() async {
  final dir = Directory('test');
  final files = <File>[];
  await for (final file in dir.list(recursive: true)) {
    if (file is File && file.path.contains('_test.dart')) {
      files.add(file);
    }
  }

  files.sort((a, b) => a.path.compareTo(b.path));

  final imports = files.map((file) {
    final basename = file.path.split('/').last;
    final name = basename.replaceAll('.dart', '');
    // ignore: prefer_single_quotes
    return """
import '${file.path.replaceFirst('test/', '')}' as $name;
""";
  }).join('');

  final tests = files.map((file) {
    final name = file.path.split('/').last.replaceAll('.dart', '');
    return '''
  group(
    '$name',
    $name.main,
  );
''';
  }).join('');

  final body = """
import 'package:test/test.dart';
$imports
void main() {
$tests
}
""";

  final testFile = File('test/coverage.dart');
  await testFile.writeAsString(body);
}
dart test/generate_coverage_testfile.dart
flutter test --coverage test/coverage.dart

coverageを実行するのに17分ほどかかっていたのが1分で終わるようになった。すごい。