testWidgets function

void testWidgets(
  1. String description,
  2. WidgetTesterCallback callback, {
  3. bool? skip,
  4. Timeout? timeout,
  5. bool semanticsEnabled = true,
  6. TestVariant<Object?> variant = const ft.DefaultTestVariant(),
  7. Object? tags,
  8. int? retry,
  9. LeakTesting? experimentalLeakTesting,
})

Drop-in replacement for flutter_test's testWidgets with Allure reporting.

Implementation

void testWidgets(
  String description,
  ft.WidgetTesterCallback callback, {
  bool? skip,
  ft.Timeout? timeout,
  bool semanticsEnabled = true,
  ft.TestVariant<Object?> variant = const ft.DefaultTestVariant(),
  Object? tags,
  int? retry,
  LeakTesting? experimentalLeakTesting,
}) {
  _ensureAllureInstalled();
  // Resolve path once for all variants — stack walk is the same each time.
  final packagePath = resolvePackageTestPathFromDeclaration(
    stackTrace: StackTrace.current,
    ignoredLibrarySuffixes: _ignoredLibrarySuffixes,
  );
  final variantValues = variant.values.toList(growable: false);

  for (final value in variantValues) {
    final variationDescription = variant.describeValue(value);
    // Must match flutter_test's internal variant naming so declared metadata
    // merges with the runtime LiveTest name.
    final combinedDescription = variationDescription.isEmpty
        ? description
        : '$description (variant: $variationDescription)';
    final prepared = preparePackageTestDeclaration(
      description: description,
      skip: skip,
      tags: tags,
      packagePath: packagePath,
      rawName: combinedDescription,
      testCaseName: description,
      additionalParameters: <AllureParameter>[
        if (variationDescription.isNotEmpty)
          AllureParameter(name: 'variant', value: variationDescription),
      ],
    );

    ft.WidgetTesterCallback effectiveCallback = callback;
    if (prepared.shouldRuntimeSkip) {
      effectiveCallback = (tester) async {
        ft.markTestSkipped(prepared.runtimeSkipReason);
      };
    }

    ft.testWidgets(
      description,
      effectiveCallback,
      skip: prepared.declarationSkipFlag,
      timeout: timeout,
      semanticsEnabled: semanticsEnabled,
      variant: _SingleValueVariant<Object?>(delegate: variant, value: value),
      tags: tags,
      retry: retry,
      experimentalLeakTesting: experimentalLeakTesting,
    );
  }
}