如何解决在运行Flutter集成测试时出现“Not found: 'dart:ui'”错误

55

我有一个应用程序,它非常简单,只有一个小部件。它目前运行良好,但是当我通过调用以下命令运行集成测试时:

$ flutter drive --target=test_driver/app.dart 

我收到以下错误:

 file:///Users/myuser/flutter/packages/flutter_test/lib/src/accessibility.dart:8:8: Error: Not found: 'dart:ui'
import 'dart:ui' as ui;
       ^
file:///Users/myuser/flutter/packages/flutter_test/lib/src/binding.dart:8:8: Error: Not found: 'dart:ui'
import 'dart:ui' as ui;
       ^
file:///Users/myuser/flutter/packages/flutter_test/lib/src/matchers.dart:8:8: Error: Not found: 'dart:ui'
import 'dart:ui' as ui;
       ^
file:///Users/myuser/flutter/packages/flutter_test/lib/src/matchers.dart:9:8: Error: Not found: 'dart:ui'
import 'dart:ui';
       ^
file:///Users/myuser/flutter/packages/flutter_test/lib/src/test_pointer.dart:12:1: Error: Not found: 'dart:ui'
export 'dart:ui' show Offset;
^
file:///Users/myuser/flutter/packages/flutter/lib/src/rendering/binding.dart:8:8: Error: Not found: 'dart:ui'
import 'dart:ui' as ui show window;
       ^
file:///Users/myuser/flutter/packages/flutter/lib/src/rendering/box.dart:6:8: Error: Not found: 'dart:ui'
import 'dart:ui' as ui show lerpDouble;
       ^
file:///Users/myuser/flutter/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart:6:8: Error: Not found: 'dart:ui'
import 'dart:ui' as ui;
       ^
file:///Users/myuser/flutter/packages/flutter/lib/src/rendering/editable.dart:8:8: Error: Not found: 'dart:ui'
import 'dart:ui' as ui show TextBox;
       ^
file:///Users/myuser/flutter/packages/flutter/lib/src/rendering/error.dart:5:8: Error: Not found: 'dart:ui'
import 'dart:ui' as ui show Paragraph, ParagraphBuilder, ParagraphConstraints, ParagraphStyle, TextStyle;
       ^
Stopping application instance.
Driver tests failed: 254

请注意,当我从Android Studio运行应用时,它可以成功运行。但是,当我使用上述命令从终端运行时,应用程序会显示一个白屏,并且在终端上出现错误之前不会有任何变化。

假设这是路径问题,例如test_driver找不到flutter包,例如dart:ui,那么我该如何确保test_driver知道dart:ui在哪里?


1
Flutter驱动测试由两部分组成。一部分是在模拟器/设备中运行的代码,另一部分是驱动前一部分代码的代码。后一部分的代码不能直接或间接地导入dart:ui - Günter Zöchbauer
1
请确保您的导入语句如下: import 'package:flutter_driver/flutter_driver.dart';import 'package:test/test.dart'; - AbdulMomen عبدالمؤمن
嗨@RobertoAllende,你的问题有什么更新了吗?如果你已经找到解决方案,请写下答案,因为我认为我也遇到了类似的问题。谢谢。 - MNFS
对我来说,答案就是我已经发布的那个。我只是将其标记为答案,因为那是解决我的问题的答案。 - RobertoAllende
12个回答

25

请确保导入设置如下:

import 'package:test/test.dart';

改为:

import 'package:flutter_test/flutter_test.dart';

但是flutter_test是食谱建议使用的。这怎么可能呢?https://flutter.dev/docs/cookbook/testing/widget/introduction#complete-example - Pete Alvin
2
@PeteAlvin 这是一个小部件测试,不是集成测试。https://flutter.dev/docs/cookbook/testing/integration/introduction#5-write-the-tests 集成测试示例使用test/test.dart - Mo...

21

集成测试不能导入您的主要应用程序代码或其他在应用程序中运行的Flutter代码 - 否则它们将失败并出现您看到的错误。

请阅读 https://flutter.io/cookbook/testing/integration-test-introduction/,因为其中提供了一个集成测试的示例,该示例具有应用程序起始点,允许您在实际驱动程序测试运行之前运行设置代码。如果这是您想要做的事情,否则不要使用使用来自您的主代码的常量的键值(如此处所述:http://cogitas.net/write-integration-test-flutter/)。


