Flutter行为驱动开发插件flutter_gherkin_generator的使用
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 "<account>" 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 "<account>" from "AccountSelector" with "Enter Account Identifier" tooltip
And I select "<budget>" from "BudgetSelector" with "Enter Budget Category Name" tooltip
And I enter "<amount>" to "Set Amount" text field
And I select "<currency>" from "CodeCurrencySelector" with "Currency Type (Code)" tooltip
And I enter "<exchange>" to "<cur> Conversion" text field
And I enter "<account> - <budget>" to "Set Expense Details" text field
And I tap "Add new Bill" button
Then I can see "Accounts, total" component
And I can see "<account_rest>" component
And I can see "<budget_note>" component
And I can see "<budget_left>" 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
更多关于Flutter行为驱动开发插件flutter_gherkin_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用 flutter_gherkin_generator
插件进行行为驱动开发(BDD)的示例代码和说明。flutter_gherkin_generator
是一个用于 Flutter 的 Gherkin(一种行为描述语言)代码生成器,它可以帮助你快速创建 BDD 测试。
前提条件
确保你已经安装了以下工具和库:
- Flutter SDK
- Dart
flutter_gherkin
包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 测试。请根据你的具体需求调整生成的步骤文件逻辑。