Flutter Entegrasyon Testi | Bölüm 1
Tags: flutter, dart, test, flutterdev
Published: 2022-06-24 00:02:00

Test Çeşitleri
• Integration
• Unit
• Widget

Unit ve Widget testleri, tek tek sınıfları, fonksiyonları veya widget'ları test etmek için kullanışlıdır. Ancak bir bütün olarak uygulamanın nasıl çalıştığını test etmezler veya gerçek bir cihazda çalışan bir uygulamanın performansını yakalayamazlar. Bu gibi durumlar için entegrasyon testleri kullanılır.

Entegrasyon testleri, SDK tarafından sağlanan  [integration_test](https://github.com/flutter/flutter/tree/main/packages/integration_test) paketi kullanılarak yazılır.

Uygulamanız için entegrasyon testi yazmak için öncelikle pubspec.yaml dosyasına aşağıdaki bağımlılıkları ekleyin

```
dev_dependencies:
  integration_test:
    sdk: flutter
  flutter_test:
    sdk: flutter

```

Boş bir app_test.dart dosyasıyla integration_test adında yeni bir dizin oluşturun:


```
your_app/
  lib/
    main.dart
  integration_test/
    app_test.dart

```

Paketiniz aşağıdaki gibi bir yapıda olmalıdır.

```
lib/
  ...
integration_test/
  foo_test.dart //test dosyalarınız..
  bar_test.dart
test/
  # Diğer unit testler buraya gelir.
test_driver/
  integration_test.dart
```

**Testleri çalıştırmak:**

Entegrasyon testlerini çalıştırma süreci, test ettiğiniz platforma göre değişir. Bir mobil platforma veya web'e karşı test edebilirsiniz.

**a. mobil**

Gerçek bir iOS/Android cihazında testlerinizi çaşıştırmak için önce cihazı bağlayın (veya emulator kullaın) ve projenin kökünden aşağıdaki komutu çalıştırın:

```
flutter test integration_test/app_test.dart
```

Veya tüm entegrasyon testlerinizi çalıştırmak istiyorsanız sadece dizini belirtin:

```
flutter test integration_test

```
Bu komut buz dizinde yer alan tüm entegrasyon testlerini çalıştırır.


**b. web** 
Testlerinizi bir web tarayıcısında çalıştırmak istiyorsanız öncelikle [ChromeDriver'ı indirin](https://chromedriver.chromium.org/downloads)

Ardından aşağıdaki içeriklerle test_driver klasöründe `integration_test.dart` adlı bir dosya oluşturun:


```
import 'package:integration_test/integration_test_driver.dart';

Future<void> main() => integrationDriver();
```

WebDriver'ı başlatın, örneğin:


```
chromedriver --port=4444

```

Projenin kökünden aşağıdaki komutu çalıştırın:


```
flutter drive \
  --driver=test_driver/integration_test.dart \
  --target=integration_test/app_test.dart \
  -d web-server
```



**Screenshots**

Test sırasında belirli bir zamanda mobil cihazda veya Web tarayıcısında oluşturulan kullanıcı arayüzünün ekran görüntülerini almak için `integration_test`'ini kullanabilirsiniz. Bu özellik şu anda Android, iOS ve Web'de desteklenmektedir.

**integration_test/screenshot_test.dart**

```
void main() {
  final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized()
      as IntegrationTestWidgetsFlutterBinding;

  testWidgets('screenshot', (WidgetTester tester) async {
// Uygulamayı oluşturun.
    app.main();

// Bu, ekran görüntüsünü almadan önce gereklidir (yalnızca Android).
    await binding.convertFlutterSurfaceToImage();

    await tester.pumpAndSettle();
    await binding.takeScreenshot('screenshot-1');
  });
}
```

Cihazdan ekran görüntüsünü almak için bir driver script kullanabilirsiniz. Bu şekilde, görüntüleri bilgisayarınızda yerel olarak saklayabilirsiniz. iOS'ta ekran görüntüsü Xcode test sonuçlarında da gözükür.

**test_driver/integration_test.dart**

```
import 'dart:io';
import 'package:integration_test/integration_test_driver_extended.dart';

Future<void> main() async {
  await integrationDriver(
    onScreenshot: (String screenshotName, List<int> screenshotBytes) async {
      final File image = File('$screenshotName.png');
      image.writeAsBytesSync(screenshotBytes);
// Ekran görüntüsü geçersizse false döndürür.
      return true;
    },
  );
}
```

**Bir grupta birden fazla testi birleştirmek**

Birbiriyle ilişkili birkaç testiniz varsa, bunları test paketi tarafından sağlanan grup fonksiyonunu kullanarak birleştirin.


```
import 'package:counter_app/counter.dart';
import 'package:test/test.dart';

void main() {
  group('Counter', () {
    test('value should start at 0', () {
      expect(Counter().value, 0);
    });

    test('value should be incremented', () {
      final counter = Counter();

      counter.increment();

      expect(counter.value, 1);
    });

    test('value should be decremented', () {
      final counter = Counter();

      counter.decrement();

      expect(counter.value, -1);
    });
  });
}
```

**Testleri bir terminalde çalıştırın**

`flutter test test/counter_test.dart`


Devamı sonraa... :)


resources:

https://docs.flutter.dev/cookbook/testing
https://docs.flutter.dev/cookbook/testing/integration/introduction
https://github.com/flutter/flutter/tree/main/packages/integration_test