Flutter测试辅助插件flutter_test_lib的使用

Flutter测试辅助插件flutter_test_lib的使用

Test_Up_Lib #

FlutterCandies

这是一个为Flutter项目提供的测试辅助插件,它提供了无需UI集成的资产抽象管理API,可以在Android、iOS和macOS上获取资源(如图片、视频和音频)。

在pubspec.yaml中添加插件引用 #

有两种方式将插件添加到您的pubspec.yaml文件中:

  • (推荐) 运行命令 flutter pub add flutter_test_lib
  • 在`pubspec.yaml`文件的`dependencies`部分手动添加插件引用:
dependencies:
  flutter_test_lib: $latest_version

最新稳定版本是: [pub package][pub package]

在项目中导入插件 #

import 'package:flutter_test_lib/flutter_test_lib.dart';

配置原生平台 #

最低平台版本要求: Android 16, iOS 9.0, macOS 10.15

Android配置准备

Kotlin, Gradle, AGP

此插件随附了 Kotlin 1.7.22。 如果您的项目使用的是较低版本的Kotlin/Gradle/AGP, 请将其升级到较新版本。

具体来说:

  • 将Gradle版本(`gradle-wrapper.properties`)升级到 7.5.1 或最新版本。
  • 将Kotlin版本(`ext.kotlin_version`)升级到 1.7.22 或最新版本。
  • 将AGP版本(`com.android.tools.build:gradle`)升级到 7.2.2 或最新版本。

示例代码

以下是一个完整的示例代码,展示了如何在Flutter项目中使用flutter_test_lib插件。

import 'package:flutter/material.dart';
import 'package:flutter_test_lib/flutter_test_lib.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是你的应用的根节点。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '自定义按钮演示',
      home: Scaffold(
        appBar: AppBar(title: const Text('自定义按钮演示')),
        body: Center(
          child: CustomButton(
            label: '点击我!',
            color: Colors.green,
            textStyle: const TextStyle(
              fontSize: 20,
              color: Colors.white,
            ),
            onPressed: () {
              debugPrint('按钮被按下!');
            },
          ),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // 这个小部件是你的应用的主页。它是有状态的,意味着它有一个状态对象(在下面定义),该对象包含影响其外观的字段。
  // 这个类是状态的配置。它保存由父级(在这个例子中是App小部件)提供的值(在这种情况下是标题)并用于构建方法的状态。小部件子类中的字段总是标记为“final”。

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // 这个调用setState告诉Flutter框架某些事情已经改变,在这种情况下,它会重新运行build方法以反映更新后的值。如果我们不调用setState更改_counter,那么build方法将不会再次被调用,因此什么都不会发生。
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 每次调用setState时都会重新运行此方法,例如上面的_incrementCounter方法所做的那样。
    //
    // Flutter框架已被优化为使重新运行构建方法变得快速,因此你可以重建任何需要更新的小部件,而不是单独更改实例。
    return Scaffold(
      appBar: AppBar(
        // 尝试:尝试在这里将颜色更改为特定颜色(可能是Colors.amber?),然后触发热重载以查看AppBar的颜色发生变化,而其他颜色保持不变。
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        // 这里我们从MyHomePage对象获取值,该对象是由App.build方法创建的,并用于设置我们的appbar标题。
        title: Text(widget.title),
      ),
      body: Center(
        // Center是一个布局小部件。它接受一个子节点并将其放置在父节点的中间。
        child: Column(
          // Column也是一个布局小部件。它接受一个小部件列表并垂直排列它们。默认情况下,它水平调整自身大小以适应其子节点,并尝试与其父节点一样高。
          //
          // Column具有各种属性来控制其自身的大小及其子节点的位置。在这里我们使用mainAxisAlignment来垂直居中子节点;主轴是垂直轴,因为Columns是垂直的(交叉轴将是水平的)。
          //
          // 尝试:启用“调试绘制”(在IDE中选择“切换调试绘制”操作,或在控制台中按“p”),以查看每个小部件的线框。
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              '你已经按下了按钮这么多次:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ), // 这个尾随的逗号使得自动格式化更好看。
    );
  }
}

更多关于Flutter测试辅助插件flutter_test_lib的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter测试辅助插件flutter_test_lib的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_test_lib 是一个用于简化 Flutter 测试的辅助插件。它提供了一些工具和实用程序,帮助开发者更高效地编写和管理单元测试、小部件测试和集成测试。以下是一些关于如何使用 flutter_test_lib 的常见步骤和示例。

1. 安装 flutter_test_lib

首先,你需要在 pubspec.yaml 文件中添加 flutter_test_lib 作为开发依赖项:

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_test_lib: ^版本号

然后运行 flutter pub get 来安装依赖。

2. 编写单元测试

flutter_test_lib 提供了一些辅助函数来简化单元测试的编写。例如,你可以使用 expectWithTolerance 来比较浮点数,允许一定的误差范围。

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_test_lib/flutter_test_lib.dart';

void main() {
  test('Test floating point comparison with tolerance', () {
    double a = 0.1 + 0.2;
    double b = 0.3;
    expectWithTolerance(a, b, tolerance: 0.0001);
  });
}

3. 编写小部件测试

在小部件测试中,flutter_test_lib 提供了一些工具来简化小部件的构建和验证。例如,你可以使用 pumpWidgetWithMaterialApp 来自动包裹小部件在 MaterialApp 中。

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_test_lib/flutter_test_lib.dart';

void main() {
  testWidgets('Test MyWidget with MaterialApp', (WidgetTester tester) async {
    await tester.pumpWidgetWithMaterialApp(MyWidget());

    expect(find.text('Hello, World!'), findsOneWidget);
  });
}

4. 编写集成测试

在集成测试中,flutter_test_lib 可以帮助你更轻松地启动应用程序并与小部件进行交互。例如,你可以使用 IntegrationTestHelper 来启动应用程序并执行一些操作。

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_test_lib/flutter_test_lib.dart';
import 'package:integration_test/integration_test.dart';

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('Test full app flow', (WidgetTester tester) async {
    final helper = IntegrationTestHelper(tester);

    await helper.launchApp();

    await helper.tap(find.byKey(Key('loginButton')));
    await helper.enterText(find.byKey(Key('usernameField')), 'testuser');
    await helper.enterText(find.byKey(Key('passwordField')), 'password');
    await helper.tap(find.byKey(Key('submitButton')));

    expect(find.text('Welcome, testuser!'), findsOneWidget);
  });
}

5. 使用 Mock 和 Stub

flutter_test_lib 还可能提供一些工具来简化 Mock 和 Stub 的使用,例如自动生成 Mock 类或简化依赖注入。

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_test_lib/flutter_test_lib.dart';
import 'package:mockito/mockito.dart';

class MockService extends Mock implements MyService {}

void main() {
  test('Test with mocked service', () {
    final mockService = MockService();
    when(mockService.getData()).thenReturn('Mocked Data');

    final myBloc = MyBloc(mockService);

    expect(myBloc.getData(), 'Mocked Data');
  });
}
回到顶部