āļāļēāļĢāļ—āļ”āļŠāļ­āļš Flutter āļ­āļĒāđˆāļēāļ‡āļ„āļĢāļšāļ–āđ‰āļ§āļ™: Widget Test, Integration Test āđāļĨāļ°āļāļĨāļĒāļļāļ—āļ˜āđŒāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļēāļĒāđ€āļ—āļ„āļ™āļīāļ„ 2026

āļ„āļđāđˆāļĄāļ·āļ­āļāļēāļĢāļ—āļ”āļŠāļ­āļš Flutter āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ: widget test, integration test, golden test āđāļĨāļ° mocking āļ”āđ‰āļ§āļĒ Mocktail āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļˆāļĢāļīāļ‡āđāļĨāļ°āđāļ™āļ§āļ—āļēāļ‡āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļēāļĒāđ€āļ—āļ„āļ™āļīāļ„ 2026

āļ„āļđāđˆāļĄāļ·āļ­āļāļēāļĢāļ—āļ”āļŠāļ­āļš Flutter āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ widget test, integration test āđāļĨāļ°āđāļ™āļ§āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļēāļĒāđ€āļ—āļ„āļ™āļīāļ„

āļāļēāļĢāļ—āļ”āļŠāļ­āļš Flutter āđ€āļ›āđ‡āļ™āļ›āļąāļˆāļˆāļąāļĒāļŠāļģāļ„āļąāļāļ—āļĩāđˆāđāļĒāļāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™āļĢāļ°āļ”āļąāļš production āļ­āļ­āļāļˆāļēāļ prototype āļ—āļąāđˆāļ§āđ„āļ› Flutter āļĄāļĩāļĢāļ°āļšāļšāļāļēāļĢāļ—āļ”āļŠāļ­āļšāđƒāļ™āļ•āļąāļ§āļŠāļēāļĄāļ›āļĢāļ°āđ€āļ āļ— āđ„āļ”āđ‰āđāļāđˆ unit, widget āđāļĨāļ° integration āđ‚āļ”āļĒāđāļ•āđˆāļĨāļ°āļ›āļĢāļ°āđ€āļ āļ—āļĄāļļāđˆāļ‡āđ€āļ›āđ‰āļēāđ„āļ›āļ—āļĩāđˆāļŠāļąāđ‰āļ™āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļ‚āļ­āļ‡āđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļ™āļģāđ€āļŠāļ™āļ­ pattern āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļ—āļĩāđˆāđƒāļŠāđ‰āđ„āļ”āđ‰āļˆāļĢāļīāļ‡āļŠāļģāļŦāļĢāļąāļš widget test, integration test, golden test āđāļĨāļ°āļāļĨāļĒāļļāļ—āļ˜āđŒ mocking āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āđ‚āļ”āļĒāļ•āļĢāļ‡āļ—āļąāđ‰āļ‡āđƒāļ™āļ‡āļēāļ™āļžāļąāļ’āļ™āļēāļ›āļĢāļ°āļˆāļģāļ§āļąāļ™āđāļĨāļ°āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļēāļĒāđ€āļ—āļ„āļ™āļīāļ„āđƒāļ™āļ›āļĩ 2026

āļ›āļīāļĢāļēāļĄāļīāļ”āļāļēāļĢāļ—āļ”āļŠāļ­āļš Flutter

āļŠāļļāļ”āļ—āļ”āļŠāļ­āļš Flutter āļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ”āļĩāļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāļ›āļīāļĢāļēāļĄāļīāļ”āļāļēāļĢāļ—āļ”āļŠāļ­āļš: unit test āļˆāļģāļ™āļ§āļ™āļĄāļēāļāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđ€āļĢāđ‡āļ§āļ­āļĒāļđāđˆāļāļēāļ™āļĨāđˆāļēāļ‡, widget test āļ—āļĩāđˆāđāļ‚āđ‡āļ‡āđāļāļĢāđˆāļ‡āļ­āļĒāļđāđˆāļŠāļąāđ‰āļ™āļāļĨāļēāļ‡ āđāļĨāļ° integration test āļˆāļģāļ™āļ§āļ™āļ™āđ‰āļ­āļĒāļ—āļĩāđˆāđ€āļˆāļēāļ°āļˆāļ‡āļ­āļĒāļđāđˆāļŠāđˆāļ§āļ™āļšāļ™ Widget test āļ—āļģāļ‡āļēāļ™āđ„āļ”āđ‰āđƒāļ™āđ€āļ§āļĨāļēāđ„āļĄāđˆāļ–āļķāļ‡āļŦāļ™āļķāđˆāļ‡āļ§āļīāļ™āļēāļ—āļĩāđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ­āļļāļ›āļāļĢāļ“āđŒ āļ—āļģāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļŠāļąāđ‰āļ™āļ—āļĩāđˆāđƒāļŦāđ‰āļœāļĨāļ•āļ­āļšāđāļ—āļ™āļˆāļēāļāļāļēāļĢāļĨāļ‡āļ—āļļāļ™āļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļŠāļģāļŦāļĢāļąāļšāđāļ­āļ›āļžāļĨāļīāđ€āļ„āļŠāļąāļ™ Flutter āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆ

