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

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

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

dart_gherkin 是一个功能齐全的Gherkin解析器和测试运行器,适用于Flutter和Dart 2。它遵循Cucumber的各种实现方式,并提供了特定于Flutter的功能来帮助进行应用程序测试。

以下是关于如何在Flutter项目中使用gherkin插件的详细指南和示例代码。

快速入门

创建特征文件

首先创建一个名为 test 的文件夹,在该文件夹内创建一个名为 features 的文件夹,然后创建一个名为 calculator_can_add.feature 的文件。

Feature: Calculator
  Tests the addition feature of the calculator

  Scenario: Add two numbers
    Given the numbers 1.5 and 2.1
    When they are added
    Then expected result is 3.6

实现步骤定义

步骤定义是特征文件中的文本步骤的编码表示。每个步骤以 GivenThenWhenAndBut 开头。

例如,实现一个给定步骤:

import 'package:gherkin/gherkin.dart';
import '../worlds/custom_world.world.dart';

StepDefinitionGeneric GivenTheNumbers() {
  return given2<num, num, CalculatorWorld>(
    'the numbers {num} and {num}',
    (input1, input2, context) async {
      context.world.calculator.storeNumericInput(input1);
      context.world.calculator.storeNumericInput(input2);
    },
  );
}

配置测试运行

创建一个名为 test.dart 的文件,并将以下代码放入其中:

import 'dart:async';
import 'package:gherkin/gherkin.dart';
import 'supporting_files/steps/given_the_numbers.step.dart';
import 'supporting_files/steps/then_expect_numeric_result.step.dart';
import 'supporting_files/steps/when_numbers_are_added.step.dart';
import 'supporting_files/worlds/custom_world.world.dart';

Future<void> main() {
  final steps = [
    givenTheNumbers(),
    whenTheStoredNumbersAreAdded(),
    thenExpectNumericResult()
  ];
  final config = TestConfiguration.standard(
    steps,
    hooks: [HookExample()],
    customStepParameterDefinitions: [PowerOfTwoParameter()],
    createWorld: (config) => Future.value(CalculatorWorld()),
  );

  return GherkinRunner().execute(config);
}

运行测试:

dart test.dart

配置说明

配置对象指定了要运行的内容以及运行所使用的类(如步骤、钩子和报告器)。配置参数包括:

  • features: 指定要运行的特征文件的位置。
  • tagExpression: 定义基于标签的特性场景运行。
  • order: 场景执行顺序。
  • defaultLanguage: 特征文件的默认语言。
  • stepDefinitions: 自定义步骤定义类实例。
  • customStepParameterDefinitions: 自定义步骤参数定义。
  • hooks: 钩子类实例。
  • reporters: 报告器类实例。
  • createWorld: 创建自定义世界上下文对象的方法。

示例Demo

以下是一个完整的示例,展示如何使用 gherkin 插件编写和运行BDD测试。

特征文件 (calculator_can_add.feature)

Feature: Calculator
  Tests the addition feature of the calculator

  Scenario: Add two numbers
    Given the numbers 1.5 and 2.1
    When they are added
    Then expected result is 3.6

步骤定义 (given_the_numbers.step.dart)

import 'package:gherkin/gherkin.dart';
import '../worlds/custom_world.world.dart';

StepDefinitionGeneric GivenTheNumbers() {
  return given2<num, num, CalculatorWorld>(
    'the numbers {num} and {num}',
    (input1, input2, context) async {
      context.world.calculator.storeNumericInput(input1);
      context.world.calculator.storeNumericInput(input2);
    },
  );
}

测试运行配置 (test.dart)

import 'dart:async';
import 'package:gherkin/gherkin.dart';
import 'supporting_files/steps/given_the_numbers.step.dart';
import 'supporting_files/steps/then_expect_numeric_result.step.dart';
import 'supporting_files/steps/when_numbers_are_added.step.dart';
import 'supporting_files/worlds/custom_world.world.dart';

Future<void> main() {
  final steps = [
    givenTheNumbers(),
    whenTheStoredNumbersAreAdded(),
    thenExpectNumericResult()
  ];
  final config = TestConfiguration.standard(
    steps,
    hooks: [HookExample()],
    customStepParameterDefinitions: [PowerOfTwoParameter()],
    createWorld: (config) => Future.value(CalculatorWorld()),
  );

  return GherkinRunner().execute(config);
}

