Flutter - Test

Test, bir uygulamanın geliştirme yaşam döngüsünde çok önemli bir aşamadır. Uygulamanın kaliteli olmasını sağlar. Test, dikkatli planlama ve yürütme gerektirir. Aynı zamanda geliştirmenin en çok zaman alan aşamasıdır.

Dart dili ve Flutter çerçevesi, bir uygulamanın otomatik testi için kapsamlı destek sağlar.

Test Türleri

Genel olarak, bir uygulamayı tamamen test etmek için üç tür test süreci mevcuttur. Bunlar aşağıdaki gibidir -

Birim Testi

Birim testi, bir uygulamayı test etmek için en kolay yöntemdir. Bir kod parçasının (genel olarak bir işlev) veya bir sınıfın yönteminin doğruluğunu sağlamaya dayanır. Ancak, gerçek ortamı yansıtmaz ve daha sonra hataları bulmak için en az seçenektir.

Widget Testi

Widget testi, beklendiği gibi widget oluşturma, işleme ve diğer widget'larla etkileşimin doğruluğunu sağlamaya dayanır. Bir adım daha ileri gider ve daha fazla hata bulmak için neredeyse gerçek zamanlı bir ortam sağlar.

Entegrasyon Testi

Entegrasyon testi, uygulamanın veritabanı, web hizmeti vb. Gibi harici bileşenlerinin yanı sıra hem birim testini hem de pencere öğesi testini içerir. Neredeyse tüm hataları bulmak için gerçek ortamı simüle eder veya alay eder, ancak bu en karmaşık süreçtir.

Flutter, her tür test için destek sağlar. Widget testi için kapsamlı ve özel destek sağlar. Bu bölümde, widget testini ayrıntılı olarak tartışacağız.

Widget Testi

Flutter test çerçevesi, widget'ları test etmek için testWidgets yöntemi sağlar. İki argüman kabul eder -

  • Test açıklaması
  • Test kodu
testWidgets('test description: find a widget', '<test code>');

İlgili Adımlar

Widget Testi üç farklı adımı içerir -

  • Widget'ı test ortamında işleyin.

  • WidgetTester, pencere öğesini oluşturmak ve işlemek için Flutter test çerçevesi tarafından sağlanan sınıftır. WidgetTester sınıfının pumpWidget yöntemi, herhangi bir parçacığı kabul eder ve bunu test ortamında işler.

testWidgets('finds a specific instance', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
});
  • Test etmemiz gereken widget'ı bulmak.

    • Flutter çerçevesi, test ortamında oluşturulan parçacıkları bulmak için birçok seçenek sunar ve bunlara genellikle Bulucular denir. En sık kullanılan bulucular find.text, find.byKey ve find.byWidget'tır.

      • find.text, belirtilen metni içeren widget'ı bulur.

find.text('Hello')
      • find.byKey, widget'ı özel anahtarıyla bulur.

find.byKey('home')
      • find.byWidget, pencere öğesini örnek değişkenine göre bulur.

find.byWidget(homeWidget)
  • Widget'ın beklendiği gibi çalışmasını sağlamak.

  • Flutter çerçevesi, pencere aracını beklenen pencere öğesi ile eşleştirmek için birçok seçenek sunar ve bunlar normalde Eşleştiriciler olarak adlandırılır . İkinci adımda bulduğumuz widget'ı eşleştiricilerden herhangi birini seçerek beklenen widget'ımızla eşleştirmek için test çerçevesi tarafından sağlanan beklenen yöntemi kullanabiliriz. Önemli eşleşmelerden bazıları aşağıdaki gibidir.

    • findOneWidget - tek bir widget'ın bulunduğunu doğrular.

expect(find.text('Hello'), findsOneWidget);
    • findNothing - hiçbir widget bulunmadığını doğrular

expect(find.text('Hello World'), findsNothing);
    • findWidgets - birden fazla parçacığın bulunduğunu doğrular.

expect(find.text('Save'), findsWidgets);
    • findNWidgets - N sayıda parçacığın bulunduğunu doğrular.

expect(find.text('Save'), findsNWidgets(2));

Tam test kodu aşağıdaki gibidir -

testWidgets('finds hello widget', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
   expect(find.text('Hello'), findsOneWidget); 
});

Burada, gövdesinde Metin widget'ı kullanarak Hello metnini içeren bir MaterialApp widget'ı oluşturduk. Ardından, widget'ı bulmak için find.text'i kullandık ve daha sonra onu findOneWidget kullanarak eşleştirdik.

Çalışma Örneği

Basit bir flutter uygulaması oluşturalım ve ilgili adımları ve konsepti daha iyi anlamak için bir widget testi yazalım.

  • Android stüdyosunda flutter_test_app adlı yeni bir flutter uygulaması oluşturun.

  • Widget_test.dart'ı test klasöründe açın. Aşağıda verilen örnek bir test koduna sahiptir -

testWidgets('Counter increments smoke test', (WidgetTester tester) async {
   // Build our app and trigger a frame. 
   await tester.pumpWidget(MyApp()); 
   
   // Verify that our counter starts at 0. 
   expect(find.text('0'), findsOneWidget); 
   expect(find.text('1'), findsNothing); 
   
   // Tap the '+' icon and trigger a frame. 
   await tester.tap(find.byIcon(Icons.add)); 
   await tester.pump(); 
   
   // Verify that our counter has incremented. 
   expect(find.text('0'), findsNothing); 
   expect(find.text('1'), findsOneWidget); 
});
  • Burada test kodu aşağıdaki işlevleri yerine getirir -

    • Tester.pumpWidget kullanarak Uygulamam widget'ını işler.

    • FindOneWidget ve findNothing eşleştiricilerini kullanarak sayacın başlangıçta sıfır olmasını sağlar.

    • Find.byIcon yöntemini kullanarak sayaç artış düğmesini bulur.

    • Tester.tap yöntemini kullanarak sayaç artış düğmesine dokunur.

    • FindOneWidget ve findNothing eşleştiricileri kullanılarak sayacın artırılmasını sağlar.

  • Sayaç artış düğmesine tekrar dokunalım ve ardından sayacın ikiye çıkarılıp artırılmadığını kontrol edelim.

await tester.tap(find.byIcon(Icons.add)); 
await tester.pump(); 

expect(find.text('2'), findsOneWidget);
  • Çalıştır menüsünü tıklayın.

  • Widget_test.dart seçeneğindeki testleri tıklayın. Bu, testi çalıştıracak ve sonucu sonuç penceresinde rapor edecektir.