谢谢,它对我有用!因为我检查了运行设置代码。 - Wasim Khan

11

这是一篇旧帖,但我发现另一个可能导致测试给了这个错误的原因:

当我创建新的Bloc类时,我创建了一个带有@required注释的构造函数,当我使用Option+Enter导入适当的库时,Android Studio导入了'package: flutter / cupertino.dart'库而不是'package:meta / meta.dart',这就是为令我的单元测试一开始无法启动的原因。

导入正确的库后,所有测试都已通过!

祝你愉快地测试你的代码! :D


2
这也是我的问题!我正在导入'package:flutter/foundation.dart'。我切换到'package:meta/meta.dart',错误消失了。谢谢! - Victor Eronmosele

10

下面是添加这些测试用例的解决方案:

在Android Studio的运行下拉菜单中,

  1. 选择“编辑配置”。
  2. 点击 + 按钮并选择Flutter测试。
  3. 确保测试范围为文件中的全部,并将其指向您的测试文件。 现在,您可以通过在运行下拉菜单中选择此配置来运行单个测试文件,并在Android Studio中进行调试。

在Android Studio中可以正常运行。在VS Code中,在终端窗口中执行命令“flutter test”。例如:“flutter test .\test\screens\test_screen_mixin.dart”。 - Jean-Pierre Schnyder

6

从测试驱动程序的代码中删除所有导入到 package:flutter/... 的内容,例如:

import 'package:flutter/widgets.dart';

请注意,不要直接删除这些导入语句,而是需要将它们替换为相应的引用。

这对我来说非常有帮助;它包括以 flutter/ 开头的 任何 东西(在我的情况下,我正在尝试使用需要导入 flutter 的 debugPrint)。 - devrobf

3
我遇到了这些错误,因为我试图在一个测试驱动程序文件中导入一个小部件。如果我尝试使用find.byWidget,我也会得到相同的错误。
我试图导入一个小部件或使用find.byWidget,因为我想检查屏幕上小部件的存在。
这些错误与以下错误非常相似:
“独立运行的VM上没有内置库'dart:ui'。”
然后,为了在test_driver文件中检查屏幕上小部件的存在,我不得不使用find.byKeyValue。例如,给定以下虚拟小部件,在我的应用程序中定义在一个文件中:
class MyDummyWidget extends StatelessWidget {

  MyDummyWidget(): super(key: new Key('MyDummyWidget'));

  @override
  Widget build(BuildContext context) {
    return Center();
  }
}

为了检查它是否在屏幕上显示,我在test_driver中定义了以下测试:
void main() {
  group('My tests', () {
    FlutterDriver driver;
    SerializableFinder myDummyWidget = find.byValueKey('MyDummyWidget');

    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    tearDownAll(() async {
      if (driver != null) {
        driver.close();
      }
    });

    test('check if MyDummyWidget is being displayed', () async {
      await driver.waitFor(myDummyWidget);
    });
  });
}

在第一个文件中,关键定义是必需的,在测试文件中,find.byValueKey和await driver是必要的。


3
在Android Studio中,右键单击项目树中的测试文件,选择“运行”。您应该会看到两个选项:

enter image description here

请确保选择第二个选项:“widget_test 中的测试...”
如果您选择第一个选项,您将会看到“错误:未找到 'dart:ui'”并且您将失去从运行上下文菜单中进行选择的选项。

2

不要简单地运行测试。它是在虚拟pp中运行的。因此,我们无法导入dart:UI。这会导致错误。使用命令flutter drive --target=test_driver/app.dart来进行测试。


0

终于,在我的应用程序中运行了 widget 测试。

这个解决方案对我有用。

我找到了原因,我选择了第一个选项,而不是 flutter test。我当时多傻啊,现在从配置中删除错误的测试类型并使用 flutter test 运行就可以了。 查看在 Android Studio 中运行的图片


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- [来自审查] (https://stackoverflow.com/review/late-answers/29453014) - Adam Marshall

0

检查一下你是否导入了Flutter包。

在我的情况中,我从我的文件app_keys.dart中导入了'cupertino'包,并按照Key('<something>')格式列出了所有的键。

但是!!UI测试使用Key('<something>')常量来进行Finder,但是集成测试则使用简单的字符串。

参考


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接