如何解决在Flutter上运行集成测试时未找到:“ dart:ui”错误

Rob*_*nde 9 dart flutter flutter-test

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

$ flutter drive --target=test_driver/app.dart 
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

 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
Run Code Online (Sandbox Code Playgroud)

请注意,当我从Android Studio运行该应用程序时,它会成功运行。但是,当我使用上面引用的命令从终端运行时,该应用程序显示白屏,并且直到出现终端错误才从那里移动。

假设这是一个路径问题,例如test_driver未找到dart:ui之类的flutter包,如何确保test_driver知道dart:ui在哪里?

Uma*_*dil 16

确保导入设置为:

import 'package:test/test.dart';
Run Code Online (Sandbox Code Playgroud)

而不是这个:

import 'package:flutter_test/flutter_test.dart';
Run Code Online (Sandbox Code Playgroud)

  • @PeteAlvin 这是一个小部件测试,而不是集成测试。https://flutter.dev/docs/cookbook/testing/integration/introduction#5-write-the-tests 集成测试示例使用 `test/test.dart`。 (2认同)

Dra*_*ško 9

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

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

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

很高兴测试您的代码!:D

  • 这也是我的问题!我正在导入“package:flutter/foundation.dart”。我切换到 package:meta/meta.dart' 并且错误消失了。谢谢! (2认同)

Chr*_*ris 6

集成测试不能导入您的主要App代码或在App中运行的其他Flutter代码-否则,它们将因您看到的错误而失败。

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


Rog*_*mao 6

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

导入'包:flutter/widgets.dart';


Aks*_*Aks 5

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

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

  1. 选择编辑配置
  2. 按 + 按钮并选择 Flutter 测试
  3. 确保 Test 范围是 All in file 并将其指向您的测试文件。您现在可以运行单个测试文件,也可以通过在运行下拉列表中选择此配置在 android studio 中调试它。


Rob*_*nde 3

我收到这些错误是因为我试图在 test_driver 文件上导入小部件。如果我尝试使用 find.byWidget,我也会遇到同样的错误。

我试图导入一个小部件或使用 find.byWidget 因为我想检查屏幕上是否存在小部件。

这些错误非常类似于

内置库“dart:ui”在独立 VM 上不可用。

然后,为了检查 test_driver 文件中屏幕上是否存在小部件,我必须使用 find.byKeyValue。例如,给定以下虚拟小部件,在我的应用程序内的文件中定义:

class MyDummyWidget extends StatelessWidget {

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

  @override
  Widget build(BuildContext context) {
    return Center();
  }
}
Run Code Online (Sandbox Code Playgroud)

为了检查它是否显示在屏幕上,我在 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);
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

其中键定义是第一个文件中所需的键定义,然后,find.byValueKey 和await 驱动程序是测试文件中的必需项。