Flutter行为驱动开发插件flutter_gherkin_generator的使用

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

Flutter行为驱动开发插件flutter_gherkin_generator的使用


Wrapper 是用于使用 Cucumber/Gherkin 符号执行小部件(组件)测试,而不是使用集成测试。它必须与 flutter_gherkin_wrapper 包一起使用。

获取开始

检查 示例

安装:

dev_dependencies:
  flutter_gherkin_generator: 1.0.4
  flutter_gherkin_wrapper: 1.0.4
  build_runner: ^2.4.6

运行:

dart run build_runner build --delete-conflicting-outputs
flutter test

初始化

// Generate steps from resources
// ./test/e2e/given/generic.dart
[@GenerateGherkinResources](/user/GenerateGherkinResources)(['../steps'])
class Generics extends GivenGeneric {
  @override
  RegExp get pattern => RegExp('%step%');

  @override
  // Execute sub-step
  Future<void> executeStep() async {
    final reporter = FileReporter();
    final step = await FileReader().getFromString('''%feature%''', reporter);
    final result = await FileRunner(FileRunner.tester, reporter).run(step);
    if (!result) {
      reporter.publish();
    }
    expectSync(result, true);
  }
}
# /test/e2e/steps/open_expense_form.resource.feature
Feature: Verify Basic Actions

  Scenario: Opened Expense Form
    Given I am on "Home" page
     When I tap "Add Bill, Income or Transfer" button
     Then I can see "Add new Bill" button

执行

// Generate list of steps
[@GenerateListOfClasses](/user/GenerateListOfClasses)(['given', 'when', 'then'])
import 'steps_iterator.list.dart';

void main() {
  Iterable<File> features = Directory('./test/e2e')
      .listSync(recursive: true)
      .where(
          (entity) => entity is File && entity.path.endsWith('.test.feature'))
      .cast<File>();

  setUpAll(() {
    TestWidgetsFlutterBinding.ensureInitialized();
    ScreenCapture.enableScreenCapture();
    ExecutableStepIterator.inject(classList);
    // MainTest.cleanUpData();
  });

  group('Run All End-To-End Tests', () {
    for (var file in features) {
      testWidgets(file.path, (WidgetTester tester) async {
        // await MainTest.init(tester);
        final runner = FileRunner(tester);
        await runner.init(file);
        // ! to avoid collisions in concurrent requests
        expectSync(await runner.run(), true);
        await tester.pumpAndSettle();
      }, timeout: const Timeout(Duration(minutes: 5)));
    }
  });
}
# /test/e2e/bill/create_different_expenses.test.feature
Feature: Verify Expenses Functionality

  Scenario Outline: Added different Expenses
    Given Opened Expense Form
     When I select "&lt;account&gt;" from "AccountSelector" with "Enter Account Identifier" tooltip
      And ...

在添加不同的费用时,可以通过以下示例进行测试:

// Check the extensive usage by "Fingrom" application:
/* // https://github.com/lyskouski/app-finance/tree/main/test/e2e

Feature: Verify Expenses Functionality

  Scenario: Set Up
    Given Created different Account types
      And Created different Budget types

  Scenario Outline: Added different Expenses
    Given Opened Expense Form
     When I select "&lt;account&gt;" from "AccountSelector" with "Enter Account Identifier" tooltip
      And I select "&lt;budget&gt;" from "BudgetSelector" with "Enter Budget Category Name" tooltip
      And I enter "&lt;amount&gt;" to "Set Amount" text field
      And I select "&lt;currency&gt;" from "CodeCurrencySelector" with "Currency Type (Code)" tooltip
      And I enter "&lt;exchange&gt;" to "&lt;cur&gt; Conversion" text field
      And I enter "&lt;account&gt; - &lt;budget&gt;" to "Set Expense Details" text field
      And I tap "Add new Bill" button
     Then I can see "Accounts, total" component
      And I can see "&lt;account_rest&gt;" component
      And I can see "&lt;budget_note&gt;" component
      And I can see "&lt;budget_left&gt;" component

    Examples:
    | account      | cur | budget    | amount | currency | exchange | account_rest |       budget_note |   budget_left |
    | Bank Account | EUR | Limited   |     20 | PLN      |     0.50 |       €90.00 |  €10.00 / €100.00 |   €90.00 left |
    | Cash         | USD | Limited   |     50 | PLN      |     2.00 |      $900.00 |  €35.00 / €100.00 |   €65.00 left |
    | Credit Card  | JPY | Unlimited |    100 | PLN      |     0.01 |       ¥1,499 |         Unlimited | $200.00 spent |
    | Debit Card   | GBP | Group / 1 |     25 | PLN      |     0.40 |      £490.26 |  $50.00 / $125.00 |         Group |
    | Bank Account | EUR | Group / 2 |      5 | PLN      |     2.20 |       €79.00 |  $60.00 / $125.00 |         Group |
    | Cash         | USD | Group / 2 |     10 | PLN      |     4.50 |      $855.00 | $105.00 / $125.00 |         Group |

  Scenario: Tear Down
    Given I am on "Currencies" page
     Then I can see "PLN-EUR" component
     Then I can see "2.2" component
     Then I can see "PLN-USD" component
     Then I can see "4.5" component
     Then I can see "PLN-JPY" component
     Then I can see "0.01" component
     Then I can see "PLN-GBP" component
     Then I can see "0.4" component

*/

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