āļžāļ·āđ‰āļ™āļāļēāļ™ Widget Testing āđƒāļ™ Flutter

Widget test āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļš UI āđāļšāļšāđāļĒāļāļŠāđˆāļ§āļ™ āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ emulator āļŦāļĢāļ·āļ­āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļĢāļīāļ‡ Flutter āļŠāļĢāđ‰āļēāļ‡ widget tree āđƒāļ™āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļ—āļ”āļŠāļ­āļšāđāļšāļš headless āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ„āļ”āđ‰ feedback loop āļ—āļĩāđˆāļĢāļ§āļ”āđ€āļĢāđ‡āļ§āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļˆāļąāļšāļ›āļąāļāļŦāļēāļ”āđ‰āļēāļ™ layout, event handler āđāļĨāļ°āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡ state āļāđˆāļ­āļ™āļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļ™āļģāļ‚āļķāđ‰āļ™ production

Package flutter_test āļĄāļĩ testWidgets(), WidgetTester āļŠāļģāļŦāļĢāļąāļšāļˆāļģāļĨāļ­āļ‡āļāļēāļĢāđ‚āļ•āđ‰āļ•āļ­āļš āđāļĨāļ°āļ„āļĨāļēāļŠ Finder āļŠāļģāļŦāļĢāļąāļšāļ„āđ‰āļ™āļŦāļē widget āđƒāļ™ tree

counter_widget_test.dartdart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/counter_widget.dart';

void main() {
  testWidgets('Counter increments on tap', (WidgetTester tester) async {
    // Inflate the widget tree
    await tester.pumpWidget(
      const MaterialApp(home: CounterWidget()),
    );

    // Verify initial state
    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);

    // Simulate user tap on the increment button
    await tester.tap(find.byIcon(Icons.add));
    await tester.pump(); // Rebuild after state change

    // Assert updated state
    expect(find.text('0'), findsNothing);
    expect(find.text('1'), findsOneWidget);
  });
}

āļāļēāļĢāđ€āļĢāļĩāļĒāļ pump() āļˆāļ°āļ—āļĢāļīāļāđ€āļāļ­āļĢāđŒāļāļēāļĢ rebuild āļŦāļ™āļķāđˆāļ‡ frame āļŠāļģāļŦāļĢāļąāļš animation āļŦāļĢāļ·āļ­āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļŦāļ™āđˆāļ§āļ‡āđ€āļ§āļĨāļē pumpAndSettle() āļˆāļ°āļĢāļ­āļˆāļ™āļāļ§āđˆāļē frame āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒ āļāļēāļĢāļĢāļđāđ‰āļ§āđˆāļēāļ„āļ§āļĢāđƒāļŠāđ‰āđāļ•āđˆāļĨāļ°āļ§āļīāļ˜āļĩāđ€āļĄāļ·āđˆāļ­āđƒāļ”āđ€āļ›āđ‡āļ™āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ āđ‚āļ”āļĒ pump() āđƒāļŦāđ‰āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļ—āļĩāđˆāđāļĄāđˆāļ™āļĒāļģ āļ‚āļ“āļ°āļ—āļĩāđˆ pumpAndSettle() āļŠāļ°āļ”āļ§āļāļāļ§āđˆāļēāđāļ•āđˆāļ­āļēāļˆāļ„āđ‰āļēāļ‡āļāļąāļš animation āđāļšāļšāđ„āļĄāđˆāļĄāļĩāļ—āļĩāđˆāļŠāļīāđ‰āļ™āļŠāļļāļ”

āļāļēāļĢāļ—āļ”āļŠāļ­āļš Async Operations āđāļĨāļ° Widget āļ—āļĩāđˆāļ‚āļąāļšāđ€āļ„āļĨāļ·āđˆāļ­āļ™āļ”āđ‰āļ§āļĒ Stream

