Skip to content

Flutter Unit Testing Cheatsheet

(c) Написано с использованием нейросетей ChatGPT 5

Минимальный набор вещей, которые стоит знать при написании unit-тестов во Flutter/Dart.

1. Основные пакеты

dart
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; // для моков

2. Запуск unit-теста

dart
void main() {
  test('description', () {
    final result = someFunction();
    expect(result, expectedValue);
  });
}
  • test() — базовая единица теста.
  • expect(actual, matcher) — проверка результата.
  • setUp() и tearDown() — выполняются до/после каждого теста.
  • setUpAll() и tearDownAll() — выполняются один раз перед всеми тестами/после всех тестов.

3. Основные матчеры

  • expect(value, equals(5)) — проверка равенства.
  • expect(value, isNotNull) — проверка на null.
  • expect(value, isTrue) / isFalse — булевые проверки.
  • expect(() => throwError(), throwsException) — проверка выброса исключения.
  • expect(list, contains(item)) — проверка элементов в коллекции.
  • expect(list, isEmpty) / isNotEmpty — проверка коллекций.

4. Организация тестов

dart
group('MyClass tests', () {
  setUp(() {
    // подготовка перед каждым тестом
  });

  test('should return correct value', () {
    final result = MyClass().calculate();
    expect(result, 42);
  });
});
  • group() — объединяет несколько тестов.
  • Можно вкладывать группы друг в друга для структурирования.

5. Моки и заглушки

Используем mocktail или mockito для зависимостей:

dart
class MockApi extends Mock implements ApiService {}

void main() {
  late MockApi mockApi;

  setUp(() {
    mockApi = MockApi();
  });

  test('returns data from API', () async {
    when(() => mockApi.fetchData()).thenAnswer((_) async => 'Hello');
    final result = await mockApi.fetchData();
    expect(result, 'Hello');
  });
}
  • when(...).thenReturn(...) — возвращает значение синхронно.
  • when(...).thenAnswer(...) — возвращает Future/Stream.
  • verify(() => mockApi.fetchData()).called(1) — проверка вызова метода.

6. Асинхронные тесты

dart
test('async test', () async {
  final result = await asyncFunction();
  expect(result, equals(42));
});
  • Всегда добавляй async и await для Future.
  • Можно использовать expectLater(stream, emitsInOrder([...])) для Stream.

7. Исключения

dart
expect(() => functionThatThrows(), throwsA(isA<FormatException>()));
  • throwsA(predicate) — проверка конкретного типа исключения.

8. Подготовка и очистка

dart
setUp(() {
  // инициализация перед каждым тестом
});

tearDown(() {
  // очистка после каждого теста
});
  • setUpAll() / tearDownAll() — выполняются один раз на весь тестовый набор.

9. Полезные советы

  • Разделяй тесты на маленькие, атомарные единицы.
  • Мокай внешние зависимости (API, база данных, SharedPreferences и т.д.).
  • Проверяй не только результат функции, но и побочные эффекты (например, вызовы методов на моках).
  • Для сложных объектов используйте equatable или собственные == и hashCode.
  • Старайся избегать sleep() в тестах — используйте Future.delayed с pump/pumpAndSettle в widget-тестах, или имитацию времени в unit-тестах.