Cypress İpuçları #4: HTTP İstekleri Yapmak
Cypress serisindeki bir önceki yazı: Cypress İpuçları #3: Custom Command Tanımlamak
Motivasyon
Cypress ile uçtan uca testler yazarken kimi zaman test senaryoları içerisinde HTTP istekleri yapmamız gerekebiliyor. Yine bir gerçek hayat senaryosu üzerinden gidelim. E-ticaret sitemizde bir üye kayıt formu olduğunu ve bu formun doğru şekilde doldurulup gönderildiği takdirde üye kaydının yapılıp yapılmadığını test ettiğimizi varsayalım.
Bu testi yazmaya başladığımızda kabaca iki sorun çıkacak karşımıza.
- Testimiz her çalıştığında sistemde yeni bir kullanıcı yaratılacak. Daha önce kayıt olan kullanıcıyı aynı bilgilerle tekrar yaratamayacağımız için ikinci defa çalıştırdığımızda, kayıt fonksiyonları doğru şekilde çalışıyor olsa dahi testimiz başarısız olacak. Yani deterministik olmayacak. Bunun önüne geçmek için elimizde çok sayıda kullanıcı bilgisi içeren bir havuz bulundurabilir veya faker.js gibi kütüphanelerle anlık sahte kullanıcı bilgileri oluşturabiliriz. Fakat her iki durumda da bir sonraki sorunun oluşmasına engel olamayız.
- Kirli veri oluşması. Testi her çalıştırdığımızda sistemde atıl şekilde duran bir kullanıcı yaratmış olacağız ve bu kullanıcıların sayısı her geçen gün giderek artacak, artacak ve artacak.
Bunun önüne geçmek için testler sonucunda oluşan kirli veriyi belirli periyotlarla temizlemeye ihtiyacımız var. Kullanılan en yaygın pratik ise bunu bir API marifetiyle tek tek veya toplu olarak yapmak.
Yerleşik HTTP İstemcisi: Request
API üzerinde /api/test-data ucu olduğunu varsayalım. Bu uca yapılan DELETE istekleri kirli veriyi temizliyor olsun. Normal şartlarda Cypress, Node.js üzerinde koştuğu için bu HTTP isteğini axios, node-fetch gibi kütüphaneler aracılılığıyla ya da söz dizimi diğerlerine göre biraz daha karmaşık olarak standart https modülüyle yapmak gerekecekti. Fakat Cypress, içerisinde request kütüphanesinin bir fork’unu bulunduruyor. Bu sayede ek bir kurulum yapmadan pratik şekilde HTTP istekleri yapabiliyoruz.
İlk olarak kirli veriyi temizleyecek HTTP isteğini bir önceki yazıda bahsettiğimiz şekilde custom command hâline getirelim ki tekrar tekrar kolayca kullanabilelim. İsteğimiz oldukça basit. Sadece yetkilendirme için tek bir authorization
header’ımız var.
Artık oluşturduğumuz custom command’i test senaryosu içerisinde kullanabiliriz. Cypress’in sağladığı after()
hook’u sayesinde clearDirtyData()
metodunun tüm test blokları başarılı olduktan sonra çağrılması gerektiğini belirtebiliyoruz. Kullanım tercihine göre before()
hook’unu kullanarak teste başlamadan önce de kirli verileri temizleyebilirdik.
Sonuç
Bu senaryo özelinde, elimizde sisteme kaydedilecek tek bir kullanıcı bilgisi olsa dahi kayıt fonksiyonlarını istediğimiz kadar test edebilir durumdayız. Test sonuçlarını bir kaynağa raporlamak, başarısız olan testler için alarm sistemleri oluşturmak, test senaryoları içerisinde HTTP istekleri yapmamızı gerektirecek diğer senaryolara örnek olarak verilebilir.
Kaynaklar
Cypress serisindeki bir sonraki yazı: Cypress İpuçları #5: Chrome DevTools Recorder ile Test Senaryoları Oluşturmak