6.2. Sektördeki Gerçek Senaryo: Test Script’lerinin Göremediği Hayalet Bakiye

Küresel ölçekte hizmet veren bir kripto para ve yatırım platformu, kullanıcıların vadeli işlem cüzdanları ile ana nakit (spot) cüzdanları arasında anlık para transferi yapabilmesini sağlayan yeni bir finansal modülü canlıya almaya hazırlanıyordu.

Kalite ekibi son derece titizdi. Şartnameye dayalı tam 150 adet detaylı test senaryosu kaleme alındı:

  • Bakiye yeterli mi? $\rightarrow$ Test edildi, geçti.

  • Eksi bakiye girilince ne oluyor? $\rightarrow$ BVA ile denendi, engellendi.

  • Sistem bakımdayken transfer yapılıyor mu? $\rightarrow$ Hata mesajı doğrulandı.

150 testin tamamı yeşil yandı. Ürün yöneticisi “Sistem kusursuz, canlıya çıkabiliriz” onayını verdi ve özellik yayına alındı.

Ancak canlıya çıkışın henüz 48. saatinde şirketin risk izleme panellerinde kırmızı alarmlar çalmaya başladı: Sistemde tam 800.000 dolarlık karşılıksız bir bakiye açığı vardı!

Milyonluk Açığın Arkasındaki Sıra Dışı Yolculuk

Sistemden para çalan bir kullanıcının hareketleri geriye dönük incelendiğinde, hiçbir test dokümanında yazmayan akılalmaz bir kullanıcı davranışı ortaya çıktı:

  1. Kullanıcı, transfer ekranına girip telefonunu bilerek uçak moduna alıyordu (İnterneti bilerek koparıyordu).

  2. Telefonu uçak modundan çıkardığı o ilk yarım saniyede; internet sinyali tam oturmadan, telefonun ekranında aynı anda beliren hem “İşlemi İptal Et” hem de “Parayı Ana Cüzdana Aktar” butonlarına iki parmağıyla aynı anda ve çılgınca basıyordu!

  3. Sunucu, internetin ilk bağlandığı o mikrosaniyelik gecikme aralığında iki isteği de aynı anda yakalıyor; veritabanı kilit mekanizması yetişemeden hem parayı cüzdana aktarıyor hem de iptal edilen tutarı yerinde bırakıyordu.

  4. Kullanıcı, sistemde olmayan hayali bir parayı saniyeler içinde çiftleyerek platform dışına transfer etmişti.

Neden 150 Senaryonun Hiçbiri Bu Hatayı Yakalayamadı?

Çünkü yazılmış olan o 150 senaryo birer “tren rayıydı”:

  • Adım 1: Uygulamayı aç.

  • Adım 2: Tutarı gir.

  • Adım 3: Transfer et butonuna bas.

Hiçbir analist şartnameye “Kullanıcı uçak modunu açıp kapatırken ekrandaki iki zıt butona aynı anda üçer kez basarsa ne olur?” şeklinde bir madde yazmaz; yazamaz! İnsan hayal gücünün ve sınırları zorlama dürtüsünün sonu yoktur.

Bu korkunç açık; ancak elindeki standart adımları bir kenara bırakıp sistemin zayıf karınlarını koklayan, “Bu sistem internet koptuğunda ya da arka arkaya basıldığında nasıl tepki verir?” şüphesiyle hareket eden kıdemli bir testçinin Keşifçi Test Seansı (Exploratory Testing Session) sırasında yakalanabilirdi.

Mühendislik Dersi: Senaryolu testler (Scripted Testing) evin kapısının kilitli olup olmadığını denetler. Keşifçi Test (Exploratory Testing) ise hırsızın balkondan, bacadan veya havalandırma boşluğundan nasıl sızabileceğini araştıran canlı insan zekâsıdır. İkisi bir arada olmadan gerçek güvenlik sağlanamaz.

4. “Bir de Şöyle Düşün” (Kutu İçeriği)

💡 Bir de Şöyle Düşün: Metro Turnikesine İki Kişi Aynı Anda Yüklenirse

Bir metronun kart basma turnikesini düşün:

  • Senaryolu Test (Scripted): Turnikeye yaklaşırsın, kartını okutursun, bip sesini duyunca kolu itip geçersin. Bu mutlu yoldur; 1.000 kez denesen de turnike kusursuz çalışır.

  • Keşifçi Zihniyet (Pestisit Avcısı): Turnike koluna iki kişi aynı anda omuz atarsa ne olur? Biri kart basarken diğeri tam o mikrosaniyede kolu geri çekerse mekanizma boşa çıkar mı?

Yazılımda iki farklı isteğin aynı anda aynı kaynağa saldırmasına Yarış Durumu (Race Condition) denir. Standart testler sakin kullanıcıyı temsil eder; keşifçi test ise sistemi bu tür izdiham anlarında köşeye sıkıştırır.

5. Mini Alıştırma

Senaryo: Bir yemek sipariş uygulamasında “İlk Siparişe Özel 100 TL İndirim Kuponu” tanımlandı. Ekip kuponun tek bir kullanıcı tarafından yalnızca 1 kez kullanılabileceğini doğrulayan 10 adet standart test koştu ve geçti.

Soru: Keşifçi Test (Exploratory Testing) yaklaşımını benimsemiş bir test mühendisi olarak, yukarıdaki borsa felaketinden çıkardığın dersle; bu kupon mekanizmasını alışılmışın dışında sınamak için kurgulayacağın en yaratıcı yarış durumu (race condition) senaryosu ne olurdu?

Senaryo: Aynı kullanıcı hesabını iki farklı telefonda (veya bir telefon bir web tarayıcısında) aynı anda açarım. Sepetlere aynı kupon kodunu tanımlarım. Her iki cihazdan tam aynı saniyede “Siparişi Onayla” butonuna basarak; sistemin kuponu tek bir siparişe mi düşeceğini, yoksa mikro saniyelik gecikmede iki siparişe birden 100’er TL (toplam 200 TL) indirim uygulayıp uygulamayacağını test ederim.