Widget āđƒāļ™āđ‚āļĨāļāļˆāļĢāļīāļ‡āļžāļķāđˆāļ‡āļžāļēāļāļēāļĢāđ€āļĢāļĩāļĒāļ network, āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļŦāļĢāļ·āļ­ stream āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ•āđ‰āļ­āļ‡āļ„āļ§āļšāļ„āļļāļĄāļžāļĪāļ•āļīāļāļĢāļĢāļĄ async āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ WidgetTester āļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļš event loop āļ‚āļ­āļ‡ Dart āđ„āļ”āđ‰ āđāļ•āđˆ dependency āļ āļēāļĒāļ™āļ­āļāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡ mock āđ€āļžāļ·āđˆāļ­āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡ test āļ—āļĩāđˆāđ„āļĄāđˆāđ€āļŠāļ–āļĩāļĒāļĢ

user_profile_widget_test.dartdart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:my_app/user_profile_widget.dart';
import 'package:my_app/user_repository.dart';

class MockUserRepository extends Mock implements UserRepository {}

void main() {
  late MockUserRepository mockRepo;

  setUp(() {
    mockRepo = MockUserRepository();
  });

  testWidgets('displays user name after loading', (tester) async {
    // Arrange: mock returns a user after a delay
    when(() => mockRepo.fetchUser(1)).thenAnswer(
      (_) async => User(id: 1, name: 'Alice'),
    );

    await tester.pumpWidget(
      MaterialApp(
        home: UserProfileWidget(repository: mockRepo),
      ),
    );

    // Assert: loading indicator visible initially
    expect(find.byType(CircularProgressIndicator), findsOneWidget);

    // Wait for the Future to complete and rebuild
    await tester.pumpAndSettle();

    // Assert: user name displayed, loader gone
    expect(find.text('Alice'), findsOneWidget);
    expect(find.byType(CircularProgressIndicator), findsNothing);

    // Verify the repository was called exactly once
    verify(() => mockRepo.fetchUser(1)).called(1);
  });
}

Mocktail āđ€āļ›āđ‡āļ™āđ„āļĨāļšāļĢāļēāļĢāļĩ mocking āļ—āļĩāđˆāđāļ™āļ°āļ™āļģāđƒāļ™āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻ Flutter āļŠāļģāļŦāļĢāļąāļšāļ›āļĩ 2026 āļ•āđˆāļēāļ‡āļˆāļēāļ Mockito āļ•āļĢāļ‡āļ—āļĩāđˆ Mocktail āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļąāđ‰āļ™āļ•āļ­āļ™ code generation āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē test āđ€āļĢāđ‡āļ§āļ‚āļķāđ‰āļ™ API when() / verify() āļ­āđˆāļēāļ™āļ‡āđˆāļēāļĒāđāļĨāļ°āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒ dependency injection āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆ

āļāļĨāļĒāļļāļ—āļ˜āđŒ Mocking āļ”āđ‰āļ§āļĒ Mocktail āļŠāļģāļŦāļĢāļąāļšāđ‚āļ„āđ‰āļ”āļžāļĢāđ‰āļ­āļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

āļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļĄāļąāļāļ–āļēāļĄāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš dependency injection āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđƒāļ™ Flutter Pattern āļ—āļĩāđˆāđ„āļ”āđ‰āļ„āļ°āđāļ™āļ™āļ”āļĩāļ­āļĒāđˆāļēāļ‡āļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­āļ„āļ·āļ­: constructor injection āļĢāđˆāļ§āļĄāļāļąāļš abstract class (āļŦāļĢāļ·āļ­ interface āļœāđˆāļēāļ™āļĢāļ°āļšāļš implicit interface āļ‚āļ­āļ‡ Dart)

weather_service.dartdart
abstract class WeatherService {
  Future<Weather> getWeather(String city);
}

// real implementation
class OpenMeteoWeatherService implements WeatherService {
  final http.Client _client;

  OpenMeteoWeatherService(this._client);

  
  Future<Weather> getWeather(String city) async {
    final response = await _client.get(
      Uri.parse('https://api.open-meteo.com/v1/forecast?city=$city'),
    );
    return Weather.fromJson(jsonDecode(response.body));
  }
}
weather_service_test.dartdart
class MockHttpClient extends Mock implements http.Client {}

void main() {
  late MockHttpClient mockClient;
  late OpenMeteoWeatherService service;

  setUp(() {
    mockClient = MockHttpClient();
    service = OpenMeteoWeatherService(mockClient);
  });

  test('parses weather JSON correctly', () async {
    // Arrange: return a known JSON payload
    when(() => mockClient.get(any())).thenAnswer(
      (_) async => http.Response(
        '{"temperature": 22.5, "condition": "sunny"}',
        200,
      ),
    );

    // Act
    final weather = await service.getWeather('Paris');

    // Assert
    expect(weather.temperature, 22.5);
    expect(weather.condition, 'sunny');
  });
}

Pattern āļ™āļĩāđ‰ āļ„āļ·āļ­āļāļēāļĢāđāļĒāļ dependency āļ āļēāļĒāļ™āļ­āļāđ„āļ§āđ‰āđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡ interface āđāļĨāļ° inject mock āđ€āļ‚āđ‰āļēāđ„āļ› āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđ„āļ”āđ‰āđ€āļŦāļĄāļ·āļ­āļ™āļāļąāļ™āļāļąāļš repository, āļšāļĢāļīāļāļēāļĢ analytics āđāļĨāļ° platform channel āļœāļđāđ‰āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđƒāļŦāđ‰āļ„āļļāļ“āļ„āđˆāļēāļāļąāļšāļāļēāļĢāđāļĒāļāļŠāđˆāļ§āļ™āļ™āļĩāđ‰āđ€āļžāļĢāļēāļ°āđāļŠāļ”āļ‡āļ–āļķāļ‡āļ„āļ§āļēāļĄāđ€āļ‚āđ‰āļēāđƒāļˆāļŦāļĨāļąāļāļāļēāļĢ SOLID āđāļĨāļ°āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāļŠāļģāļŦāļĢāļąāļš production

Integration Testing āļ”āđ‰āļ§āļĒ Package integration_test

Integration test āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļŦāļĨāļēāļĒāļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļ—āļģāļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļ™āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļĢāļīāļ‡āļŦāļĢāļ·āļ­ emulator Package integration_test āđƒāļ™āļ•āļąāļ§āđ€āļ›āđ‡āļ™āļŠāļ°āļžāļēāļ™āđ€āļŠāļ·āđˆāļ­āļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡ API āļ‚āļ­āļ‡ flutter_test āļāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļĢāļ°āļ”āļąāļšāļ­āļļāļ›āļāļĢāļ“āđŒ

integration_test/login_flow_test.dartdart
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:my_app/main.dart' as app;

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('complete login flow', (tester) async {
    // Launch the full app
    app.main();
    await tester.pumpAndSettle();

    // Navigate to login screen
    await tester.tap(find.text('Sign In'));
    await tester.pumpAndSettle();

    // Fill in credentials
    await tester.enterText(
      find.byKey(const Key('email_field')),
      'test@example.com',
    );
    await tester.enterText(
      find.byKey(const Key('password_field')),
      'securePassword123',
    );

    // Submit the form
    await tester.tap(find.byKey(const Key('login_button')));
    await tester.pumpAndSettle();

    // Verify navigation to dashboard
    expect(find.text('Dashboard'), findsOneWidget);
  });
}

Integration test āļĢāļąāļ™āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ flutter test integration_test/ āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļķāļ‡āđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ™āļēāļ™āļāļ§āđˆāļē widget test āđāļ™āļ§āļ—āļēāļ‡āļ—āļĩāđˆāđāļ™āļ°āļ™āļģāļ„āļ·āļ­: āđ€āļ™āđ‰āļ™ integration test āđ„āļ›āļ—āļĩāđˆ user flow āļ—āļĩāđˆāļŠāļģāļ„āļąāļ (login, checkout, onboarding) āđāļĨāļ°āļžāļķāđˆāļ‡āļžāļē widget test āļŠāļģāļŦāļĢāļąāļšāļžāļĪāļ•āļīāļāļĢāļĢāļĄāļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āļŦāļ™āđ‰āļēāļˆāļ­

āļŠāļģāļŦāļĢāļąāļšāđāļ­āļ›āļ—āļĩāđˆāđ‚āļ•āđ‰āļ•āļ­āļšāļāļąāļš UI āļ‚āļ­āļ‡ platform native āđ€āļŠāđˆāļ™ dialog āļ‚āļ­āļŠāļīāļ—āļ˜āļīāđŒ, push notification, prompt āļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āļ”āđ‰āļ§āļĒāđ„āļšāđ‚āļ­āđ€āļĄāļ•āļĢāļīāļ package Patrol āļ‚āļĒāļēāļĒāļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļāļēāļĢāļ—āļ”āļŠāļ­āļš Flutter āļ”āđ‰āļ§āļĒāļāļēāļĢāļĢāļ­āļ‡āļĢāļąāļš native automation

āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Flutter āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļĒāļąāļ‡āļ„āļĢāļąāļš?

āļāļķāļāļāļ™āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđāļšāļšāđ‚āļ•āđ‰āļ•āļ­āļš, flashcards āđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

Golden Test āļŠāļģāļŦāļĢāļąāļšāļ•āļĢāļ§āļˆāļˆāļąāļš Visual Regression

Golden test āļˆāļąāļšāļ āļēāļžāļŦāļ™āđ‰āļēāļˆāļ­āļ‚āļ­āļ‡ widget āļ—āļĩāđˆ render āđāļĨāđ‰āļ§āđāļĨāļ°āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļšāļ āļēāļž baseline āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļĢāļ°āļ”āļąāļš pixel āđƒāļ”āļāđ‡āļ•āļēāļĄāļˆāļ°āļ—āļģāđƒāļŦāđ‰ test āļĨāđ‰āļĄāđ€āļŦāļĨāļ§ āļŠāđˆāļ§āļĒāļ•āļĢāļ§āļˆāļˆāļąāļš visual regression āļ—āļĩāđˆāđ„āļĄāđˆāđ„āļ”āđ‰āļ•āļąāđ‰āļ‡āđƒāļˆāļāđˆāļ­āļ™ deploy

Flutter 3.29+ āļĢāļ­āļ‡āļĢāļąāļš golden test āđƒāļ™āļ•āļąāļ§ āļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āđ€āļŠāđˆāļ™ āļŦāļĨāļēāļĒāļ‚āļ™āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­, theme, locale āļ•āđˆāļēāļ‡āļāļąāļ™ Alchemist āļĄāļĩ API āļ—āļĩāđˆāļĄāļĩāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āđāļ—āļ™āļ—āļĩāđˆ golden_toolkit āļ—āļĩāđˆāļĒāļļāļ•āļīāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļĨāđ‰āļ§

button_golden_test.dartdart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:my_app/primary_button.dart';

void main() {
  testWidgets('PrimaryButton matches golden file', (tester) async {
    await tester.pumpWidget(
      MaterialApp(
        home: Scaffold(
          body: Center(
            child: PrimaryButton(
              label: 'Submit',
              onPressed: () {},
            ),
          ),
        ),
      ),
    );

    // Compare against baseline image
    await expectLater(
      find.byType(PrimaryButton),
      matchesGoldenFile('goldens/primary_button.png'),
    );
  });
}

āļŠāļĢāđ‰āļēāļ‡āļ āļēāļž baseline āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ flutter test --update-goldens āđ€āļāđ‡āļš golden file āđ„āļ§āđ‰āđƒāļ™ version control Pipeline CI āļ„āļ§āļĢāļĢāļąāļ™ golden test āļšāļ™ platform āļ—āļĩāđˆāļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­ (container Linux āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™) āđ€āļžāļ·āđˆāļ­āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļ‚āļ­āļ‡ pixel āļĢāļ°āļŦāļ§āđˆāļēāļ‡ platform

āļāļēāļĢāļˆāļąāļ”āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļŠāļļāļ”āļ—āļ”āļŠāļ­āļš Flutter āđƒāļŦāđ‰āļ‚āļĒāļēāļĒāđ„āļ”āđ‰

āļāļēāļĢāļˆāļąāļ”āļĢāļ°āđ€āļšāļĩāļĒāļš test āļĄāļĩāļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāđ€āļĄāļ·āđˆāļ­ codebase āđ€āļ•āļīāļšāđ‚āļ• Pattern āļ—āļĩāđˆāļ‚āļĒāļēāļĒāđ„āļ”āđ‰āļ”āļĩāļ„āļ·āļ­: āļŠāļ°āļ—āđ‰āļ­āļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ lib/ āļ āļēāļĒāđƒāļ™ test/ āđ‚āļ”āļĒāđāļĒāļāļŠāļąāļ”āđ€āļˆāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļŠāļąāđ‰āļ™ unit, widget āđāļĨāļ° integration

text
test/
  unit/
    services/
      weather_service_test.dart
    models/
      user_test.dart
  widget/
    screens/
      login_screen_test.dart
      dashboard_test.dart
    components/
      primary_button_test.dart
  goldens/
    primary_button.png
integration_test/
  login_flow_test.dart
  checkout_flow_test.dart

āđ‚āļ„āđ‰āļ”āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™ āđ€āļŠāđˆāļ™ mock instance, factory āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļ”āļŠāļ­āļš, custom matcher āļ„āļ§āļĢāļ­āļĒāļđāđˆāđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ test/helpers/ āļāļēāļĢāđāļŠāļĢāđŒāļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļĢāļ°āļŦāļ§āđˆāļēāļ‡āđ„āļŸāļĨāđŒ test āļŠāđˆāļ§āļĒāļĨāļ”āļ„āļ§āļēāļĄāļ‹āđ‰āļģāļ‹āđ‰āļ­āļ™āđ‚āļ”āļĒāđ„āļĄāđˆāļŠāļĢāđ‰āļēāļ‡ coupling āļ—āļĩāđˆāđāļ™āđˆāļ™āđ€āļāļīāļ™āđ„āļ›

