在 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 命令读取环境变量。幸运的是,测试应用可以通过enableFlutterDriverExtension()接收来自驱动程序的String消息:
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