Berk Akademi
Ana Sayfa
ÖZEL KODLAMA DERSLERİ
Yazılım Özel Ders
Tüm birebir programlara genel bakış
Python Yazılım Kursu
Sıfırdan ileri seviyeye birebir Python
Java Yazılım Kursu
OOP odaklı birebir Java eğitimi
AP Computer Science Principles
AP CSP sınav hazırlığı
GRUP DERSLERİ
Python & Django Masterclass
SINIRLI KONTENJAN
Java & Spring Boot Masterclass
SINIRLI KONTENJAN
C# .NET Masterclass
SINIRLI KONTENJAN
VİDEO DERSLER
Sıfırdan Temel Python Kursu
Kendi Hızında Öğren
ÜCRETSİZ
Seviye Testi
Ücretsiz — Python, Java, algoritma seviye testleri
Kariyerini Keşfet
Sertifika Doğrula
Belge numarası ve soyad ile doğrulama

Algoritmalarda Sınır Durumlarını Belirleme ve Test Senaryosu Yazma

algoritmalarda-sinir-durumlarini-belirleme-test-senaryosu-yazma
Bu yazıda neler var?
  1. Normal Girdide Çalışan Kod Neden Gizli Testte Kırılır?
  2. Sınır Durumu Kontrol Listesi Nasıl Oluşturulur?
  3. Kontrol Listesi Problem Türüne Göre Nasıl Uyarlanır?
  4. Test Oracle ile Beklenen Çıktı Nasıl Belirlenir?
  5. Üç Hatalı Testten Kök Nedene Nasıl Ulaşılır?
  6. Kendi Algoritman İçin Uygulanabilir Test Planı
  7. Sık Sorulan Sorular

Sınır durumu ve test senaryosu seçerken yalnızca tipik girdileri denemek yeterli değildir. İyi bir test, algoritmanın kararlarını, döngü sınırlarını ve giriş hakkında yaptığınız varsayımları zorlamalıdır. Gizli testlerde başarısız olan kodların önemli bir bölümü normal örnekte doğru çalışır; ancak boş, tek elemanlı, uç değerde veya özel yapılı girdilerde yanlış sonuç üretir.

Sınır durumu; girdinin izin verilen aralığın ya da yapısal çeşitliliğin uç noktasında bulunduğu veya algoritmanın özel bir davranış sergilemesini gerektirdiği durumdur. Bu nedenle “kod nerede kırıldı?” sorusundan önce “hangi varsayımım yanlış olabilir?” sorusunu sormak daha verimlidir.

Normal Girdide Çalışan Kod Neden Gizli Testte Kırılır?

Normal bir senaryoda listenin birkaç elemanı, farklı değerleri ve beklenen bir sıralaması vardır. Örneğin toplam hesaplayan bir algoritmayı yalnızca [4, 7, 2] ile test etmek, döngünün genel akışını gösterir; fakat listenin boş olması durumunda programın ne yapacağını göstermez. Benzer şekilde maksimum bulma kodu, tek elemanlı bir listede veya aynı maksimum değerin tekrar ettiği bir girdide farklı varsayımlarla karşılaşabilir.

def maksimumu_bul(sayilar):
    if not sayilar:
        return None

    en_buyuk = sayilar[0]
    for sayi in sayilar[1:]:
        if sayi > en_buyuk:
            en_buyuk = sayi
    return en_buyuk

print(maksimumu_bul([5, 5, 5]))

Bu örnekte tekrar eden maksimum değerler sorun çıkarmaz; ancak listenin boş olması için ayrıca karar verilmiştir. Eğer algoritma doğrudan sayilar[0] ifadesini kullanıp boş listeyi hesaba katmazsa, tipik testler başarılı olsa bile sınır testinde hata oluşur.

Gizli testler çoğu zaman algoritmanın “ortalama” kullanımını değil, problem sözleşmesinin uçlarını kontrol eder. Boş liste, tek eleman, izin verilen en küçük veya en büyük değer ve tekrar eden değerler bu yüzden önemlidir. Test seçerken şu çerçeveyi kullanın:

  • Algoritmanın hangi girdileri kabul ettiğini belirleyin.
  • Bu girdiler arasındaki uç noktaları ve yapısal farklılıkları çıkarın.
  • Her uç noktanın beklenen davranışını önceden yazın.
  • Problem koşulunda karşılığı olmayan testleri geçersiz kabul edip eleyin.

