Flutter: встроенное тестовое покрытие в Android Studio - PullRequest
0 голосов
/ 15 февраля 2019

Я разрабатываю Android-приложение с открытым исходным кодом во Flutter, используя Android Studio 3.3.1 (в Window и Ubuntu).Источник доступен на Github .

. В проекте имеется тестовый файл, который генерирует данные покрытия, которые можно просматривать с помощью таких инструментов, как Coveralls .Это указывает на то, что данные LCOV содержат значимые данные.

Я хочу использовать встроенный просмотр кода, как и другие инструменты Jetbrains.Конфигурация прогона в категории «Тест флаттера» правильно распознает мои тесты и способна их правильно запустить.

Однако опция «Запуск с покрытием» отключена.Я пробовал разные конфигурации запуска, такие как Android JUnit, но безрезультатно.

Я знаю, что могу вручную создать данные покрытия, но моя цель - автоматизировать генерацию данных покрытия и показывать покрытие в строке (точно так же, как это делает Coveralls).

Кто-нибудь знает, какая конфигурация запуска, если таковая имеется, достигает этой цели?

В качестве примечания, я недавно переключился на Codemagic как инструмент CI, так что данные покрытияна Coveralls устарела, но тот факт, что данные LCOV значимы, все еще остается в силе.Я также пробовал аналогичные настройки в Intellij, но результат такой же, как в Android Studio.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

По какой-то причине (по крайней мере для меня) опция «Запуск с покрытием» в Android Studio включена только для интеграционных тестов Flutter.

Я написал статью, в которой описывается, как создавать отчеты о покрытии кода локально ина CodeCov и CoverAlls, которые должны приблизить вас к тому, что вы хотите сделать.Включает весь исходный код и показывает примеры в реальном времени.

Работает как для пакетов flutter, так и для дротиков.

Вы можете найти его здесь: https://medium.com/@nocnoc/combined-code-coverage-for-flutter-and-dart-237b9563ecf8

0 голосов
/ 15 февраля 2019

Я не думаю, что пока поддерживается для проектов Flutter.

У меня есть весь не-пользовательский код в другом чистом пакете Dart, который я добавляю в качестве зависимости к проекту Flutter.

Для моего проекта это также имеет то преимущество, что код, которым я могу поделиться с GUI браузера (Angular Dart), отделен и не может быть случайно загрязнен зависимостями Flutter, которые могут нарушить веб-проект.

В этом проекте я могу получить информацию о покрытии в IntellJ, если я выполню следующие действия:

Вам нужна конфигурация запуска IntelliJ "Dart Command Line App" вместо "Dart Test", "Flutter" или "Flutter Test "запустить конфигурацию.

Чтобы иметь возможность запускать тесты с конфигурацией запуска" Dart Command Line App ", вам, вероятно, нужен установленный Dart SDK и выберите его в меню" Настройки ">" Языки и рамки "> Dart> Dart SDK.путь.

Чтобы запустить все тесты с покрытием вместо отдельных файлов, вам понадобится файл типа

test/all.dart

// ignore_for_file: await_only_futures

import 'dart:async';

import 'client/controller/app_controller_test.dart' as i0;
import 'client/controller/authentication_controller_test.dart' as i1;
import 'client/controller/backoffice/backoffice_controller_test.dart' as i2;
import 'client/controller/backoffice/image_reference_controller_test.dart'
    as i3;
...

Future<void> main() async {
  i0.main();
  i1.main();
  i2.main();
...
} 

с записью для каждого файла теста.

Я использую задачу Grinder, как показано ниже, для автоматического создания этого файла

import 'package:path/path.dart' as path;
...
/// Generate a single Dart file that executes all tests.
/// Dart code coverage reporting still requires that.
@Task('generate test/all.dart')
Future<void> prepareCoverage() async {
  final testDir = Directory('test');
  final context = path.Context(style: path.Style.posix);
  final testFiles = testDir
      .listSync(recursive: true, followLinks: false)
      .where((e) =>
          FileSystemEntity.isFileSync(e.path) && e.path.endsWith('_test.dart'))
      .map(
          (tf) => context.normalize(path.relative(tf.path, from: testDir.path)))
      .toList()
        ..sort();
  final content = StringBuffer('''
// ignore_for_file: await_only_futures

import 'dart:async';

''');
  final executions = StringBuffer();
  for (var i = 0; i < testFiles.length; i++) {
    final testFile = testFiles[i];
    content.writeln("import '$testFile' as i$i;");
    executions.writeln('  i$i.main();');
  }
  content
    ..writeln('Future<void> main() async {')
    ..writeln()
    ..writeln(executions)
    ..writeln('}');
  File('test/all.dart').writeAsStringSync(content.toString());
  PubApp.global('dart_style')
      .run(['-w', '--fix']..add('test/all.dart'), script: 'format');
}
...