运行测试

在命令行中运行以下命令:

dart pub get
cd example
dart test.dart

这将运行 features 文件夹中的特征文件。

通过以上步骤,您可以轻松地在Flutter项目中使用 gherkin 插件进行行为驱动开发。希望这个指南对您有所帮助!


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

1 回复

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


在Flutter项目中,使用Gherkin插件进行行为驱动开发(BDD)可以帮助你以自然语言编写测试用例,从而使测试更加直观和易于理解。以下是一个关于如何在Flutter项目中使用Gherkin插件的示例代码案例。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加Gherkin和相关依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_test:
    sdk: flutter

dev_dependencies:
  gherkin: ^x.y.z  # 请替换为最新版本号
  test: ^1.x.x     # 确保版本与Gherkin兼容

运行flutter pub get来安装这些依赖。

2. 配置Gherkin

test目录下创建一个gherkin文件夹,并在其中创建一个config文件夹。在config文件夹中创建一个名为gherkin.dart的文件,用于配置Gherkin。

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

Future<void> main() {
  final FlutterWorld world = FlutterWorld();

  final GherkinConfig config = GherkinConfig()
    ..featureDirectory = 'test/gherkin/features'
    ..stepDefinitions = [
      // 添加你的步骤定义文件
      StepDefinitionFile()..addStepDefinitions(<String, dynamic>{
        'I am on the home page': (context) async => world.navigateToHomePage(),
        // 其他步骤定义...
      }),
      // 可以添加更多步骤定义文件
    ]
    ..customParameterDefinitions = [
      // 自定义参数定义(如果需要)
    ]
    ..reporterConfig = ReporterConfig(
      reportOn: ReportLevel.scenario,
      customReportBuilders: [],
      reportBuilders: [
        JsonReportBuilder(),
        // 其他报告生成器...
      ],
    )
    ..hooks = <Hook>[
      // 钩子函数(如:在每个场景开始前/后执行的操作)
    ];

  return GherkinRunner().execute(config);
}

3. 创建特性文件

test/gherkin/features目录下创建一个特性文件,例如example.feature

# test/gherkin/features/example.feature
Feature: Navigation

  Scenario: User navigates to the home page
    Given I am on the home page
    Then I should see the welcome message

4. 实现步骤定义

test/gherkin/step_definitions目录下创建一个Dart文件,例如navigation_steps.dart,并实现步骤定义。

// test/gherkin/step_definitions/navigation_steps.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:gherkin/gherkin.dart';
import 'package:flutter_gherkin/flutter_gherkin.dart';

class NavigationSteps extends DefaultStepDefinitions {
  @override
  Future<void> registerSteps(World world) async {
    var flutterWorld = world as FlutterWorld;

    given1<String>(
      'I am on the home page',
      (String _, StepExecutionContext context) async {
        await flutterWorld.navigateToHomePage();
      },
    );

    then1<String>(
      'I should see the welcome message',
      (String _, StepExecutionContext context) async {
        final Finder welcomeMessageFinder = find.text('Welcome');
        expect(await flutterWorld.driver.waitFor(welcomeMessageFinder), findsOneWidget);
      },
    );
  }
}

5. 实现FlutterWorld类

test/gherkin/world.dart文件中实现FlutterWorld类,用于封装与Flutter相关的操作。

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

class FlutterWorld extends World {
  late FlutterDriver driver;

  @override
  Future<void> initialize() async {
    // 初始化FlutterDriver
    driver = await FlutterDriver.connect();
  }

  @override
  Future<void> dispose() async {
    // 关闭FlutterDriver
    if (driver != null) {
      driver?.close();
    }
  }

  Future<void> navigateToHomePage() async {
    // 实现导航到首页的逻辑
    await driver.tap(find.byTooltip('Home')); // 示例代码,根据实际情况调整
  }
}

6. 运行测试

在命令行中运行以下命令来执行Gherkin测试:

flutter pub run test_coverage

或者,如果你使用的是VSCode,可以通过配置launch.json来运行测试。

注意:确保你的Flutter环境已经正确配置,并且你的设备或模拟器已经启动。

这个示例展示了如何在Flutter项目中使用Gherkin插件进行行为驱动开发。你可以根据自己的需求扩展步骤定义和特性文件。

回到顶部