TestFly Bölüm 10: E-Posta ve 2FA Doğrulama Testleri — Mailhog ve Mailtrap
TestFly dahili Mailhog, Mailtrap ve IMAP istemcileriyle kullanıcı kayıt, şifre sıfırlama ve 2FA e-posta doğrulama akışlarını Java'da otomatize edin.
Özet: Kullanıcı kaydı, şifre sıfırlama ve iki faktörlü kimlik doğrulama (2FA) süreçleri uçtan uca testlerin en sık tıkandığı alanlardır. TestFly; Mailhog, Mailtrap, Outlook Graph ve genel IMAP protokollerini dahili olarak destekleyerek gelen kutusunu otomatik sorgulama, regex ile OTP kodlarını ayıklama ve doğrulama linklerine tıklama işlemlerini tek satıra indirir.
E-Posta Doğrulaması Neden E2E Testlerin En Büyük Tıkanma Noktasıdır?
Hemen hemen her modern web uygulamasında kayıt olurken veya hassas işlemlerde e-posta onayı zorunludur. Geleneksel otomasyon projelerinde bu durum şu zorlukları yaratır:
- Gerçek e-posta sağlayıcıları (Gmail, Outlook) bot korumaları, CAPTCHA ve istek sınırları koyar.
- Ekipler çoğu zaman test ortamlarında e-posta doğrulamasını kapatır; bu da canlı ortamda kritik güvenlik açıklarının ve regresyonların gözden kaçmasına yol açar.
- Harici kütüphaneler karmaşık MIME ayrıştırma kodları ve manuel
Thread.sleep()döngüleri gerektirir.
TestFly, BaseTest üzerinden doğrudan erişilebilen email() yardımcı motoruyla bu karmaşıklığı ortadan kaldırır.
TestFly E-Posta Sunucusuna Nasıl Bağlanır?
testfly.yml dosyasına ekleyeceğiniz tek bir blokla sağlayıcınızı tanımlayabilirsiniz:
email:
provider: mailhog # mailhog, mailtrap, outlook, imap
host: localhost
port: 8025
pollIntervalSeconds: 2
timeoutSeconds: 302FA / OTP Doğrulama Senaryosu Nasıl Yazılır?
Aşağıdaki örnekte kullanıcı arayüzünde kayıt formunu dolduran, gelen kutusunu dinleyen, 6 haneli doğrulama kodunu alan ve tarayıcıya girerek işlemi tamamlayan senaryo gösterilmektedir:
package io.testfly.examples.email;
import io.testfly.email.EmailMessage;
import io.testfly.test.BaseTest;
import org.testng.annotations.Test;
public class EpostaDogrulamaTesti extends BaseTest {
@Test
public void kullaniciKaydiVeIkiFaktorluDogrulama() {
String testEpostasi = "test_" + System.currentTimeMillis() + "@testfly.local";
// 1. Kayıt formunu doldur
open("/register");
find("#email-input").type(testEpostasi);
find("#submit-btn").click();
// 2. Gelen doğrulama e-postasını bekle
EmailMessage eposta = email().waitForMessage(sorgu ->
sorgu.to(testEpostasi).subjectContains("TestFly Hoş Geldiniz")
);
// 3. Regex ile 6 haneli OTP kodunu ayrıştır
String otpKodu = eposta.extractRegex("Doğrulama kodunuz: (\\d{6})");
// 4. Kodu tarayıcıya gir ve doğrula
find("#otp-input").type(otpKodu);
find("#verify-btn").click();
assertThat(find("#welcome-banner")).isVisible();
}
}Hangi E-Posta Sağlayıcıları Desteklenir?
| Sağlayıcı | Protokol | Kullanım Alanı |
|---|---|---|
| Mailhog | HTTP REST API | Lokal Docker ortamları, CI/CD pipeline'ları |
| Mailtrap | REST API & SMTP | Staging ve paylaşımlı test ortamları |
| Outlook Graph | Microsoft Graph API | Kurumsal Office 365 e-posta hesapları |
| Genel IMAP | SSL/TLS IMAP | Özel şirket içi e-posta sunucuları |
SSS
TestFly gelen kutusunu asenkron olarak bekler mi?
Evet. email().waitForMessage() metodu, aranan kriterlere uyan e-posta gelene kadar arka planda asenkron sorgulama yapar ve zaman aşımı durumunda bilgilendirici hata üretir.
E-posta içindeki onay butonuna doğrudan tıklanabilir mi?
Evet. eposta.extractLink("Hesabımı Onayla") metodu HTML içindeki linki otomatik yakalar ve open(link) ile doğrudan sayfaya gidilebilir.
Dinamik e-posta takma adları (alias) kullanılabilir mi?
Evet. kullanici+test1234@alanadi.com gibi dinamik adresler üretilip sorgu.to(...) filtresi ile tekilleştirilebilir.