Flutter快速测试插件quick_test的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter快速测试插件quick_test的使用

quick_test 插件提供了与在 Swift 中使用 Quick 相同的感觉。以下是如何使用该插件进行快速测试的详细指南。

快速测试插件 quick_test

quick_test 插件可以帮助你更高效地编写和运行测试用例。它提供了一些类似于 flutter_test 的功能,但使用起来更加简洁。

使用示例

使用 it 定义示例

it 函数用于定义示例,并通过断言来展示代码应该如何工作。这些示例类似于 flutter_test 中的测试方法。

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

void main() {
  it("是友好的", () {
    expect(Dolphin().isFriendly, isTrue);
  });

  it("是聪明的", () {
    expect(Dolphin().isSmart, isTrue);
  });
}

使用 describecontext 定义示例组

示例组是对逻辑上相关的示例进行分组。示例组可以共享设置和清理代码。

使用 describe 描述类和方法
import 'package:flutter_test/flutter_test.dart';
import 'package:quick_test/quick_test.dart';

void main() {
  describe("一只海豚", () {
    describe("它的点击声", () {
      it("是响亮的", () {
        final click = Dolphin().click();
        expect(click.isLoud, isTrue);
      });

      it("具有高频", () {
        final click = Dolphin().click();
        expect(click.hasHighFrequency, isTrue);
      });
    });
  });
}
使用 beforeEachafterEach 共享设置/清理代码
import 'package:flutter_test/flutter_test.dart';
import 'package:quick_test/quick_test.dart';

void main() {
  describe("一只海豚", () {
    Dolphin dolphin;
    beforeEach(() {
      dolphin = Dolphin();
    });

    describe("它的点击声", () {
      Click click;
      beforeEach(() {
        click = dolphin.click();
      });

      it("是响亮的", () {
        expect(click.isLoud, isTrue);
      });

      it("具有高频", () {
        expect(click.hasHighFrequency, isTrue);
      });
    });
  });
}
使用 context 指定条件行为
import 'package:flutter_test/flutter_test.dart';
import 'package:quick_test/quick_test.dart';
import 'package:mockito/mockito.dart';

void main() {
  describe("一只海豚", () {
    Dolphin dolphin;
    beforeEach(() {
      dolphin = Dolphin();
    });

    describe("它的点击声", () {
      context("当海豚不靠近任何有趣的东西时", () {
        it("只发出一次", () {
          verify(dolphin.click()).called(1);
        });
      });

      context("当海豚靠近一些有趣的东西时", () {
        beforeEach(() {
          final ship = SunkenShip();
          Jamaica.dolphinCove.add(ship);
          Jamaica.dolphinCove.add(dolphin);
        });

        it("发出三次", () {
          verify(dolphin.click()).called(3);
        });
      });
    });
  });
}

测试 vs 小部件测试

在编写测试时导入 quick_test.dart,而在小部件测试时导入 quick_widget_test.dart

import 'package:flutter_test/flutter_test.dart';
import 'package:quick_test/quick_widget_test.dart';

void main() {
  describe("一条消息小部件", () {
    beforeEach((tester) async {
      await tester.pumpWidget(MessageWidget("一条消息"));
    });

    it("显示消息", (tester) async {
      expect(find.text("一条消息"), findsOneWidget);
    });
  });
}

示例代码

以下是一个完整的示例代码,展示了如何使用 quick_test 插件进行测试。

import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:quick_test/quick_test.dart';
import 'package:quick_test/quick_widget_test.dart' as widget;

enum BrandType { unknown, audi, bmw, f1 }

abstract class Driveable {
  void drive();

  void stop();
}

class Vehicle implements Driveable {
  int numberOfWheels = 1;

  BrandType brand = BrandType.unknown;

  void drive() {
    print("我在驾驶");
  }

  void stop() {
    print("我已停止");
  }
}

class Car extends Vehicle {
  [@override](/user/override)
  int numberOfWheels = 4;
}

class AWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: TextDirection.ltr,
      child: Text("就是我"),
    );
  }
}

/// 测试
void main() {
  describe("一辆车", () {
    // 上下文没有指定车辆类型
    context("初始化后", () {
      final vehicle = Vehicle();

      it("应该有品牌", () {
        expect(vehicle.brand, isNotNull);
      });
    });

    // 使用车辆类型上下文
    context("初始化后使用车辆类型", () {
      final expectedCarWheels = 4;
      final vehicle = Car();

      it("应该有品牌", () {
        expect(vehicle.brand, isNotNull);
      });

      it("应该轮子数量符合其类型限制", () {
        expect(vehicle.numberOfWheels, expectedCarWheels);
      });
    });
  });

  widget.describe("一个部件", () {
    widget.beforeEach((tester) async {
      await tester.pumpWidget(AWidget());
    });

    widget.it("包含文本 '就是我'", (tester) async {
      expect(find.text("就是我"), findsOneWidget);
    });
  });
}

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

1 回复

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


在Flutter开发中,quick_test 插件可以用于快速测试你的应用功能。尽管 quick_test 不是一个官方或广泛认知的插件名,但假设你指的是一种快速测试框架或者工具,这里提供一个基于Flutter和集成测试(integration testing)的示例代码,以展示如何在Flutter中进行快速测试。

Flutter自带的集成测试框架非常强大,允许你编写端到端的测试来验证应用的行为。以下是一个简单的例子,展示如何设置和运行集成测试。

1. 添加依赖

首先,确保你的pubspec.yaml文件中包含了集成测试的依赖:

dev_dependencies:
  flutter_test:
    sdk: flutter
  integration_test:
    sdk: flutter

2. 创建测试文件

test_driver/目录下创建一个新的测试文件,例如app_test.dart。这个文件将包含你的集成测试代码。

// test_driver/app_test.dart

import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';

void main() {
  group('Counter App Tests', () {
    FlutterDriver driver;

    // 连接到Flutter应用
    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    // 断开连接
    tearDownAll(() async {
      if (driver != null) {
        driver.close();
      }
    });

    test('initial counter is 0', () async {
      // 找到初始计数器文本
      SerializableFinder counterTextFinder = find.text('0');
      
      // 等待计数器文本出现并验证其值
      expect(await driver.getText(counterTextFinder), '0');
    });

    test('increments counter', () async {
      // 找到浮动动作按钮
      SerializableFinder fabFinder = find.byTooltip('Increment');
      await driver.tap(fabFinder);
      
      // 等待一秒让动画完成
      await Future.delayed(Duration(seconds: 1));
      
      // 找到更新后的计数器文本
      SerializableFinder counterTextFinder = find.text('1');
      expect(await driver.getText(counterTextFinder), '1');
    });
  });
}

3. 运行测试

确保你的Flutter应用正在运行(例如,通过flutter run命令),然后在命令行中运行以下命令来执行集成测试:

flutter drive --target=test_driver/app_test.dart

4. 解释代码

  • 依赖项flutter_drivertest是Flutter集成测试的核心依赖。
  • setUpAlltearDownAll:这些方法分别在所有测试开始之前和所有测试结束之后运行,用于设置和清理资源。
  • SerializableFinder:用于定位UI元素。
  • driver.tap:模拟用户点击事件。
  • driver.getText:获取UI元素的文本内容。
  • expect:用于断言测试结果是否符合预期。

注意事项

  • 确保你的Flutter应用已经正确设置了MaterialApp或CupertinoApp,并且UI元素(如按钮和文本)可以通过find.byTooltipfind.byValueKeyfind.text等方法定位。
  • 根据你的应用逻辑,可能需要调整等待时间(例如Future.delayed)以确保动画或状态更新完成。

虽然quick_test可能不是一个官方或广泛使用的插件名,但上述示例展示了如何使用Flutter的集成测试框架进行快速和有效的测试。如果你确实指的是一个特定的第三方插件,请提供更多信息以便给出更准确的示例。

回到顶部