Yaklaşık 9 ay önce müşterilerimizden biri, "Bunun faydası yok! Flutter'ın entegrasyon testleriyle uçtan uca bir test yapamam" diye haykırdı. Sorunun ne olduğunu sordum ve giriş yapmak için Google Authentication'ı kullandıklarını ve google_sign_in paketini kullandıklarını ancak giriş ekranlarıyla etkileşimde bulunmak için Flutter'ın entegrasyon testlerini kullanmanın mümkün olmadığını açıkladılar. Sorunun ne olduğunu hâlâ tam olarak anlayamadım ve sonra düzeldi: Bu eklenti, entegrasyon testlerinin çalışmadığı yerel kullanıcı arayüzü bileşenlerini kullanıyor.
O zaman bir çözüm sunamadığım için oldukça hayal kırıklığına uğradım ve işi bu şekilde bırakmak zorunda kaldım. Ancak bugün hızla ilerlediğimizde "Patrol" adı verilen harika yeni bir çözüm ortaya çıktı.
Geliştirme ekiplerinin Sürekli Entegrasyon (CI) hizmetlerini kullanmasının ana nedenlerinden biri
CI iş akışınızın bir parçası olarak otomatikleştirilebilecek dört ana test yöntemi vardır. Test etme başlı başına bir konudur, bu yüzden kısa tutacağım ancak bu test yöntemlerinin bir kombinasyonunu kullanmak, uygulamanızın kalitesini artırmanıza ve sorunları daha sonra değil, daha erken yakalamanıza yardımcı olacaktır.
İlk olarak, işlevlerinizin ve yöntemlerinizin beklendiği gibi çalıştığından emin olmak için ayrı ayrı test etmek için yaygın olarak kullanılan "Birim testi" vardır. İş mantığınızın farklı senaryolarda beklenmeyen sonuçlar olmadan çalıştığından emin olmak için birim testleri de yazılabilir.
Daha sonra, UI bileşenlerinizi test etmenize ve bunların doğru şekilde oluşturulduğundan ve beklediğiniz gibi çalıştığından emin olmanıza olanak tanıyan Flutter "Widget testleri" var.
Daha sonra, uygulamanızın birimlerinin ve bileşenlerinin beklendiği gibi birlikte çalışıp çalışmadığını test ettiğiniz "Entegrasyon testi" vardır.
Son olarak, uygulamayı gerçek bir kullanıcı tarafından kullanılıyormuş gibi test ettiğiniz "Uçtan Uca UI testi" vardır. Bir CI iş akışında, kodunuzda değişiklik yaptıktan sonra herhangi bir sorun olmadığından emin olmak amacıyla uygulamanızdaki farklı yolları test etmek için bu genellikle simülatörler veya öykünücüler kullanılarak otomatikleştirilir.
Başlangıçta bahsettiğim müşteri, uygulamaya giriş yapmak mümkün olmadığından Uçtan Uca UI testlerini çalıştıramadığı için sıkışıp kaldığı yer burasıdır. O zamanlar oturum açma kısmını atlayan bir 'geliştirme' sürümünü test ettiler.
Ancak artık "Devriye" mevcut olduğundan buna gerek yok!
Peki öncelikle Devriye nedir? Bence dokümanlar bunu en iyi şekilde söylüyor:
Patrol, LeanCode tarafından geliştirilen Flutter için yeni ve açık kaynaklı bir kullanıcı arayüzü test çerçevesidir. Daha önce imkansız olan şeyleri yapmanıza olanak sağlamak için Flutter'ın mevcut test araçlarının üzerine inşa edilmiştir. Patrol, Flutter uygulamasının üzerinde çalıştığı platformun yerel özelliklerine erişmenizi sağlar.
Buradaki en önemli kısım Flutter uygulamanızın çalıştığı platformun yerel özelliklerine erişmenizi sağlamasıdır.
Bu, artık aşağıdaki gibi şeyler yapabileceğiniz anlamına gelir:
Tamam, bu kulağa harika geliyor ama işin püf noktası nedir?
Peki, öyle bir şey yok! Dahası, yalnızca ücretsiz değil aynı zamanda
Ayrıca Patrol, testlerinizi yazmanız için size daha kısa bir sözdizimi sağlayan 'özel bulucuları' da sunar. Onlar hakkında daha fazlasını okuyabilirsiniz
Patrol'ü kullanmaya başlamak için CLI'yi yüklemeniz, Patrol bağımlılığını pubspec.yaml dosyanıza eklemeniz ve iOS ve Android projelerinizde bazı yapılandırmalar ayarlamanız gerekir.
LeanCode harika belgeler hazırladı
Herhangi bir sorunla karşılaşırsanız yardım alabileceğiniz en iyi yer katılabileceğiniz Patrol Topluluğu Discord sunucusudur.
Herhangi bir hata bulursanız sorunu dile getirebilirsiniz
Patrol'ü kullanmaya başlamak için CLI'yi yüklemeniz, Patrol bağımlılığını pubspec.yaml dosyanıza eklemeniz ve iOS ve Android projelerinizde bazı yapılandırmalar ayarlamanız gerekir.
LeanCode harika belgeler hazırladı
Herhangi bir sorunla karşılaşırsanız yardım alabileceğiniz en iyi yer katılabileceğiniz Patrol Topluluğu Discord sunucusudur.
Herhangi bir hata bulursanız sorunu dile getirebilirsiniz
Artık hazırsınız, hadi bazı yerel özellikleri test etmeye başlayalım. Bunu kendim denemek için, tıklandığında yerel bir uyarı iletişim kutusu açan, yükseltilmiş bir düğmeye sahip basit bir Flutter uygulaması kurdum.
"Tamam" veya "İptal"e tıkladığınızda iletişim kutusu kapatılır.
Yine Patrol'ün bulabileceğiniz kendi belgelerini kullanmanızı tavsiye ederim.
Bu yüzden testim için "Beni tıklayın!" metninin bulunduğu yükseltilmiş düğmeye tıklamak istedim. Bu standart bir Flutter widget'ıdır ve aşağıdaki Devriye bulucu kullanılarak dokunulabilir:
await $('Click me!').tap();
Daha sonra yerel iletişim kutusu görüntülenmelidir, böylece artık yerel bir kullanıcı arayüzü bileşeniyle etkileşime girmeye başlayabiliriz. Öyleyse "Tamam" düğmesine dokunmamızı sağlayacak yerel bulucuyu ekleyelim:
await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK'));
Kolaydı! Ayrıca "İptal" düğmesini de denemek istiyorum, o yüzden "Beni tıkla!" düğmesine dokunalım. düğmesine tekrar basın ve ardından aşağıdaki gibi birkaç satır daha ekleyerek yerel iletişim kutusunun "İptal" düğmesine dokunun:
await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'Cancel'));
Tamamlanan test dosyanız şöyle görünmelidir:
import 'package:cmpatrol/main.dart'; import 'package:patrol/patrol.dart'; void main() { patrolTest( 'Native tests', nativeAutomation: true, ($) async { await $.pumpWidgetAndSettle(const MyApp()); await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'Cancel')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'NO')); }, ); }
Artık testi başlatma komutunu kullanarak bu testi öykünücünüzde veya gerçek bir cihazda çalıştırabilmeniz gerekir. Entegrasyon test dosyamın adı "button_test" olduğundan testleri Terminal'den şu şekilde başlattım:
patrol test -t integration_test/button_test.dart
Testlerinizin başarılı olup olmadığını doğrudan Terminal'de göreceksiniz. Testler başarısız olursa, tam test raporuna bir bağlantı alacaksınız. Alternatif olarak, eğer testlerinizi benim yaptığım gibi Android üzerinde çalıştırıyorsanız, aşağıdaki dizindeki index.html dosyasına tıklayarak rapora erişebilirsiniz:
./build/app/reports/androidTest/connected
Bildirim tepsisini açmak, kablosuz bağlantıyı devre dışı bırakmak, karanlık modu etkinleştirmek, uygulamayı simge durumuna küçültmek ve büyütmek gibi diğer yerel özelliklerle daha fazla deneme yapabilirsiniz:
// minimize app await $.native.pressHome(); await $.native.openNotifications(); await $.native.disableWifi(); await $.native.enableDarkMode(); // maximize app await $.native.openApp();
⚠️ Uygulamanızı tamamen kapatıp tekrar açmanın mümkün olmadığını unutmayın çünkü bunu yapmak tüm testin sona ermesine ve dolayısıyla başarısız olmasına neden olur.
Devriyeye danışın
Patrol'ü iş akışlarınıza dahil etmek için öncelikle Patrol CLI'yi yapım makinesine yüklemeniz gerekir. Bu yalnızca birkaç saniye sürer ve işlem tamamlandıktan sonra test komut dosyanızı çalıştırabilirsiniz. Aşağıda bu adımları codemagic.yaml yapılandırma dosyanızın "komut dosyaları" bölümüne nasıl ekleyeceğinize dair bir örnek verilmiştir. İlk komut dosyası adımlarından biri olarak Patrol CLI'yi yüklemek için komut dosyasını çalıştırmanızı öneririm ve ardından Patrol testlerinizi bundan hemen sonra veya önceden çalıştırmak isteyebileceğiniz diğer testlerden sonra çalıştırabilirsiniz.
Devriye testlerinizi çalıştırmadan önce emülatörü başlatmanız gerekecek, böylece emülatörü başlatmak için bir komut dosyası ekleyeceğiz ve tamamen başlatılmasını bekleyeceğiz. Apple Virtualization Framework'ün iç içe sanallaştırmayı desteklememesi nedeniyle Android emülatörlerinin Apple Silicon M1 veya M2 makinelerini kullanan makinelerde kullanılamadığını unutmayın. Bu nedenle Android uygulamalarını test ederken bir linux örneği kullanmanızı tavsiye ederim.
codemagic.yaml dosyanızın komut dosyaları bölümü şöyle görünmelidir:
scripts: ... - name: Install Patrol CLI script: dart pub global activate patrol_cli - name: Launch Android emulator script: | cd $ANDROID_HOME/tools emulator -avd emulator & adb wait-for-device - name: Run tests with Patrol script: patrol test -t integration_test/your_test.dart ignore_failure: true ...
Patrol test sonuçları aynı zamanda JUnit XML formatında da mevcuttur; bu, bunların Codemagic derleme genel bakış ekranındaki derleme günlüklerinde görüntülenebileceği anlamına gelir. Oluşturulan JUnit XML dosyasının yoluna test_report özellik geçişini eklemeniz yeterlidir. İş akışının geri kalanının çalışmaya devam etmesini isteyip istemediğinizi kontrol etmek için görmezden_failure özelliğini bir boole ile kullanabilirsiniz. Sonuçlarınızı bir sonraki bölümde anlatıldığı gibi bir test yönetim sistemine yüklemek istiyorsanız bunu true olarak ayarlamalısınız.
İşte betiğinizin nasıl görünmesi gerektiğine dair bir örnek:
scripts: ... - name: Run tests with Patrol script: | patrol test -t integration_test/your_test.dart test_report: build/app/outputs/androidTest-results/connected/*.xml ignore_failure: true ...
Başarısız bir test şuna benzer:
Yapmak isteyebileceğiniz ek bir şey de, herhangi bir hata oluşması durumunda raporun tamamını görüntüleyebilmeniz için test raporu çıktısını bir yapı yapısı olarak toplamaktır. Bunu yapmak, raporun sol taraftaki "Yapılar" bölümündeki yapıya genel bakış ekranında zip dosyası olarak indirilebilmesini sağlayacaktır. Bunu yapmanın en kolay yolu, rapor dosyalarının bulunduğu dizini Codemagic'in yapıları dışa aktarmak için kullandığı dizine kopyalamaktır. Betiğinizde kullanabileceğiniz bu dizine başvuran $CM_EXPORT_DIR adında yerleşik bir ortam değişkeni vardır.
Bunu yapmak için komut dosyası şu şekilde olmalıdır:
scripts: ... - name: Export Patrol test report script: | cp -r build/app/reports/androidTests/connected $CM_EXPORT_DIR/report ...
Patrol nihayet yerel özellikleri içeren kullanıcı arayüzü ve entegrasyon testlerini çalıştırma sorununun üstesinden geldi. Artık yerel özellikleri test etmek ve kimlik doğrulama akışları, yerel diyaloglar ile etkileşimde bulunmak, hatta wifi, hücresel, karanlık mod gibi yerel özellikler arasında geçiş yapmak ve hatta uygulamanızı en aza indirip en üst düzeye çıkarmak artık mümkün. Ek olarak, hem ücretsiz hem de açık kaynaktır ve Flutter'ın piyasaya sürülmesinden bu yana var olan gerçek bir soruna çözüm sağlar. Dahası, onu Codemagic iş akışlarınıza eklemek ve kullanmak çok kolaydır. LeanCode'un yaptığı harika işi desteklemek istiyorsanız Patrol'e pub.dev'den bir beğeni yapın
Bu makale Çözüm Mühendisliği Başkanı Kevin Suhajda tarafından yazılmıştır.
Burada da yayınlandı.