Sınır Durumu Kontrol Listesi Nasıl Oluşturulur?

Sınır Durumu Kontrol Listesi Nasıl Oluşturulur?

Aşağıdaki yedi maddelik liste iyi bir başlangıçtır. Ancak her maddeyi her probleme düşünmeden uygulamak yerine, problem koşuluyla ilişkilendirmek gerekir.

  • Boş girdi: Liste toplamında sonuç genellikle problem sözleşmesine göre belirlenir; maksimum bulmada None veya hata beklenebilir; aramada ise sonuç çoğunlukla “bulunamadı” olmalıdır.
  • Tek eleman: Tek elemanlı listenin toplamı o elemandır, maksimumu yine o elemandır; arama işleminde hedef eşleşiyorsa bulunan konum tek geçerli konumdur.
  • İzin verilen en küçük değer: Toplam probleminde bu değerle taşma veya yanlış başlangıç kontrol edilir; maksimum probleminde başlangıç değeri doğru seçilmelidir; aramada en küçük değer doğru karşılaştırılmalıdır.
  • İzin verilen en büyük değer: Toplamda aritmetik sınırlar, maksimumda başlangıç ve karşılaştırma mantığı, aramada ise uç değer karşılaştırmaları denenir.
  • Tekrar eden değerler: Liste toplamı tekrarları ayrı eleman olarak saymalı, maksimum doğru değeri korumalı, arama ise ilk eşleşmeyi mi yoksa tüm eşleşmeleri mi döndüreceğini netleştirmelidir.
  • Sıralı ve ters sıralı veri: Toplam sonucu değişmemelidir; maksimum her iki sırada da aynı kalmalıdır; arama algoritması sıralı veri varsayıyorsa ters sıralı giriş geçerli olmayabilir.
  • Beklenmeyen biçim veya geçersiz değer: Negatif sayı kabul etmeyen problemde negatif girdi geçersizdir; toplam, maksimum ve arama için bu tür veri ancak sözleşme izin veriyorsa test edilmelidir.

Özellikle boş girdinin sonucu otomatik olarak tahmin edilmemelidir. Problem, boş listeyi kabul ediyorsa beklenen bir değer veya kontrollü hata tanımlanmalıdır. Kabul etmiyorsa bu girdi geçerli test değil, sözleşme ihlali sayılır.

Bu listeyi uyguladıktan sonra kendi algoritma temelinizi görmek için ücretsiz kodlama bilgisi testi çözebilir; hangi konularda daha fazla pratik yapmanız gerektiğini belirleyebilirsiniz.

Kontrol Listesi Problem Türüne Göre Nasıl Uyarlanır?

Sınır durumu kontrol listesi, her probleme aynı testleri uygulatan mekanik bir reçete değildir. Önce problem sözleşmesi çıkarılmalı; algoritmanın hangi girdileri kabul ettiği, hangi sonucu üretmesi gerektiği ve hangi varsayımlara dayandığı belirlenmelidir. Aksi hâlde boş liste gibi yaygın bir test eklenebilir fakat problemin asıl riski olan sıralılık koşulu gözden kaçabilir.

Testleri seçmeden önce şu sorular sırayla yanıtlanmalıdır:

  1. Girdi türü nedir: sayı, metin, liste veya başka bir yapı mı?
  2. Boş girdi kabul ediliyor mu?
  3. Değerlerin alt ve üst sınırı nedir?
  4. Verinin sıralı olduğu garanti ediliyor mu?
  5. Aynı değer birden fazla kez bulunabilir mi?
  6. Geçersiz girdide hata, özel değer veya başka bir davranış mı bekleniyor?

Bu soruların cevapları, genel kontrol listesindeki hangi maddelerin gerekli olduğunu belirler. Örneğin lineer arama sıralılık gerektirmezken ikili aramanın doğruluğu sıralılık varsayımına bağlıdır. Öğrenci, bu ayrımları ne kadar iyi kurabildiğini algoritma bilgi testi ile ayrıca değerlendirebilir.

