Flutter ve Unit Testing

İkinci yazımdan merhaba arkadaşlar.


İlk yazımda Flutter ve Provider mimarisi'nden bahsetmiştim. İkinci yazımda ise biraz testing konusu üzerinde durmak istiyorum.



Bazen developerlar testing konusunu gereksiz bulur ve sadece geliştirmeye odaklanır. Geliştirilen kod için test yazılmaması kısa süre içerisinde zaman kazanmak için iyi bir yol gibi görünse de uzun vadede çok daha vakit kaybettirebilir. Çünkü kodunuzu her refactor edişinizde veya yeni bir feature eklediğinizde istenmeyen yan etkiler çıkabilir ve siz bunun neden kaynaklandığını bulana kadar Sherlock Holmes olursunuz.


Flutter testing konusunda developer’ların yüzünü güldüren bir desteğe ve package’lere sahip. Bu yazıda örneklerle aşağıdaki başlıkları açıklayacağım.

  1. Unit testing

  2. Mocking

  3. Widget’larda unit testing

Yukarıdaki testing yöntemlerini her ne kadar Flutter için yazmış olsam da aslında arkasındaki metodoloji; dil, yapı, kütüphane fark etmeksizin yazılımın her yerinde uygulanıyor.


Unit Testing


Unit testing, fonksiyon, class vs. gibi yapıları kendi başlarına test ettiğimiz bir test türüdür. Olası tüm durumlara maruz bırakarak fonksiyonun düzgün çalışıp çalışmadığına bakılır. Örnek verecek olursak diyelim ki kullanıcıdan websitesi url'ini girmesini isteyeceksiniz ve girilen text’in websitesi olup olmadığını validate edecek bir fonksiyon yazacaksınız. Unit testing yaparken aşağıdaki senaryoları düşünmeniz gerekir:

  1. Kullanıcı hiçbir şey yazmadı

  2. Kullanıcı Türkçe (veya özel) karakter kullandı

  3. Kullanıcı linki yazarken nokta kullanmadı

  4. Kullanıcı “http://” kullanarak doğru bir websitesi linki yazdı

  5. Kullanıcı “http://” kullanmadan doğru bir websitesi linki yazdı

  6. Kullanıcı linki yazarken boşluk kullandı


Yukarıdaki senaryolar için örnek bir input bulursunuz ve fonksiyonu her biri için test edersiniz. Böylece fonksiyonun doğru çalıştığından emin olmuş olursunuz. Şimdi unit testing kavramı kafanıza oturduysa bunu pratikte nasıl yapacağımıza bakalım.


Flutter ve Unit Testing


Flutter bize unit testing konusunda çok büyük kolaylıklar sağlamakta. Öncelikle test kütüphanesini kullanmak için pubspec.yaml dosyamıza dev dependency olarak ekliyoruz.



Devamında test dosyamızı oluştururken IDE’mizin işimizi kolaylaştırması için test edilecek dosya adı sonuna “_test” son ekini koymamız gerekiyor. Örnek vermek gerekirse test edeceğimiz class validation.dart dosyasında olsun, onun testini validation_test.dart dosyasında yapıyoruz.



Basit bir şekilde bir test fonksiyonumuz şöyle görünecek:



Aynı sınıftan veya kaynaktan gelen testlerimizi group metodu sayesinde bir arada tutabiliriz.




Mocking


Bazen test ettiğimiz fonksiyon web üzerindeki bir servise veya bir database’e bağlı olur. Mocking ise bu servisleri taklit ederek fonksiyonumuzu test etmek demektir. Mocking’i projeye eklemek için dev dependency olarak ekliyoruz.



Örnek vermek gerekirse, şehir ismine göre hava durumu bilgisini kullanıcıya vermek istiyoruz. Weather API bize “city not found” dönebilir, başarılı bir JSON objesi dönebilir veya bağlantı hatası verebilir. Bu senaryoların hepsini taklit edip (mocking) fonksiyonumuzun nasıl davranacağını test edebiliriz. Mocking’in nasıl yapıldığını aşağıdaki örnekten görebilirsiniz.




Widget Testing