āļ•āļąāļ§āļŠāļĩāđ‰āļ§āļąāļ”āļŠāļģāļ„āļąāļāļ—āļĩāđˆāļ„āļ§āļĢāļ•āļīāļ”āļ•āļēāļĄāļ”āđ‰āļ§āļĒāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ coverage āļ‚āļ­āļ‡ Flutter:

  • Line coverage: āđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒ 80%+ āļŠāļģāļŦāļĢāļąāļš business logic, 60%+ āļŠāļģāļŦāļĢāļąāļšāđ‚āļ„āđ‰āļ” UI
  • Branch coverage: āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļē conditional path āļ–āļđāļāļ—āļ”āļŠāļ­āļšāđāļĨāđ‰āļ§
  • āđ€āļ§āļĨāļēāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡ test: unit + widget test āļ•āđˆāļģāļāļ§āđˆāļē 5 āļ™āļēāļ—āļĩ, integration test āļ•āđˆāļģāļāļ§āđˆāļē 30 āļ™āļēāļ—āļĩ

āļāļēāļĢāļĢāļąāļ™ flutter test --coverage āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ lcov.info Pipeline CI āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ lcov āļŦāļĢāļ·āļ­ Codecov āđ€āļžāļ·āđˆāļ­āđāļŠāļ”āļ‡āļ āļēāļžāđāļ™āļ§āđ‚āļ™āđ‰āļĄ coverage āđāļĨāļ°āļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰āđ€āļāļ“āļ‘āđŒāļ‚āļąāđ‰āļ™āļ•āđˆāļģ

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Flutter Testing āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ

āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™āļŠāļēāļĒāđ€āļ—āļ„āļ™āļīāļ„āđƒāļ™āļ›āļĩ 2026 āļĄāļąāļāļĢāļ§āļĄāļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Flutter testing āđ€āļ›āđ‡āļ™āļ›āļĢāļ°āļˆāļģ āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™ pattern āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ” āļˆāļēāļāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļĢāļīāļ‡āļ‚āļ­āļ‡āļ™āļąāļāļžāļąāļ’āļ™āļē Flutter

"āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡ pump() āļāļąāļš pumpAndSettle() āļ„āļ·āļ­āļ­āļ°āđ„āļĢ?"

pump() āļ—āļĢāļīāļāđ€āļāļ­āļĢāđŒāļāļēāļĢ rebuild āļŦāļ™āļķāđˆāļ‡ frame āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ pumpAndSettle() āđ€āļĢāļĩāļĒāļ pump() āļ‹āđ‰āļģāļˆāļ™āļāļ§āđˆāļēāļˆāļ°āđ„āļĄāđˆāļĄāļĩ frame āļ—āļĩāđˆāļ–āļđāļāļˆāļąāļ”āļ„āļīāļ§āļ­āļĩāļ āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļš animation āđāļĨāļ°āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™ route āļˆāļļāļ”āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļĢāļ°āļ§āļąāļ‡: pumpAndSettle() āļˆāļ° timeout āļāļąāļš widget āļ—āļĩāđˆāļĄāļĩ animation āđ„āļĄāđˆāļŠāļīāđ‰āļ™āļŠāļļāļ” (loading spinner, shimmer effect) āđƒāļŦāđ‰āđƒāļŠāđ‰ pump(Duration) āļŠāļģāļŦāļĢāļąāļšāļāļĢāļ“āļĩāđ€āļŦāļĨāđˆāļēāļ™āļąāđ‰āļ™

"Widget test āļ•āđˆāļēāļ‡āļˆāļēāļ integration test āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?"

Widget test āļ—āļģāļ‡āļēāļ™āđƒāļ™āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ headless āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ­āļļāļ›āļāļĢāļ“āđŒ āļ—āļ”āļŠāļ­āļšāļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāđāļšāļšāđāļĒāļāļŠāđˆāļ§āļ™ Integration test āļ—āļģāļ‡āļēāļ™āļšāļ™āļ­āļļāļ›āļāļĢāļ“āđŒāļˆāļĢāļīāļ‡āļŦāļĢāļ·āļ­ emulator āļ—āļ”āļŠāļ­āļšāđāļ­āļ›āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļŦāļĢāļ·āļ­āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆ Widget test āļ—āļģāļ‡āļēāļ™āđ€āļĢāđ‡āļ§ (āļĄāļīāļĨāļĨāļīāļ§āļīāļ™āļēāļ—āļĩ) āđāļĨāļ°āļ„āļ§āļĢāļĢāļąāļ™āđƒāļ™ CI āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆ commit Integration test āļŠāđ‰āļēāļāļ§āđˆāļē (āļ™āļēāļ—āļĩ) āđāļĨāļ°āļĄāļąāļāļĢāļąāļ™āđ€āļĄāļ·āđˆāļ­ merge āļŦāļĢāļ·āļ­ build āļāļĨāļēāļ‡āļ„āļ·āļ™