[@GenerateListOfClasses](/user/GenerateListOfClasses)(['_steps'])
// import 'e2e_test.list.dart';

// 'GivenGeneric'-class from 'flutter_gherkin_wrapper'-package
[@GenerateGherkinResources](/user/GenerateGherkinResources)(['steps_folder'])
// class Generics extends GivenGeneric {}

void main() {
  setUpAll(() {
    // ExecutableStepIterator.inject(classList);
  });
}

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

1 回复

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


当然,以下是一个关于如何使用 flutter_gherkin_generator 插件进行行为驱动开发(BDD)的示例代码和说明。flutter_gherkin_generator 是一个用于 Flutter 的 Gherkin(一种行为描述语言)代码生成器,它可以帮助你快速创建 BDD 测试。

前提条件

确保你已经安装了以下工具和库:

  1. Flutter SDK
  2. Dart
  3. flutter_gherkin
  4. flutter_gherkin_generator

安装依赖

在你的 Flutter 项目中,打开 pubspec.yaml 文件,并添加以下依赖:

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_gherkin: ^x.y.z  # 替换为最新版本号
  build_runner: ^x.y.z      # 用于代码生成
  flutter_gherkin_generator: ^x.y.z  # 替换为最新版本号

然后在项目根目录下运行以下命令以获取依赖:

flutter pub get

配置 build.yaml

在项目的根目录下创建一个 build.yaml 文件,并添加以下内容以配置代码生成器:

targets:
  $default:
    builders:
      flutter_gherkin_generator:gherkin_steps_generator:
        enabled: true

创建 Feature 文件

test/gherkin/ 目录下创建一个名为 example.feature 的文件,并添加以下内容:

Feature: Example Feature

  Scenario: User sees welcome message
    Given I am on the welcome screen
    When I tap the continue button
    Then I see the welcome message

生成 Steps 文件

在项目根目录下运行以下命令以生成步骤文件:

flutter pub run build_runner build --delete-conflicting-outputs

这将在 lib/gherkin/steps/ 目录下生成对应的 Dart 文件。例如,对于上面的 Feature 文件,它可能会生成 example_steps.dart

实现 Steps 文件

打开生成的 example_steps.dart 文件,并实现步骤逻辑。例如:

import 'package:flutter_driver/flutter_driver.dart';
import 'package:flutter_gherkin/flutter_gherkin.dart';
import 'package:gherkin/gherkin.dart';

class ExampleSteps extends When1WithWorld<String, FlutterWorld>
    implements Given, When, Then {
  @override
  Future<void> givenIAmOnTheWelcomeScreen(World world) async {
    // 导航到欢迎屏幕的逻辑
    await FlutterDriverUtils.tap(world.driver, find.byValueKey('welcome_screen_button'));
  }

  @override
  Future<void> whenITapTheContinueButton(String buttonText, World world) async {
    // 点击继续按钮的逻辑
    await FlutterDriverUtils.tap(world.driver, find.text(buttonText));
  }

  @override
  Future<void> thenISeeTheWelcomeMessage(World world) async {
    // 验证欢迎消息是否显示的逻辑
    SerializableFinder welcomeMessageFinder = find.text('Welcome!');
    bool found = await world.driver.waitFor(welcomeMessageFinder);
    expect(found, true);
  }
}

配置 Flutter Driver

确保你的 Flutter 项目已经配置好 Flutter Driver 测试。在 test_driver/ 目录下创建一个 app.dart 文件,内容如下:

import 'package:flutter_driver/flutter_driver.dart';
import 'package:flutter_gherkin/flutter_gherkin.dart';
import 'package:your_app/main.dart' as app; // 替换为你的主应用文件

void main() {
  enableFlutterDriverExtension();
  app.main();
}

运行测试

最后,在项目根目录下运行以下命令以执行 BDD 测试:

flutter drive --target=test_driver/app.dart

总结

以上示例展示了如何使用 flutter_gherkin_generator 插件进行 Flutter 的行为驱动开发。通过定义 Feature 文件并使用代码生成器生成步骤文件,你可以快速实现和运行 BDD 测试。请根据你的具体需求调整生成的步骤文件逻辑。

回到顶部