Onay postası, bir kayıt akışının tarayıcı testinin tek başına yürütemeyeceği parçasıdır. Bir şeyin bir adresi tutması, mesajı alması ve kodu teste geri vermesi gerekir. Geçici posta kutusu API tam olarak bunu yapar: test paketi HTTP üzerinden bir servisten kutu açmasını ister, geleni okur ve senaryo bitince kutuyu atar. Tarayıcı yok, insanların paylaştığı bir kutu yok ve elle kopyalama yok.
Bu yazı, bu düzeneğin API tarafını anlatır. Uygulamayı yerel bir alıcı uç noktaya yöneltmekle ilgili değildir; o, CI içinde postayı yakalamanın yolu olup ikisi farklı sorunları çözer. Yerel yakalama, uygulamanızın ne gönderdiğini kanıtlar. Posta kutusu API ise gerçek bir teslim yolundan, testin sahip olduğu bir adrese gerçekte ne ulaştığını kanıtlar.
Testlerde neden bir posta kutusu API kullanılır?
Çünkü alternatif ya gerçek bir insan kutusu ya da hiçbir şeydir.
Paylaşılan bir kutu kötü bir test düzeneğidir. Birden çok koşu aynı kutuyu okur, önceki koşunun mesajları hâlâ oradadır ve adres kimsenin istemediği trafiği biriktirir. Böylece her doğrulama, hangi mesajın güncel senaryoya ait olduğunu tahmin etmek zorunda kalır ve kararsızlık tam da bu tahminden doğar.
Bir sağlayıcının web arayüzünü tarayıcıyla toplamak ikinci kötü seçenektir. Testi habersiz değişen biçimlendirmeye, oturum durumuna ve paketin sürekli kollaması gereken bir oturum açmaya bağımlı kılar. Sağlayıcı bir düğmenin görünümünü değiştirdiği an, yeşil bir paket ürünle hiç ilgisi olmayan bir nedenle kırmızıya döner.
Posta kutusu API iki sorunu da ortadan kaldırır. Adres senaryo için oluşturulur, yapısı gereği boştur ve testin doğrudan çağırabileceği kararlı bir arayüzden okunur. Paket artık sağlayıcının nasıl göründüğünü değil, sözleşmenin tutulmasını önemser: oluştur, al, oku, sil.
Bir de gizlilik gerekçesi vardır. API ile oluşturulan bir adres kimseyi temsil etmez. Bir kişinin kutusu değildir, gerçek bir mesajın düşebileceği bir yer değildir ve koşuyla birlikte çöpe atılır.
Bir test gerçekte hangi uç noktalara ihtiyaç duyar?
Bir posta kutusu API onlarca yol sunabilir ama bir test istemcisinin dört işleme ihtiyacı vardır ve bunları paketin kullanacağı biçimde adlandırmak işi kolaylaştırır.
Oluştur, bir adres ve bir tutamaç döndürür. Adres, test edilen uygulamaya gönderim hedefi olarak söylenen değerdir. Tutamaç, çoğu zaman bir jeton ya da tanımlayıcıdır ve sonraki her çağrıda o kutu hakkında soru sormak için kullanılır. Paket, ikisini tek bir nesne olarak ele almalı ve tutamacı adresten asla yeniden kurmamalıdır; sağlayıcılar ikisini ilgisiz kılmakta serbesttir.
Liste, gövde yerine özet döndürür: her mesaj için bir kayıt, tanımlayıcı, gönderen, konu ve varış zamanıyla birlikte. Yoklama döngüsünün kullanması gereken çağrı budur; çünkü ucuzdur ve başlangıçta önemli olan tek soruya, yani bir şey gelip gelmediğine yanıt vermeye yeter.
Okuma, bir mesajı metin ve HTML parçalarıyla birlikte tümüyle döndürür. Kod buradadır ve bu çağrı ancak liste bir eşleşme bildirdikten sonra yapılmalıdır.
Temizleme, kutudaki mesajları siler ya da kutuyu tamamen siler. Testin buna iki nedenle ihtiyacı vardır: yeni adres açmadan denemeler arasında sıfırlamak ve senaryo bittiğinde ortadan kaldırmak.
Bazı servisler, bir mesaj gelene ya da zaman aşımı dolana kadar bağlantıyı tutan bir bekleme veya uzun yoklama uç noktası ekler. Kullanışlıdır ama istemci yine de listeye dönebilmelidir; çünkü bekleme çağrısı hız sınırına en çok takılan parçadır.
Kodu dalgalanma yaratmadan nasıl yoklarız?
Bu tür testlerde en sık görülen hata sabit beklemedir. Belirli bir saniye sayısı bir tahmindir: teslim yavaşken çok kısa, hızlıyken boşa uzun ve yüklü bir CI makinesinde her iki yönde de yanlıştır. Onu listeyi çağıran, eşleşmeyi denetleyen ve bulur bulmaz dönen bir döngüyle değiştirin; işi askıya almak yerine testi düşüren bir üst sınır koyun.
Eşleştirme, sorunun diğer yarısıdır. Testin istediği mesaj, senaryonun oluşturduğu adrese gönderilendir ve kutu birden fazla türde posta tutabiliyorsa konusunda kararlı bir parça taşıyandır. Eşleşmeler arasında en yenisini seçin; böylece bir yeniden denemenin yarattığı yinelenen teslim okumayı şaşırtmaz. İlk mesajı asla koşulsuz almayın; yeniden kullanılan bir adreste eski bir kod tam da böyle doğrulanır.
Çıkarımın bir çapası olmalıdır. Bir gövde referans numarası, zaman damgası ve fiyat içerebilir; ilk rakam dizisini kapatan bir ayrıştırıcı bazen kodun yerine bunlardan birini alır. Kodu tanıtan ifadeyi arayın, kodu onun yakınından okuyun ve hiçbir şey eşleşmezse gövdeyi ekleyerek başarısız olun.
Son olarak yeniden gönderme sınırına saygı gösterin. Bir kod akışı genelde kısa bir pencerede yalnızca birkaç gönderime izin verir ve bu sınır test edilen davranışın parçasıdır. Yeni bir kod almak için düğmeye yeniden basan test eninde sonunda reddedilir ve yanlış nedenle düşer. Yeniden deneme, kutu yine okunarak yapılır; yeni bir mesaj tetiklenerek değil.
Uçtan uca ya da CI paketine nasıl bağlanır?
Temiz biçim bir düzenektir. Akış başlamadan önce düzenek bir kutu oluşturur ve adresini döndürür. Test, uygulamayı bu adresle sürer. Uygulama bir şey gönderdiğini doğruladıktan sonra doğrulama kutuyu okur ve kodu çıkarır. Senaryo bittiğinde düzenek kutuyu siler.
İstemciyi küçük ve enjekte edilebilir tutun. Bir modül dört çağrıyı sarar; test, paketin her yerine dağılmış ham HTTP’ye değil o modüle bağlıdır. Bu, birim testlerinde sahte bir uygulamayla değiştirmeyi ve doğrulamaları yeniden yazmadan aynı paketi başka bir sağlayıcıya yöneltmeyi mümkün kılar.
CI içinde kimlik bilgileri işin gizli deposunda durur; depoda ve günlük satırında asla. Her işe ya da her paralel çalışana kendi kutusunu verin ve üretilen adreslere koşuyu tanıtan bir önek ekleyin; böylece başıboş bir mesaj gözle ilişkilendirilebilir. İstemcinin zaman aşımını işin kendi zaman aşımının altına koyun; böylece takılan yoklama, ani bir iş iptali yerine açık bir mesajla başarısız olur.
Yeniden denenecek şey okumadır, akışın tamamı değil. Kod henüz gelmediyse bekleyip yeniden okuyun; kaydı yeniden çalıştırmak ikinci bir mesaj ve onunla birlikte doğrulama için ikinci bir aday üretir. Ayrıca posta kutusu API’yi üretim akışlarından uzak tutun: o bir test altyapısıdır ve bir paket onun üzerinden gerçek bir müşteriye asla gönderememelidir.
Kodun çevresindeki akış, okuma mekaniği değil, e-posta doğrulama akışı testi yazısında ele alınır; ayrıştırma adımı ise uçtan uca testlerde OTP yazısının konusudur.
Yalıtım ve temizlik
Senaryo başına bir adres, senaryolar arası hataların çoğunu önleyen kuraldır. Hangi mesajın kime ait olduğunu akıl yürütme gereğini ortadan kaldırır ve kutunun baştan beri yalnızca bir senaryonun trafiğini almış olması sayesinde tazelik sorununu da yok eder.
Temizlik açık ve koşulsuz olmalıdır. Kutuyu yalnızca mutlu yolda değil, senaryo geçse de düşse de çalışan bir bitirme adımında silin. Sağlayıcının yaşam süresine tek başına güvenmek hatadır: mesaj, aynı makinedeki sonraki bir koşu tarafından okunacak kadar uzun kalabilir ve o süre bir kolaylıktır, garanti değil.
Temizlik başarısız olursa kaydedin ve paketin bitmesine izin verin. Bir temizlik hatası bilinmeye değerdir ama ürün hatasıyla aynı şey değildir ve onun yüzünden koşuyu düşürmek ekibe bitirme adımı hatalarını yok saymayı öğretir. Adresin aldığı her şeyi test verisi olarak görün: tek bir doğrulama için vardır, dışa aktarılmamalı ve paylaşılmamalıdır ve hiçbir zaman birinin iletişim noktası olarak ele alınmamalıdır.
Sınırlar ve uyarılar
Posta kutusu API yine de üçüncü taraf bir bağımlılıktır ve sınırları sizin sınırlarınız olur. Dakika başına hız sınırları, büyük bir paralel koşunun oluşturma dalgasını reddedebilir. Kotalar aynı anda var olabilecek adres sayısını sınırlar. Mesajlar gecikebilir ve geciken bir mesaj, gelene kadar kayıp olandan tam olarak ayırt edilemez.
Tek kullanımlık alan adları da geniş ölçüde engellenir. Bir sağlayıcının alan adı, tam da test ettiğiniz kayıt formu tarafından reddedilebilir; bu da meşru bir testi anlaşılmaz bir hataya çevirir. Böyle bir durumda yanıt, sağlayıcıya özel bir istisna açmak değil, test edilen ürünün tek kullanımlık adresleri bilerek reddedip reddetmediğini anlamak ve o davranışı bilinçli olarak test etmektir.
Dürüst özet şudur: posta kutusu API, neyin geldiğini doğrulamak için doğru araçtır. Uygulamanızın ne yaydığını doğrulamak içinse yerel bir alıcı uç nokta daha hızlıdır ve kotası yoktur. Olgun paketler genelde ikisini kullanır: doğrulamaların çoğu için yerel yakalama, gerçek teslim yolu testin konusu olduğunda ise yalnızca posta kutusu API.
Sonraki adımlar
Paylaşılan bir kutuyu yoklayarak kod okuyan bir test bulun ve onu posta kutusu API ile yeni adres oluşturan bir düzenekle değiştirin. Adresi koşuyla birlikte günlüğe yazın, bitirme adımında silin ve bugüne dek katlandığınız dalgalanmanın ne kadarının kendiliğinden durduğunu görün. Elle gerçek bir kutuya ihtiyaç duyduğunuzda geçici posta sayfası bir anda bir tane oluşturur ve verdiği adresler bir koşunun iskelesidir, asla gerçek bir kimlik değildir.