"āļˆāļ°āļ—āļ”āļŠāļ­āļš widget āļ—āļĩāđˆāļžāļķāđˆāļ‡āļžāļē Provider āļŦāļĢāļ·āļ­ Riverpod āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ?"

āļ„āļĢāļ­āļš widget āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļ”āđ‰āļ§āļĒ provider scope āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄ āđāļĨāļ° inject override āđ€āļ‰āļžāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļ”āļŠāļ­āļš:

dart
// testing a Riverpod-dependent widget
import 'package:flutter_riverpod/flutter_riverpod.dart';

testWidgets('CartWidget shows item count', (tester) async {
  await tester.pumpWidget(
    ProviderScope(
      overrides: [
        // Override the cart provider with test data
        cartProvider.overrideWith(
          (ref) => CartNotifier(initialItems: [
            CartItem(name: 'Widget Book', price: 29.99),
          ]),
        ),
      ],
      child: const MaterialApp(home: CartWidget()),
    ),
  );

  expect(find.text('1 item'), findsOneWidget);
  expect(find.text('\$29.99'), findsOneWidget);
});

āđāļ™āļ§āļ—āļēāļ‡āļ™āļĩāđ‰āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāļžāļķāđˆāļ‡āļžāļē global state āđāļĨāļ°āļ—āļģāđƒāļŦāđ‰āđāļ•āđˆāļĨāļ° test āļĄāļĩāļ„āļ§āļēāļĄ deterministic āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļ„āļģāļ•āļ­āļšāļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļđāļ›āļ˜āļĢāļĢāļĄ āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļ„āļģāļ­āļ˜āļīāļšāļēāļĒāđ€āļŠāļīāļ‡āļ™āļēāļĄāļ˜āļĢāļĢāļĄ āđƒāļŦāđ‰āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāļ”āļĩāļāļ§āđˆāļēāđƒāļ™āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Flutter āļ­āļĒāđˆāļēāļ‡āļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­ āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Flutter āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ āļŠāļēāļĄāļēāļĢāļ–āļĻāļķāļāļĐāļēāđ‚āļĄāļ”āļđāļĨ widget testing āđāļĨāļ°āđ‚āļĄāļ”āļđāļĨ unit testing āļšāļ™ SharpSkill

āđ€āļĢāļīāđˆāļĄāļāļķāļāļ‹āđ‰āļ­āļĄāđ€āļĨāļĒ!

āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āļŠāļĢāļļāļ›

  • Widget test āđƒāļŦāđ‰ ROI āļŠāļđāļ‡āļŠāļļāļ”āđƒāļ™āđāļ­āļ› Flutter āļ”āđ‰āļ§āļĒāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāđ€āļĢāđ‡āļ§ āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļžāļķāđˆāļ‡āļ­āļļāļ›āļāļĢāļ“āđŒ āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļš UI āđ‚āļ”āļĒāļ•āļĢāļ‡āļœāđˆāļēāļ™ testWidgets() āđāļĨāļ° WidgetTester
  • āđƒāļŠāđ‰ Mocktail āļŠāļģāļŦāļĢāļąāļš mock dependency: āđ„āļĄāđˆāļ•āđ‰āļ­āļ‡ codegen, API when()/verify() āļ—āļĩāđˆāļŠāļ°āļ­āļēāļ” āđāļĨāļ°āđ€āļ‚āđ‰āļēāļāļąāļ™āđ„āļ”āđ‰āđ€āļ•āđ‡āļĄāļĢāļđāļ›āđāļšāļšāļāļąāļšāļĢāļ°āļšāļš implicit interface āļ‚āļ­āļ‡ Dart
  • Integration test āļ„āļ§āļĢāđ€āļ™āđ‰āļ™āđ€āļ‰āļžāļēāļ° user flow āļ—āļĩāđˆāļŠāļģāļ„āļąāļ (login, checkout, āļŠāļģāļĢāļ°āđ€āļ‡āļīāļ™) āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āļ—āļģāđƒāļŦāđ‰āđ€āļˆāļēāļ°āļˆāļ‡āđāļĨāļ°āļĢāļąāļ™āđ€āļĄāļ·āđˆāļ­ merge āļŦāļĢāļ·āļ­āđƒāļ™ pipeline CI āļāļĨāļēāļ‡āļ„āļ·āļ™
  • Golden test āļ•āļĢāļ§āļˆāļˆāļąāļš visual regression āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āđ€āļāđ‡āļš baseline āđƒāļ™ version control āđāļĨāļ°āļĢāļąāļ™āļšāļ™ platform CI āļ—āļĩāđˆāļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­āđ€āļžāļ·āđˆāļ­āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļ‚āļ­āļ‡ pixel āļĢāļ°āļŦāļ§āđˆāļēāļ‡ OS
  • āļŠāļ°āļ—āđ‰āļ­āļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ lib/ āđƒāļ™āđ„āļ”āđ€āļĢāļāļ—āļ­āļĢāļĩ test/ āļ•āļīāļ”āļ•āļēāļĄ coverage āļ”āđ‰āļ§āļĒ flutter test --coverage āđāļĨāļ°āļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰āđ€āļāļ“āļ‘āđŒ 80%+ āļŠāļģāļŦāļĢāļąāļš business logic
  • āļāļēāļĢāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ: āļāļķāļāļāļ™āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡ pump() āļāļąāļš pumpAndSettle(), override test Provider/Riverpod āđāļĨāļ° pattern constructor injection āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļĢāļđāļ›āļ˜āļĢāļĢāļĄ

