Flutter插件gits_cucumber的使用

Flutter插件gits_cucumber的使用_gits_cucumber 包基于 patrol 和 integration_test 来简化使用 Gherkin 语言进行集成测试的过程

gits_cucumber 包基于 patrolintegration_test 来简化使用 Gherkin 语言进行集成测试的过程。它可以在 gits_cli 上使用。

安装

首先安装 gits_cli

dart pub global activate gits_cli

然后在项目中安装 gits_cucumber

dart pub add gits_cucumber --dev

使用

为了使用 gits_cucumber,你需要在 integration_test 目录下创建一个文件 cucumber_test.dart 并导入它:

import 'package:gits_cucumber/gits_cucumber.dart';

一旦导入,你可以编写 Widget 测试:

import 'support/cucumber_config.dart';
import 'support/cucumber_hook.dart';
import 'support/step_definitions.dart';

void main() async {
  await GitsCucumber(
    config: CucumberConfig(),
    hook: CucumberHook(),
    reporter: [JsonReporter(), StdoutReporter()],
    stepDefinitions: stepDefinitions,
  ).execute();
}

配置

你可以创建一个 Config 类或将其设置为默认值 null

import 'package:core/core.dart';
import 'package:gits_cucumber/gits_cucumber.dart';

class CucumberConfig extends Config {
  @override
  bool get nativeAutomation => false;

  @override
  NativeAutomatorConfig get nativeAutomatorConfig =>
      const NativeAutomatorConfig(
        androidAppName: Environment.appName,
        iosAppName: Environment.appName,
        packageName: Environment.androidApplicationId,
        bundleId: Environment.iosApplicationId,
      );

  @override
  PatrolTesterConfig get patrolTesterConfig => const PatrolTesterConfig(
        visibleTimeout: Duration(minutes: 1),
      );

  @override
  bool get skipScenario => false;

  @override
  Duration get timeout => const Duration(minutes: 5);
}

钩子

现在你可以添加 Hook 以供 Cucumber 使用:

import 'package:core/core.dart';
import 'package:gits_cucumber/gits_cucumber.dart';
import 'package:gits_flutter_starter_kit/main.dart' as app;

class CucumberHook extends Hook {
  @override
  Future<void> onBeforeExecute() async {
    await app.init();
  }

  @override
  Future<void> onAfterExecute() async {}

  @override
  Future<void> onBeforeFeature(PatrolTester $) async {}

  @override
  Future<void> onAfterFeature(PatrolTester $) async {
    await FlutterSecureStorageHelper.logout();
  }

  @override
  Future<void> onBeforeScenario(PatrolTester $) async {
    await $.pumpWidget(const app.MyApp());
  }

  @override
  Future<void> onAfterScenario(PatrolTester $) async {
    locator<GoRouter>().go('/');
  }

  @override
  Future<void> onBeforeStep(PatrolTester $) async {}

  @override
  Future<void> onAfterStep(PatrolTester $) async {}
}

步骤定义

你需要在 step_definitions.dart 中定义步骤:

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

Map<RegExp, Function> stepDefinitions = {
  // 行动
  RegExp(r'I wait for "([^"]*)" key to visible'):
      (PatrolTester $, String key) async {
    await $(Key(key)).waitUntilVisible();
  },
  RegExp(r'I clear textfield in "([^"]*)" key'):
      (PatrolTester $, String key) async {
    await $(Key(key)).enterText('');
  },
  RegExp(r'I enter "([^"]*)" into "([^"]*)" key'):
      (PatrolTester $, String value, String key) async {
    await $(Key(key)).enterText(value);
  },
  RegExp(r'I scroll in "([^"]*)" key until visible "([^"]*)" key'):
      (PatrolTester $, String scrollKey, String visibleKey) async {
    await $(Key(visibleKey))
        .scrollTo(scrollable: $(Key(scrollKey)).$(Scrollable));
  },
  RegExp(r'I tap "([^"]*)" key'): (PatrolTester $, String key) async {
    await $(Key(key)).tap();
  },
  RegExp(r'I longtap "([^"]*)" key'): (PatrolTester $, String key) async {
    await $.tester.longPress($(key));
  },
};

