Test ortamında SMS sağlayıcınızı otpmock'a yönlendirin. Uygulamanız kodu her zamanki gibi "gönderir", kod otpmock'ta durur, testiniz onu HTTPS ile okuyup forma yazar. Doğru kod, yanlış kod, yeniden gönderme ve tek kullanımlık kod senaryolarını canlı SMS ya da koda gömülü sabit bir kod olmadan, her CI koşusunda sınayabilirsiniz.
Bu akışlar neden ayrıca test edilmeli?
Giriş ekranındaki OTP bozulursa kullanıcı içeri giremez ve fark edilir. Puan harcama ya da iade onayındaki doğrulama bozulursa ise tersi olur: kimse fark etmez, çünkü işlem sorunsuz geçer. Doğrulama adımı sessizce atlanan bir akış, ancak kasadaki fark ya da müşteri şikâyetiyle ortaya çıkar. Bu yüzden asıl sınanması gereken, kodun gelmesi kadar, yanlış durumlarda işlemin geçmemesi.
Hangi senaryolar sınanmalı?
| Akış | Test edilecek davranış |
|---|---|
| Puan harcama | Doğru kodla bakiye düşer; yanlış kodla düşmez. |
| İade onayı | Kod yalnızca o iade için geçerlidir; başka bir iadeye taşınamaz. |
| Yönetici onayı gerektiren işlem | Kod yetkili kişinin numarasına gider, müşterinin numarasına değil. |
| Müşteri bilgisi güncelleme | Yeni telefon numarasına kod gider; eski numaraya gitmez. |
| Yeniden gönder | İkinci kod gelir; uygulamanızın politikasına göre ilk kod geçersiz olur. |
| Tek kullanımlık kod | Aynı kod ikinci kez girildiğinde reddedilir. |
| Deneme sınırı | Art arda yanlış girişten sonra akış kilitlenir ya da yeni kod ister. |
| Süre aşımı | Süresi dolan kod reddedilir. |
Bunların hepsi uygulamanızın davranışı; otpmock yalnızca kodu size ulaştırır. Hangi kuralın geçerli olduğuna (kaç deneme, kaç dakika, ilk kod geçersiz mi) siz karar verirsiniz, test de onu doğrular.
1. adım: SMS sağlayıcınızı test ortamında otpmock'a yönlendirin
Hangi servisi kullandığınıza göre kurulum değişir; her biri tek bir ayardır ve canlı ortamınız etkilenmez:
- Netgsm, İleti Merkezi, Verimor, Mutlucell
- Twilio, Vonage ve diğer uluslararası servisler için sağlayıcı sayfaları (İngilizce)
Test ortamında iki değişken yeter: OTPMOCK_URL=https://api.otpmock.com ve sağlayıcı kimlik bilgisi yerine otpmock API anahtarınız. Anahtarı ücretsiz hesapla alırsınız.
2. adım: testleri yazın
Bağımlılığı olmayan otp yardımcısını curl -O https://otpmock.com/sdk/otpmock.ts ile indirin. Her test kendi telefon numarasını üretsin; paralel koşan testler birbirinin kodunu okumasın. Aşağıdaki örneklerde musteriOlustur ve bakiye, kendi test verinizi hazırlayan ve okuyan yardımcılarınızı temsil ediyor (API ya da veritabanı üzerinden).
Doğru kodla puan harcama
import { test, expect } from "@playwright/test";
import { OtpMock } from "./otpmock";
const otp = new OtpMock({ baseUrl: process.env.OTPMOCK_URL!, apiKey: process.env.OTPMOCK_API_KEY! });
test("puan harcama: doğru kodla işlem tamamlanır", async ({ page }) => {
const telefon = otp.randomPhone("+905");
await musteriOlustur({ telefon, puan: 500 });
await page.goto("/kasa");
await page.getByLabel("Müşteri telefonu").fill(telefon);
const since = Date.now() - 5_000;
await page.getByRole("button", { name: "Puan kullan" }).click(); // uygulama SMS'i gönderir
const { code } = await otp.waitForCode(telefon, { since });
await page.getByLabel("Doğrulama kodu").fill(code);
await page.getByRole("button", { name: "Onayla" }).click();
await expect(page.getByText("Puan kullanıldı")).toBeVisible();
expect(await bakiye(telefon)).toBe(400); // 100 puan harcandı
});Yanlış kodla işlem geçmemeli
Asıl değeri olan test genellikle bu. Doğru kodu okuyup bilerek yanlışını yazıyoruz ve bakiyenin değişmediğini doğruluyoruz.
test("puan harcama: yanlış kodla bakiye düşmez", async ({ page }) => {
const telefon = otp.randomPhone("+905");
await musteriOlustur({ telefon, puan: 500 });
await page.goto("/kasa");
await page.getByLabel("Müşteri telefonu").fill(telefon);
const since = Date.now() - 5_000;
await page.getByRole("button", { name: "Puan kullan" }).click();
const { code } = await otp.waitForCode(telefon, { since });
const yanlis = code === "000000" ? "111111" : "000000";
await page.getByLabel("Doğrulama kodu").fill(yanlis);
await page.getByRole("button", { name: "Onayla" }).click();
await expect(page.getByText("Kod hatalı")).toBeVisible();
expect(await bakiye(telefon)).toBe(500); // hiçbir şey değişmedi
});Yeniden gönderme yeni bir kod üretmeli
İkinci kodu okurken since değerine ilk mesajın zamanını verin; böylece eski kodu yanlışlıkla tekrar okumazsınız.
test("yeniden gönder: yeni kod gelir", async ({ page }) => {
const telefon = otp.randomPhone("+905");
await musteriOlustur({ telefon, puan: 500 });
await page.goto("/kasa");
await page.getByLabel("Müşteri telefonu").fill(telefon);
const since = Date.now() - 5_000;
await page.getByRole("button", { name: "Puan kullan" }).click();
const ilk = await otp.waitForCode(telefon, { since });
await page.getByRole("button", { name: "Yeniden gönder" }).click();
const ikinci = await otp.waitForCode(telefon, { since: ilk.receivedAt + 1 });
expect(ikinci.code).not.toBe(ilk.code);
// Politikanız ilk kodu geçersiz kılıyorsa: ilk kodu girip reddedildiğini de doğrulayın.
});Tek kullanımlık ve deneme sınırı
Aynı kalıpla iki senaryo daha yazılır: kodu bir kez doğru girin, işlemi tamamlayın, sonra aynı kodla ikinci bir işlem başlatıp reddedildiğini doğrulayın. Deneme sınırı için ise döngüde art arda yanlış kod girip uygulamanızın kilitlendiğini ya da yeni kod istediğini doğrulayın. Her ikisinde de kodu otpmock'tan okumanız yeter.
Süre aşımı nasıl test edilir?
otpmock mesajı 10 dakika saklar, ama uygulamanızın kod süresi büyük olasılıkla bundan kısa (örneğin 3 dakika). Testte 3 dakika beklemeyin. Test ortamında kod süresini kısa bir değere (örneğin 5 saniye) çeken bir yapılandırma ekleyin, kodu okuyun, süre kadar bekleyin ve eski kodun reddedildiğini doğrulayın. Süre aşımı kuralını uygulamanız uyguladığı için bu, otpmock'tan bağımsız ve hızlı bir testtir.
"Test numarasına sabit kod" neden bu akışlarda daha da riskli?
Test sırasında zahmet çıkmasın diye belirli numaralara 000000 gibi sabit bir kod tanımlamak yaygın bir kısayol. Puan harcama ve iade gibi parayla ilgili akışlarda bu, koda gömülü bir arka kapıdır: yanlış bir yapılandırmayla canlıya çıkarsa o numaraya bağlı kartların işlemleri herkese açık olur. otpmock'la kod gerçekten üretilir ve gerçek yoldan okunur; uygulamanızda test için ayrı bir kod yolu bulunmaz.
Test verisi ve kişisel veri
Test ortamına gerçek müşteri numaralarını ya da kart bilgilerini taşımayın; randomPhone gibi uydurma numaralar testler için yeterli. otpmock'a gönderdiğiniz telefon numaraları ve mesaj metni 10 dakika boyunca saklanır, sonra silinir. Doğrulama akışlarınızın kişisel verilerin korunması mevzuatına uygunluğu konusunda kendi hukuk ya da uyum ekibinize danışın: otpmock bir test aracıdır, hukuki danışmanlık vermez ve belirli bir mevzuata uyum garantisi sunmaz.
Sık sorulanlar
SMS'in müşterinin telefonuna gerçekten ulaştığını bu yöntemle test edebilir miyim?
Hayır. otpmock uygulamanızın davranışını sınar, operatör teslimatını değil. Gerçek teslimatı ayrı ve küçük bir kontrolle (örneğin canlıda belirli aralıklarla kendi numaranıza bir deneme mesajı) doğrulayın; ana test takımınızı otpmock'ta tutun.
Doğrulamayı SMS yerine başka bir yöntemle (push bildirimi, biyometrik, passkey) yapıyorsak?
otpmock yalnızca SMS ile gelen kodları yakalar. Cihaz ya da biyometri gerektiren yöntemleri test etmez; bunlar için uygulamanızın ya da sağlayıcının test modunu kullanmanız gerekir.
Birden fazla mağaza ya da kasa simülasyonu paralel koşabilir mi?
Evet. Her teste kendi numarasını verirseniz paralel işçiler birbirinin kodunu okumaz. Aylık mesaj hakkınızı (ücretsiz planda 300) tüketen şey her gönderilen SMS'tir; büyük bir takım için planlara bakın.
Canlı ortamda kullanabilir miyim?
Hayır, kullanmamalısınız. otpmock gerçek SMS göndermez; yalnızca test ve staging ortamları içindir. Canlı ortamınız SMS sağlayıcınızla çalışmaya devam eder.
Ücretsiz plan ayda 300 mesaj içerir, kart gerekmez.
Ücretsiz API anahtarı al