Saltar al contenido

Cómo pasar una variable de entorno a una prueba de controlador de flutter

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *