Как передать переменную среды в тест флаттера
Я хочу передать переменную среды 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");
});