你还可以添加其他自定义的步骤定义,使用正则表达式。

pubspec.yaml 中添加资源

  1. integration_test/ndjson/ 创建目录。
  2. 然后在 pubspec.yaml 中添加这些资源:
flutter:
  uses-material-design: true
  assets:
    - integration_test/ndjson/

报告器

报告器是可以报告测试运行状态的类。这可以简单地将场景结果记录到控制台。内置的报告器包括:

  • StdoutReporter:将所有消息从测试运行记录到标准输出(控制台)。
  • JsonReporter:创建一个包含测试运行结果的 JSON 文件,然后可以使用 https://www.npmjs.com/package/cucumber-html-reporter 创建 HTML 报告。你可以传递要创建的 JSON 文件的路径。

特性

编写你的特性文件 integration_test/features/login.feature

Feature: 登录

  场景: 使用用户名和 PIN 登录失败
    当我输入 "example@gits.id" 到 "inputEmail" 键
    当我在 "scrollLogin" 键上滚动直到 "inputPin" 键可见
    当我输入 "123455" 到 "inputPin" 键
    当我在 "scrollLogin" 键上滚动直到 "btnLogin" 键可见
    当我点击 "btnLogin" 键

  场景: 使用用户名和 PIN 登录成功
    当我输入 "example@gits.id" 到 "inputEmail" 键
    当我在 "scrollLogin" 键上滚动直到 "inputPin" 键可见
    当我输入 "123456" 到 "inputPin" 键
    当我在 "scrollLogin" 键上滚动直到 "btnLogin" 键可见
    当我点击 "btnLogin" 键

Gits CLI

现在你已经完成了 GitsCucumber 的设置,可以通过调用 gits_cli 命令来运行测试:

gits_cli cucumber

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

1 回复

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


当然,以下是一个假设性的Flutter插件gits_cucumber的使用示例代码。请注意,由于这是一个假设性的插件,以下代码纯粹是为了展示如何使用一个自定义Flutter插件的结构和概念,而并非真实可用的代码。在实际开发中,你需要根据插件的实际API文档进行调整。

首先,假设gits_cucumber插件提供了一个用于执行某些自定义功能的类CucumberService,并有一个方法executeCustomFunction

1. 添加依赖

在你的pubspec.yaml文件中添加对gits_cucumber插件的依赖(这里假设插件已经发布到pub.dev):

dependencies:
  flutter:
    sdk: flutter
  gits_cucumber: ^1.0.0  # 假设版本号

2. 导入插件

在你的Dart文件中导入插件:

import 'package:gits_cucumber/gits_cucumber.dart';

3. 使用插件功能

下面是一个简单的示例,展示如何使用gits_cucumber插件中的CucumberService类及其executeCustomFunction方法。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String result = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('gits_cucumber Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Result: $result',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 使用gits_cucumber插件的功能
                CucumberService cucumberService = CucumberService();
                String response = await cucumberService.executeCustomFunction('some_parameter');
                setState(() {
                  result = response;
                });
              },
              child: Text('Execute Custom Function'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 插件代码示例(假设)

这里是一个假设性的gits_cucumber插件的实现代码示例,用于展示插件可能的结构。在实际开发中,你需要根据插件的实际实现进行调整。

// File: lib/gits_cucumber.dart
import 'dart:async';

class CucumberService {
  // 假设的自定义功能方法
  Future<String> executeCustomFunction(String parameter) async {
    // 这里可以执行一些异步操作,比如网络请求、文件读写等
    await Future.delayed(Duration(seconds: 2)); // 模拟异步操作
    return 'Result for parameter: $parameter';
  }
}

注意事项

  1. 插件安装:确保插件已经正确安装并导入到你的项目中。
  2. API文档:由于这是一个假设性的插件,你需要参考插件的实际API文档来了解其功能和使用方法。
  3. 错误处理:在实际开发中,你应该添加适当的错误处理逻辑来处理可能发生的异常情况。

希望这个示例能够帮助你理解如何在Flutter项目中使用一个假设性的自定义插件。如果你有更具体的需求或问题,请提供更多细节,以便给出更准确的帮助。

回到顶部