Problem türü Özellikle kontrol edilecek sınır durumları Dikkat edilecek varsayım
Liste toplamı Boş liste, tek eleman, negatif değerler, sıfırlar Boş listenin toplamının nasıl tanımlandığı
Maksimum bulma Tek eleman, tüm değerlerin negatif olması, tekrar eden maksimum Boş girdide sonuç üretmenin mümkün olup olmadığı
Lineer arama İlk ve son konum, bulunamayan değer, tekrar eden hedef Birden fazla eşleşmede hangi konumun döndürüleceği
İkili arama İlk ve son konum, tek eleman, bulunamayan hedef Girdinin sıralı olma zorunluluğu ve tekrar eden değer politikası

İkili aramada sıralı olmayan bir liste kullanmak, her zaman algoritmanın sınır durumunu test etmek anlamına gelmez. Problem yalnızca sıralı girdi kabul ediyorsa bu örnek geçersiz girdi davranışını sınar. Sıralı bir listenin ilk veya son elemanını aramak ise algoritmanın geçerli çalışma alanındaki sınırlarını kontrol eder.

Test Oracle ile Beklenen Çıktı Nasıl Belirlenir?

Test Oracle ile Beklenen Çıktı Nasıl Belirlenir?

Test oracle, verilen bir test girdisi için üretilen çıktının doğru olup olmadığını belirleyen yöntemdir. Beklenen sonuç, test edilen kod çalıştırılıp ekrandaki değer kopyalanarak oluşturulmamalıdır. Problem metnindeki kurallardan, elle hesaplamadan veya bağımsız bir referans yöntemden türetilmelidir.

Liste toplamında küçük girdiler elle toplanabilir. Maksimum bulmada birkaç eleman gözle karşılaştırılabilir. Daha büyük örneklerde ise test edilen algoritmanın aynısını yeniden yazmak yerine bağımsız bir yöntem kullanılmalıdır. Örneğin maksimum değer, listenin sıralanmış hâlinin son elemanıyla karşılaştırılabilir. Böylece ana algoritmadaki yanlış başlangıç değeri veya eksik karşılaştırma hatasının oracle içinde tekrarlanma olasılığı azaltılır.

Girdi Beklenen çıktı Bu testin kontrol ettiği varsayım
[] Problem sözleşmesinde tanımlanan boş girdi davranışı Boş girdinin kabul edilip edilmediği
[-8, -3, -11] -3 Maksimum değer başlangıcının sıfır kabul edilmemesi
[4, 9, 9, 2] 9 Tekrarlanan maksimumların sonucu değiştirmemesi

Sağlam bir test matrisi oluştururken önce girdiyi seçin, ardından kodu çalıştırmadan beklenen çıktıyı hesaplayın. Son olarak bu testin hangi varsayımı denetlediğini yazın. Gerçek sonuç beklenen sonuçtan farklıysa yalnızca “test başarısız” demek yerine, ihlal edilen varsayımı inceleyerek kök nedene daha hızlı yaklaşabilirsiniz.

Üç Hatalı Testten Kök Nedene Nasıl Ulaşılır?

Bir algoritmanın normal girdilerde çalışması, problem koşullarının tamamını doğru ele aldığı anlamına gelmez. Kök nedeni bulmanın en etkili yolu, başarısız testi rastgele değiştirmek değil; girdiyi küçültüp algoritmanın hangi varsayımının bozulduğunu görünür hâle getirmektir. Aşağıdaki örnekte amaç, bir listedeki maksimum değeri bulmaktır. Test düşünme yöntemi Python’a özgü değildir; aynı yaklaşım Java, C# veya başka bir dilde de uygulanabilir.

def maksimumu_bul(sayilar):
    if not sayilar:
        raise ValueError("Liste boş olamaz")
    maksimum = sayilar[0]
    for sayi in sayilar[1:]:
        if sayi > maksimum:
            maksimum = sayi
    return maksimum

print(maksimumu_bul([3, 9, 9, 2]))

Bu çözümde boş liste için sonuç üretmek yerine kontrollü bir hata davranışı seçilmiştir. Böyle bir karar, kod yazılmadan önce problem sözleşmesinde belirlenmelidir. Problem boş listeyi geçerli kabul ediyorsa farklı bir dönüş değeri seçilebilir; geçersiz kabul ediyorsa hata vermek daha anlaşılır olabilir.