Flutter’da fonksiyon ve sınıfların yanında widget’ları da test edebiliyoruz. Böylece development sırasında elinizle tek tek ona buna tıklayıp çalışıyor mu çalışmıyor mu görmek yerine bu süreci otomatikleştirip geliştirme sürecini daha efektif hala getirebilirsiniz. İlk olarak flutter_test kütüphanesini dev_dependencies kısmına eklemeniz gerekiyor. Bu kütüphanede size yardımcı olacak birkaç fonksiyonumuz var:


  • testWidgets: test fonksiyonumuzun widget versiyonu diyebiliriz. Kullanacağımız tüm fonksiyonları bu fonksiyon içerisine yazıyoruz. İlk parametresi test case’inin ismi, ikincisi test ettiğimiz fonksiyon.



  • widgetTester: testWidget fonksiyonumuza parametre olarak gelen bu yapı, test environment’ımıza Widget eklememize olanak sağlıyor. Sıfırdan bir widget yaratabildiğiniz gibi kendi widget’larınızı da ekleyebiliyorsunuz. Widget eklemek için pump fonksiyonlarını kullanmanız gerekiyor.

  • pumpWidget: Stateful Widget eklerken kullanışlı bir fonksiyondur kendileri fakat setState ile widget’ı tekrar rebuild ederken bunu kullanamazsınız. Rebuild için aşağıdaki iki fonksiyon size yardımcı olacaktır.

  • pump(Duration süre): Widget’ın yeniden build’ini sağlayan fonksiyondur kendisi. Parametre olarak verdiğiniz süre rebuild ederken geçen frame süresini belirtir.

  • pumpAndSettle(): Widget’ı rebuild eder ve animasyonların bitmesini bekler. Animasyon içeren bir rebuild için bunu kullanmanızı tavsiye ederim.


Find Fonksiyonu


Widget yapısında belirtilen yapıları bulmamızı sağlayan fonksiyonumuzdur. 3 farklı kulanım şekli ile karşımıza çıkıyor:

  • find.text(String s): Text widget’ları kolayca bulmamızı sağlar.

  • find.byKey(Key k): Widget’lara gelen key parametresini kullanarak widget’larımızı bulmamızı sağlar.

  • find.byWidget(Widget w): Direk parametre olarak widget’ın kendisini alarak bulmamızı sağlar.

  • find.byType(Type t): Widget’i type’ına göre bulmanızı sağlar.


Widget Etkileşimleri


Widget’ları find fonksiyonuyla arayıp bulabildiğiniz gibi tap, enterText, drag gibi fonksiyonları kullanarak da onlarla etkileşime geçebilirsiniz. Uygulamalarınızı sürekli elle “Şuna tıkla bu çıkıyor mu?”, “Bunu sürükle bu gidecek mi?”, “Text girmesem patlar mı?” diye sürekli sürekli test etmek yerine bunları otomatik hale getirip her yeni güncellemede tek tıklama ile tüm olası durumları test edebilirsiniz.

  • tap: Bir widget’a basma davranışını taklit eden event’imizdir kendisi. Buton'lara veya GestureListener’lere basılınca bekleneni yapıp yapmadıklarını kolayca bu fonksiyonla kontrol edebilirsiniz.

  • enterText: TextField’lere değer girmenizi sağlayan bir fonksiyon bu da. Textfield’i ve girilen değeri parametre olarak verince sizin yerinize otomatik olarak değeri giriyor.

  • drag: Bir widget’ı bir yere sürüklemek istediğinizde (PageView, Dismissible, TabBarView vs.) bu fonksiyon ile o hareketi kolayca simüle edebilirsiniz.


Son Söz


Özetlemek istersek yazılımcının hayatında test olmazsa olmaz bir aşama. Her ne kadar çoğu kişi göz ardı etse de tutarlı ve uzun süreli yapımlarda düzenli test etmek sizin dostunuz olacaktır. Flutter ise bu konuda size yardımcı olacak muhteşem araçlar vadediyor. Büyük küçük fark etmeksizin yarattığınız her uygulamayı yayınlamadan test case’lerini yazmak ve her yeni geliştirmede bunların bozulmadığına emin olmak sizi büyük bir iş yükünden kurtarmış olduğu gibi özellik üzerine çalışan birden fazla kişi varsa tarafların birbirini anlaması ve her parçanın daha tutarlı geliştirilmesine olanak sağlar.


Referanslar

https://www.tutorialspoint.com/flutter/flutter_testing.htm

https://codelabs.developers.google.com/codelabs/flutter-app-testing#0

https://www.raywenderlich.com/9591040-widget-testing-with-flutter-getting-started

https://flutter.dev/docs/testing


#flutter #unittesting #Mocking


0 yorum

Son Paylaşımlar

Hepsini Gör

Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
imageedit_2_9667998092.png
JetBrains Hakkında Detaylı Bilgi Alın

© 2021 by mobiler.dev

Kurumsal Yazar Hesapları

adesso.png
mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın