El tutorial o código que encontrarás en este artículo es la solución más rápida y efectiva que hallamos a esta duda o dilema.
Solución:
Intenté usar Dart’s Platform.environment
para leer las variables env antes de ejecutar las pruebas del controlador y parece funcionar bien. A continuación se muestra un ejemplo simple que establece el directorio de salida para los resúmenes de prueba utilizando el FLUTTER_DRIVER_RESULTS
variable 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.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);
);
);
El paquete .env me sirve bien:
incluir:
import 'package:dotenv/dotenv.dart' show load, env;
carga:
load();
usar:
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.delayed(Duration(seconds: 2));
expect(await driver.getText(mainMessageFinder), "Welcome");
);
Encontré la misma necesidad de aprobar una variable de entorno para la aplicación de prueba en un dispositivo en una prueba de controlador de Flutter. El desafío fue que las aplicaciones de prueba no pueden leer variables de entorno directamente desde flutter drive
mando.
Así es como resolví el problema. El nombre de la prueba es “field_value_behaviors.dart”. El nombre de la variable de entorno es FIRESTORE_IMPLEMENTATION
.
Comando Flutter Drive
Especificar la variable de entorno cuando se ejecuta flutter drive
mando:
$ FIRESTORE_IMPLEMENTATION=cloud_firestore flutter drive --target=test_driver/field_value_behaviors.dart
Programa de conductor
El programa de controlador (“field_value_behaviors_test.dart”) se ejecuta como parte de flutter drive
programa. Puede leer variables de entorno:
String firestoreImplementation =
Platform.environment['FIRESTORE_IMPLEMENTATION'];
Además, el programa del controlador envía el valor para probar la aplicación que se ejecuta en un dispositivo a través de 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));
...
Aplicación de prueba
La aplicación de prueba (“field_value_behaviors.dart”) tiene group()
y test()
la función llama y se ejecuta en un dispositivo (simulador). Por lo tanto, no puede leer la variable de entorno directamente desde flutter drive
mando. Afortunadamente, la aplicación de prueba puede recibir mensajes String del programa del controlador a través de enableFlutterDriverExtension()
:
void main() async {
final Completer firestoreImplementationQuery = Completer();
final Completer completer = Completer();
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);
);
La aplicación de prueba cambia el comportamiento según el valor resuelto de firestoreImplementationQuery.future
:
firestoreFutures = {
// cloud_firestore_mocks
'cloud_firestore_mocks': firestoreImplementationQuery.future.then((value) =>
value == cloudFirestoreMocksImplementationName
? MockFirestoreInstance()
: null),
Conclusión: lea la variable de entorno por Platform.environment
en su programa de controlador. Páselo a su aplicación de prueba por driver.requestData
argumento.
La implementación está en este PR: https://github.com/atn832/cloud_firestore_mocks/pull/54