1. Boş liste

Hatalı bir çözüm, maksimum değişkenini doğrudan sayilar[0] ile başlatıyorsa boş listede ilk elemana erişmeye çalışır. Liste elemanı olmadığı için algoritma daha karşılaştırma yapamadan kırılır. Buradaki kök neden, boş girdinin davranışının düşünülmemesi ve ilk elemanın kesin olarak var olduğunun varsayılmasıdır.

Düzeltilmiş çözüm boş listeyi önce kontrol eder. Bu örnekte beklenen davranış ValueError üretmektir. Eğer problem sözleşmesi boş liste için özel bir değer tanımlıyorsa testin beklenen çıktısı o değere göre yazılmalıdır. Önemli olan kararın test sırasında değil, problem koşulları incelenirken verilmesidir.

2. Tek elemanlı liste: [7]

Tek elemanlı liste, bazı hatalı çözümlerde döngünün hiç çalışmamasına neden olabilir. Örneğin algoritma yalnızca listenin ikinci elemanından başlayarak karşılaştırma yapıyorsa karşılaştırılacak başka değer bulunmaz. Bu durum tek başına hata olmayabilir; ancak başlangıç değerinin doğru kurulup kurulmadığını test etmek için önemlidir.

Beklenen çıktı açıkça 7 olmalıdır:

maksimumu_bul([7]) == 7

Test başarısızsa döngüden önce atanan başlangıç değerini ve döngünün hangi aralıktan başladığını inceleyin. İlk elemanı başlangıç maksimumu olarak kullanmak, tek elemanlı geçerli girdiyi doğal biçimde destekler.

3. Tekrar eden maksimum değer: [3, 9, 9, 2]

Tekrar eden maksimum değerlerde hata alan bir çözüm çoğunlukla “yeni değer mutlaka daha büyük olmalı” varsayımını yanlış yorumlar. Maksimumu güncellemek için > kullanılması, eşit değerin ikinci kez görülmesinde güncelleme yapmaz; fakat bu, maksimum değerin değişmemesi nedeniyle doğru davranıştır. Hatalı çözüm eşitlikte gereksiz bir işlem bekliyor veya tekrarları yanlışlıkla eliyorsa testte sorun ortaya çıkabilir.

Bu girdinin beklenen çıktısı 9 olmalıdır:

maksimumu_bul([3, 9, 9, 2]) == 9

Tekrar eden değer testi, algoritmanın yalnızca farklı değerlerden oluşan örneklerde değil, eşitlik koşulunda da doğru karar verdiğini gösterir.

Başarısız testten kök nedene dönme adımları

  1. Hatayı yeniden üretin ve aynı girdide tekrar oluştuğunu doğrulayın.
  2. Başarısız girdiyi, alınan çıktıyı ve beklenen çıktıyı kaydedin.
  3. Girdiyi küçültün. Örneğin uzun listeyi yalnızca hatayı koruyan iki veya üç elemana indirin.
  4. Girdinin boş, tek elemanlı, tekrarlı, sıralı veya geçersiz giriş gibi hangi sınır durumu grubuna ait olduğunu belirleyin.
  5. Ara değişkenleri ve döngü koşullarını adım adım izleyin.
  6. Hatalı varsayımı saptayın: İlk eleman var mı, eşit değer nasıl ele alınıyor, geçersiz giriş için sözleşme ne diyor?
  7. Düzeltmeyi önce aynı başarısız testle, ardından ona yakın komşu testlerle yeniden doğrulayın.

Bu adımlar düzenli geri bildirimle daha hızlı alışkanlığa dönüşebilir. Özellikle başlangıç ve orta seviyede, bir eğitmenle birlikte yürütülen sistematik algoritma çalışmaları, yalnızca hatayı düzeltmeyi değil, hataya götüren düşünme biçimini fark etmeyi de destekleyebilir.

Kendi Algoritman İçin Uygulanabilir Test Planı

