Как передать переменную среды в тест флаттера

Я хочу передать переменную среды flutter drive тестовое задание.

Иметь возможность прочитать значение в запущенном приложении или тестовом коде было бы хорошо, потому что мне нужно это в приложении, и если бы я мог получить его только в тестовом коде, я мог бы передать его приложению, используя driver.requestData()

Например, Трэвис позволяет мне указывать переменные среды, которые не раскрываются каким-либо образом (например, содержимое скрипта и вывод журнала).

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

Задание переменных среды во Flutter - аналогичный вопрос, но для моего варианта использования это кажется слишком сложным.

2 ответа

Решение

Я пытался использовать Дартс Platform.environment читать в переменных env, прежде чем запускать тесты драйверов, и это, кажется, работает нормально. Ниже приведен простой пример, который устанавливает выходной каталог для итоговых тестов, используя FLUTTER_DRIVER_RESULTS переменная env.

import 'dart:async';
import 'dart:io' show Platform;

import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';

void main() {
  // Load environmental variables
  String resultsDirectory =
    Platform.environment['FLUTTER_DRIVER_RESULTS'] ?? '/tmp';
  print('Results directory is $resultsDirectory');

  group('increment button test', () {
    FlutterDriver driver;

    setUpAll(() async {
      // Connect to the app
      driver = await FlutterDriver.connect();
    });

    tearDownAll(() async {
      if (driver != null) {
        // Disconnect from the app
        driver.close();
      }
    });

    test('measure', () async {
      // Record the performance timeline of things that happen
      Timeline timeline = await driver.traceAction(() async {
        // Find the scrollable user list
        SerializableFinder incrementButton = find.byValueKey(
            'increment_button');

        // Click the button 10 times
        for (int i = 0; i < 10; i++) {
          await driver.tap(incrementButton);

          // Emulate time for a user's finger between taps
          await new Future<Null>.delayed(new Duration(milliseconds: 250));
        }

      });
        TimelineSummary summary = new TimelineSummary.summarize(timeline);
        summary.writeSummaryToFile('increment_perf',
            destinationDirectory: resultsDirectory, pretty: true);
        summary.writeTimelineToFile('increment_perf',
            destinationDirectory: resultsDirectory, pretty: true);
    });
  });
}

Я столкнулся с такой же необходимостью передать переменную среды для тестового приложения на устройстве в тесте драйвера Flutter. Проблема заключалась в том, что тестовые приложения не могли читать переменные среды непосредственно изflutter drive команда.

Вот как я решил проблему. Имя теста для "field_value_behaviors.dart". Имя переменной окруженияFIRESTORE_IMPLEMENTATION.

Команда привода флаттера

Укажите переменную среды при запуске flutter drive команда:

$ FIRESTORE_IMPLEMENTATION=cloud_firestore flutter drive --target=test_driver/field_value_behaviors.dart

Программа драйвера

Программа драйвера ("field_value_behaviors_test.dart") работает как часть flutter driveпрограмма. Он может читать переменные среды:

  String firestoreImplementation =
      Platform.environment['FIRESTORE_IMPLEMENTATION'];

Далее программа драйвера отправляет значение в тестовое приложение, работающее на устройстве, через driver.requestData.

  final FlutterDriver driver = await FlutterDriver.connect();
  // Sends the choice to test application running on a device
  await driver.requestData(firestoreImplementation);
  await driver.requestData('waiting_test_completion',
      timeout: const Duration(minutes: 1));
  ...

Тестовое приложение

Тестовое приложение ("field_value_behaviors.dart") имеет group() а также test()функция вызывает и запускается на устройстве (симуляторе). Следовательно, он не может читать переменную среды непосредственно изflutter driveкоманда. К счастью, тестовое приложение может получать сообщения String от программы драйвера черезenableFlutterDriverExtension():

void main() async {
  final Completer<String> firestoreImplementationQuery = Completer<String>();
  final Completer<String> completer = Completer<String>();

  enableFlutterDriverExtension(handler: (message) {
    if (validImplementationNames.contains(message)) {
      // When value is 'cloud_firestore' or 'cloud_firestore_mocks'
      firestoreImplementationQuery.complete(message);
      return Future.value(null);
    } else if (message == 'waiting_test_completion') {
      // Have Driver program wait for this future completion at tearDownAll.
      return completer.future;
    } else {
      fail('Unexpected message from Driver: $message');
    }
  });
  tearDownAll(() {
    completer.complete(null);
  });

Тестовое приложение изменяет поведение на основе разрешенного значения firestoreImplementationQuery.future:

  firestoreFutures = {
    // cloud_firestore_mocks
    'cloud_firestore_mocks': firestoreImplementationQuery.future.then((value) =>
        value == cloudFirestoreMocksImplementationName
            ? MockFirestoreInstance()
            : null),

Вывод: прочтите переменную окружения Platform.environmentв вашей программе драйвера. Передайте его в тестовое приложение с помощьюdriver.requestData аргумент.

Реализация находится в этом PR:https://github.com/atn832/cloud_firestore_mocks/pull/54

Пакет .env хорошо мне подходит:

включают:

import 'package:dotenv/dotenv.dart' show load, env;

нагрузка:

load();

использовать:

test('can log in', () async {
      await driver.tap(emailFieldFinder);
      await driver.enterText(env['USERNAME']);
      await driver.tap(passwordFieldFinder);
      await driver.enterText(env['PASSWORD']);
      await driver.tap(loginButtonFinder);

      await Future<Null>.delayed(Duration(seconds: 2));

      expect(await driver.getText(mainMessageFinder), "Welcome");
});
Другие вопросы по тегам