āđ€āļĢāļīāđˆāļĄāļāļķāļāļ‹āđ‰āļ­āļĄāđ€āļĨāļĒ!

āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

Anthony Fillion-Maillet

āđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒ

Anthony Fillion-Maillet

āļ™āļąāļāļžāļąāļ’āļ™āļēāļŸāļđāļĨāļŠāđāļ•āļ āļœāļđāđ‰āļāđˆāļ­āļ•āļąāđ‰āļ‡ SharpSkill

āđ€āļ›āđ‡āļ™āļ™āļąāļāļžāļąāļ’āļ™āļēāļŸāļđāļĨāļŠāđāļ•āļāļĄāļēāļāļ§āđˆāļē 10 āļ›āļĩ āļ”āļđāđāļĨ SharpSkill āđāļĨāļ°āļĢāļąāļšāļœāļīāļ”āļŠāļ­āļšāļ—āļļāļāļŠāļīāđˆāļ‡āļ—āļĩāđˆāđ€āļœāļĒāđāļžāļĢāđˆāļ—āļĩāđˆāļ™āļĩāđˆ

āļ­āļąāļ›āđ€āļ”āļ•āđ€āļĄāļ·āđˆāļ­ 14 āļžāļĪāļĐāļ āļēāļ„āļĄ 2569

āđāļ—āđ‡āļ

#flutter
#dart
#testing
#widget-testing
#integration-testing
#interview

āđāļŠāļĢāđŒ

āļšāļ—āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Flutter āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāđāļ­āļ›āļĄāļ·āļ­āļ–āļ·āļ­

20 āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Flutter āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāđāļ­āļ›āļĄāļ·āļ­āļ–āļ·āļ­

āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Flutter āļ”āđ‰āļ§āļĒāļ„āļģāļ–āļēāļĄ 20 āļ‚āđ‰āļ­āļ—āļĩāđˆāļ–āļđāļāļ–āļēāļĄāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ” āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ Widget, State Management, Dart, āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄ āđāļĨāļ°āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ” āļžāļĢāđ‰āļ­āļĄāļ„āļģāļ­āļ˜āļīāļšāļēāļĒāļ­āļĒāđˆāļēāļ‡āļĨāļ°āđ€āļ­āļĩāļĒāļ”āđāļĨāļ°āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”

Dart 3 records patterns and sealed classes āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē Flutter

Flutter āđāļĨāļ° Dart 3: Records, Patterns āđāļĨāļ° Sealed Classes āļŠāļģāļŦāļĢāļąāļšāļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āļ›āļĩ 2026

āļ„āļđāđˆāļĄāļ·āļ­āđ€āļŠāļīāļ‡āļĨāļķāļāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Dart 3 Records, Pattern Matching āđāļĨāļ° Sealed Classes āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļˆāļĢāļīāļ‡ āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāļ‡āļēāļ™ Flutter Developer āđƒāļ™āļĢāļ°āļ”āļąāļš Senior āđāļĨāļ° Lead

Dart Isolates āđāļĨāļ° Concurrency āđƒāļ™ Flutter 2026

Dart Isolates āđāļĨāļ° Concurrency 2026: compute, Async āđāļĨāļ°āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ

āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāđ€āļāļĩāđˆāļĒāļ§āļāļąāļš Dart isolates, āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ compute āđƒāļ™ Flutter āđāļĨāļ° pattern āļ‚āļ­āļ‡ concurrency āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļēāđāļ­āļ›āļ—āļĩāđˆāļ•āļ­āļšāļŠāļ™āļ­āļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āđƒāļ™āļ›āļĩ 2026