Her ödev veya otomatik değerlendirme problemi için aşağıdaki kısa planı kullanabilirsiniz. Amaç gizli testleri tahmin etmek değil, algoritmanın problem koşullarına uygunluğunu sistematik biçimde sınamaktır.

  1. Problem koşullarını yazın. Girdinin türünü, boyutunu, değer aralığını ve beklenen çıktıyı açıkça belirtin.
  2. Geçerli ve geçersiz girdileri ayırın. Geçersiz girdiler için hata davranışı tanımlanmışsa ayrıca test edin.
  3. Yedi maddelik sınır durumu listesini problemle karşılaştırın: boş veya minimum boyut, tek eleman, maksimum boyut, alt ve üst değer sınırları, tekrarlar, sıralı veya ters sıralı veri, özel biçimli ya da geçersiz giriş.
  4. Listedeki her durumu otomatik olarak seçmeyin. Problem koşuluyla gerçekten ilişkili olanları filtreleyin.
  5. Her seçilen test için beklenen çıktıyı algoritmadan bağımsız belirleyin. Küçük örneklerde sonucu elle hesaplayın; daha karmaşık örneklerde basit bir doğrulama yöntemi kullanın.
  6. Testleri küçükten karmaşığa sıralayın. Önce boş veya tek elemanlı gibi kolay teşhis edilen durumları, ardından büyük ve birleşik durumları çalıştırın.
  7. Başarısız sonucu kök nedene bağlayın, düzeltmeyi aynı testte ve komşu sınır durumlarında yeniden deneyin.

Burada iki kör kabulden kaçınmak gerekir: Boş girdi her algoritmada mutlaka test edilmez; yalnızca problem bu girdiye izin veriyorsa veya hata davranışı tanımlanmışsa anlamlıdır. Negatif değer de her zaman sınır durumu değildir. Problem yalnızca pozitif sayılara izin veriyorsa negatif değer geçersiz girdidir; negatif sayılar geçerliyse alt sınırın bir parçası olabilir.

Bu plan başarı garantisi vermez ve belirli bir yarışma ya da mülakatta kesin sonuç vaat etmez. Sağladığı şey, test seçimini tahmine bırakmadan algoritmanın varsayımlarını görünür kılan tekrarlanabilir bir inceleme yöntemidir.

Sık Sorulan Sorular

Her algoritmada boş girdi mutlaka test edilmeli mi?

Hayır. Boş girdi, problem sözleşmesine göre geçerliyse test edilmelidir. Geçersizse algoritmanın kontrollü hata verip vermediği incelenebilir; ancak her probleme aynı boş girdi testini zorla uygulamak doğru değildir.

Bir test senaryosu için beklenen çıktı nasıl belirlenir?

Beklenen çıktı algoritmanın kendi sonucuna bakılarak değil, problem koşulları ve bağımsız bir hesaplama ile belirlenir. Küçük örneklerde sonucu elle hesaplamak, daha karmaşık örneklerde ise basit ve farklı bir doğrulama yöntemi kullanmak uygundur.

Sınır durumu ile geçersiz girdi arasındaki fark nedir?

Sınır durumu, problem tarafından izin verilen değer aralığının veya yapının uç noktasıdır. Geçersiz girdi ise problem koşullarını karşılamaz. Örneğin minimum liste boyutu geçerli bir sınır durumu olabilir; izin verilmeyen veri türü ise geçersiz girdidir.

Kodum yalnızca tekrar eden değerlerde başarısız oluyorsa kök nedeni nasıl bulabilirim?

Önce tekrarları koruyan en küçük girdiyi oluşturun. Ardından eşitlik karşılaştırmasını, değer güncelleme koşulunu ve tekrarların yanlışlıkla elenip elenmediğini izleyin. Düzeltmeden sonra aynı testin yanı sıra tüm değerleri farklı, tüm değerleri eşit ve farklı sıralamadaki komşu örnekleri de çalıştırın.

Sınır durumlarını problem koşullarına göre seçip küçük testlerden başlayarak ilerlemek, algoritma doğrulamasını daha anlaşılır ve tekrarlanabilir hâle getirir.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin — Yazılım Geliştirici ve Eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; bugün öğrencinin seviyesine ve hedefine göre şekillenen sürdürülebilir öğrenme sistemleri tasarlıyor. 500'den fazla kişiye ezber değil, düşünerek kod yazmayı öğretti — Berk Akademi'de izlemeye değil üretmeye dayalı öğrenme kültürünü o kuruyor.

WhatsApp Hemen Ara