flutter - 使用 Dart::ffi 在带有 native 函数的 flutter 包中测试库函数

标签 flutter integration-testing dart-ffi

我正在编写 Dart 库以使用 Flutter 访问 C 共享对象。

到目前为止,我创建的示例应用程序(在某种程度上)按预期工作,但我想包括单元测试以保持库的稳定性。

详细信息:

  • 共享对象在 APP/android/src/main/jniLibs/{abi}/liboqs.so
  • 示例应用程序在 example/lib/main.dart 中并按预期工作
  • 库在 APP/lib/liboqs_flutter.dart

图书馆使用

  static final ffi.DynamicLibrary _liboqs = Platform.isAndroid
      ? ffi.DynamicLibrary.open("liboqs.so")
      : ffi.DynamicLibrary.process();

设置库。

但是当我尝试使用 flutter_test 访问这个库时(例如运行初始化函数 LiboqsFlutter.init() 运行静态最终 C native 函数 OQS_init,我得到:

Failed to load "/{HOME DIRECTOR}/liboqs_flutter/test/liboqs_flutter_test.dart": Invalid argument(s): Failed to lookup symbol (dlsym(RTLD_DEFAULT, OQS_init): symbol not found)

我知道 flutter test 无法访问“主要” Assets ,但我如何强制通过它,以便正确测试我的代码?

issue offers two solutions :

但我不完全理解如何让这些对我有用。 flutter 驱动程序如何帮助我? #2 代码应该添加到测试中还是原始库中并在测试中调用?如果我在 main/jniLibs 文件夹中已经有预构建的共享对象,我真的需要在测试时重建项目吗?这似乎只是为了测试应用程序而浪费了很多时间。

最佳答案

Android Studio 中的测试可以通过以下两种方式之一进行。 1) 在手机或模拟器环境中或 2) 在桌面上。我正在构建一个 Flutter 包,所以我有一个在手机上测试过的示例,以及一个在我的开发环境(桌面)上测试过的 Dart 库。

我正在寻找的配置在桌面上。因此,我需要为我的 (Mac) 环境编译共享对象 (.dylib),将其包含在构建/测试文件夹中,并像这样调用它:

static ffi.DynamicLibrary _open() {
    if (Platform.environment.containsKey('FLUTTER_TEST')) {
      return ffi.DynamicLibrary.open('build/test/{clibrary}.dylib');
    } else {
      return Platform.isAndroid
          ? ffi.DynamicLibrary.open("liboqs.so")
          : ffi.DynamicLibrary.process();
    }
  }

为了完整起见,首先检测操作系统然后提供适当的共享对象文件是有意义的。

这将确保您拥有可用于单元测试的共享对象。

flutter drive 选项使用集成测试来实现相同的目的。我认为添加一些 hacky 代码比添加另一个仅用于测试的依赖项更好。

关于flutter - 使用 Dart::ffi 在带有 native 函数的 flutter 包中测试库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66641396/

相关文章:

node.js - 如何在测试中获取 serverless.yml 中定义的环境变量

dart - 如何将 native void 指针传递给 Dart 隔离 - 无需复制?

flutter - Dart/Flutter ffi(外部函数接口(interface)) native 回调,例如 : sqlite3_exec

android - 如何使用 dart :ffi in Flutter? 打印到控制台

firebase - Flutter 中 Cloud Firestore 的 FieldValue.increment

flutter - flutter 驱动器:如何仅运行一组或测试

java - Arquillian 集成测试在启用安全管理 (HTTPS) 的 Glassfish 4.1 容器上失败

android - 加载完成后,Flutter Smartrefresher不会隐藏

widget - Flutter - 将焦点转移到特定的小部件

flutter - 无法在 Flutter Canvas 上绘制图像