Yazılım Test Süreçleri

Eşdeğer Sınıf Testi (Equivalence Class Testing)

Dr. Öğr. Üyesi Oğuz Emre Kural

2026

Geçen Hafta Neler Öğrendik?

  • Geçtiğimiz derste Sınır Değer Analizini (Boundary Value Analysis) inceledik.
  • Değişkenlerin sayısal sınırlarına odaklanarak olası hataları bulmaya çalıştık:
    • min, min+, nominal, max-, max
  • Çoğu hatanın yazılımlardaki sınır noktalarında (döngü geçişleri, indeks sınır aşımı vb.) saklandığını gördük.

Sınır Değer Testlerindeki Boyutlar

  • Sınırları test ederken iki temel yaklaşım sergiledik:
    1. Hata Varsayımı: Tek bir değişken mi bozulacak (Normal), yoksa tüm değişkenlerin sınır kombinasyonlarını aynı anda mı deneyeceğiz (Worst-Case)?
    2. Veri Kapsamı: Sadece geçerli verilere mi odaklanacağız (Normal), yoksa sınırların da dışına çıkarak sistemi çökertecek geçersiz verileri de mi deneyeceğiz (Gürbüz / Robust)?
  • Klasik problemlerde bu boyutları zorlamanın devasa ve tekrara düşen test tabloları ürettiğini deneyimledik.

Neden Yeni Bir Yönteme İhtiyacımız Var?

  • Sorun: Tüm sınır kombinasyonlarını denemek (örneğin 125 worst-case durumu) pratikte çok pahalı ve zaman alıcıdır.
  • Ayrıca sınırların arasında kalan devasa ‘orta’ değer aralığını nasıl verimli test edeceğimizi tam bilmiyoruz.
  • Çözüm: Eşdeğer Sınıf Testi ile; her değeri değil, sistemin aynı şekilde işleyeceğini bildiğimiz kümelere (sınıflara) odaklanacağız.

Eşdeğer Sınıf Testine Giriş

  • Eşdeğer sınıf testi (Eşdeğer Sınıf Testi), fonksiyonel testte girdi uzayını anlamlı alt kümelere ayırarak test üretmeyi amaçlar.
  • Buradaki temel soru şudur:
    • hangi girdiler program tarafından aynı şekilde ele alınır?
    • bu gruplardan seçilecek temsilcilerle test kümesi nasıl daha anlamlı hale getirilir?
  • Bu yaklaşımın temel motivasyonu:
    • daha sistematik bir kapsam elde etmek
    • gereksiz test tekrarlarını azaltmaktır

Eşdeğer Sınıf Testinin Dayandığı Ayrımlar

  • Eşdeğer sınıf testi, sınır değer testindeki iki temel kararı devam ettirir:
    • robustluk (robustness)
    • tek hata / çoklu hata varsayımı (single / çoklu hata varsayımı)
  • Bu iki eksen birlikte dört farklı test yaklaşımı oluşturur:
    • Zayıf Normal
    • Güçlü Normal
    • Zayıf Gürbüz
    • Güçlü Gürbüz
  • Başka bir deyişle:
    • tek hata / çoklu hata varsayımı → zayıf / güçlü ayrımını
    • geçersiz veriye odaklanma → normal / gürbüz ayrımını üretir

Gürbüz Testin Zorluğu ve Günümüzdeki Geçerliliği

  • Temel Zorluk (“Beklenen Çıktı” Belirsizliği): Spesifikasyonlar genellikle sistemin doğru çalıştığı durumu tanımlar.
    • Kullanıcı Yaş alanına -5 girdiğinde ne olmalı? Bu çok nadir önceden belirtilir.
    • Test uzmanı geçersiz girdiyi bulmakla kalmaz; aynı zamanda “Peki sistem buna nasıl bir hata / tepki vermeli?” sorusunun cevabını da kendi başına belirlemek zorunda kalır.
  • Modern Teknolojilerin Etkisi: Eskiden tip dönüşüm hataları yüzünden programlar kolayca çökerdi.
    • Günümüzde güçlü tipli diller ve arayüz bileşenleri (açılır liste vb.), geçersiz formatlı girdilerin sisteme girmesini daha en baştan engeller.
    • Teknolojinin sağladığı bu koruma kalkanı sayesinde, test uzmanının bazı eski tip “Gürbüz” (Robust) test senaryolarını tasarlama gerekliliği oldukça azalmıştır.

Eşdeğerlik Sınıfları

  • Eşdeğer sınıfların önemli yönü, bir kümenin partition (ayrışım) yapısını oluşturmasıdır.
  • Buradaki partition:
    • birbirini kesmeyen (mutually disjoint) alt kümelerden oluşur
    • bu alt kümelerin birleşimi tüm kümeyi verir
  • Bu yapının test açısından iki önemli sonucu vardır:
    • tüm kümenin temsil edilmesi, bir tür kapsamlılık sağlar
    • alt kümelerin ayrık olması, bir tür tekrarsızlık sağlar

Eşdeğerlik İlişkisi ve Test Durumu Seçimi

  • Alt kümeler, bir eşdeğerlik ilişkisine göre belirlendiği için, aynı alt kümedeki elemanların ortak bir özelliği vardır.
  • Eşdeğer sınıf testinin temel fikri:
    • her eşdeğer sınıftan bir temsilci eleman seçerek test durumları oluşturmaktır
  • Eşdeğer sınıflar doğru ve dikkatli tanımlanırsa:
    • test durumları arasındaki olası tekrar azalır
    • daha az sayıda testle daha anlamlı kapsama ulaşılabilir

Üçgen Problemi Üzerinden Sezgi

  • Örneğin üçgen probleminde, eşkenar üçgen için bir test durumu mutlaka seçilir.

  • Bu sınıf için \((5,5,5)\) üçlüsü seçilmiş olsun.

  • Bu durumda aşağıdaki girdilerden çok fazla yeni bilgi beklemeyiz:

    • \((6,6,6)\)
    • \((100,100,100)\)
  • Çünkü sezgisel olarak bunların da ilk durumla aynı şekilde ele alınacağını düşünürüz.

  • Bu yüzden bu tür ek testler çoğu zaman gereksiz tekrar oluşturur.

“Aynı Şekilde Ele Alınma” Ne Demektir?

  • Fonksiyonel bakış açısından aynı eşdeğer sınıftaki girdiler sistem tarafından benzer davranışla işlenir.

  • İleride kod-temelli testte bu fikir daha teknik bir karşılık kazanır: “treated the same” ifadesi, aynı yürütme yolunun (same execution path) izlenmesi anlamına gelir.

  • Yani eşdeğer sınıf yaklaşımı, yalnızca sezgisel değil, program davranışı açısından da güçlü bir temele sahiptir.

Sınır Değer Testi ile İlişkisi

  • Eşdeğer sınıf testinin dört formu, sınır değer testindeki dört formda görülen iki temel problemi hedef alır:
    • boşluklar / eksik kapsama (gaps)
    • gereksiz tekrarlar (redundancies)
  • Varsayımlar hizalandığı için:
    • sınır değer testindeki dört form
    • eşdeğer sınıf testindeki dört formla paralellik gösterir
  • Bu nedenle iki yaklaşım birbirinden tamamen kopuk değil, kavramsal olarak ilişkilidir.

Örtüşme ve Hibrit Yaklaşım

  • Eşdeğer sınıflar sınırlarla tanımlanmış değişkenler üzerinden kuruluyorsa, iki yaklaşım arasında doğal bir örtüşme oluşur.

  • Böyle durumlarda sınır değer testi ve eşdeğer sınıf testi birlikte, yani hibrit biçimde kullanılabilir

  • ISTQB öğretim içeriğinde bu tür yaklaşım edge testing olarak da adlandırılır.

Geleneksel Eşdeğer Sınıf Testi (Zayıf Gürbüz)

  • Sektör standardı kitaplarda (örn. Myers, 1979) “Eşdeğer Sınıf Testi” denildiğinde akla gelen ilk şey, tıpkı bizim öğrendiğimiz Zayıf Gürbüz (Weak Robust) yaklaşımıdır.
  • Bu geleneksel yöntemin en büyük hedefi geçersiz (invalid) veri değerleridir.
  • Peki eski test uzmanları neden sistemi çökertecek hatalı verileri bulmaya bu kadar odaklanıyordu?
  • Bunun cevabı 1960’lar ve 1970’lerin programlama dünyasında yankılanan kült bir sloganda gizlidir: “Çöp Giren, Çöp Çıkar” (GIGO).

“Çöp Giren, Çöp Çıkar” (GIGO) Felsefesi

  • O dönemlerde doğru formattaki veriyi girmek tamamen kullanıcının sorumluluğundaydı.
  • Sisteme hatalı bir veri (örneğin yaş alanına harf) girilirse sonucun ne çıkacağının garantisi yoktu, genelde devasa sistemler çökerdi.
  • Buna karşı yazılımcıların tek çaresi koda büyük oranda girdi doğrulama (input validation) blokları yazmaktı.
  • Öyle ki, eski yapısal programlamanın giriş (afferent) kısımları, toplam kaynak kodun neredeyse %80’ini kapsayabiliyordu.

Teknolojinin Gelişimi ve GIGO’nun Sonu

  • Günümüzde modern Güçlü tipli diller (strongly typed languages) ve akıllı arayüzler (GUI) bu yükü testçilerin ve yazılımcıların sırtından büyük ölçüde almıştır.
  • Açılır listeler (drop-down lists), kaydırma çubukları (sliders) veya takvim bileşenleri, geçersiz verilerin sisteme sızmasını daha klavye aşamasında durdurur.
  • İşte bu nedenle modern dönemde, eski usul ağır “Geçersiz veriler girdiğinde ne olur?” testleri zorunluluktan çıkıp ihtiyaca bağlı bir tercihe dönüşmüştür.

Geleneksel Testin Altın Kuralları

  • Geleneksel yöntem (Zayıf Gürbüz), çoklu hata kombinasyonlarını ele almaz. Odak noktası izole edilmiş tekil geçersiz verilerdir.
  • Standart \(n\) değişkenli bir fonksiyonda geleneksel test süreci şöyle işler:
    1. Önce bütün değişkenlere geçerli (valid) değerler ver ve sistemi test et. (Happy Path)
    2. Birinci adım başarılıysa, sadece 1. değişkeni geçersiz yap, diğerleri geçerli kalsın (bir hata çıkarsa suçlu %100 birinci değişkendir).
    3. Aynı işlemi sırayla diğer tüm değişkenler için tek tek tekrar et.

Geleneksel Eşdeğer Sınıf Test Durumları

Şeklin Yorumu

  • Geçerli Durum (Ortadaki nokta): İki değişkenin (\(x_1\) ve \(x_2\)) de geçerli olduğu tek test durumu.
  • Geçersiz Durumlar (Kenardaki 4 nokta): Sadece tek bir değişkenin geçersiz yapıldığı izole anlar.
    • 2 test durumu: Yalnızca \(x_1\) geçersiz.
    • 2 test durumu: Yalnızca \(x_2\) geçersiz.
  • Odak Noktası: “İkisi birden geçersiz olursa ne olur?” sorusu göz ardı edilir. Amaç, hataları birbirine karıştırmadan ayrı ayrı (izole) sınamaktır.

Geliştirilmiş Eşdeğer Sınıf Testi

  • Eşdeğer sınıf testinin en kritik noktası, sınıfları belirleyen eşdeğerlik ilişkisinin nasıl seçildiğidir.
  • Bu seçim yalnızca biçimsel bir adım değildir; aynı zamanda test tasarımının asıl zanaatıdır.
  • Çoğu durumda bu ilişkiyi belirlerken:
    • olası gerçeklemeyi (implementation) sezgisel olarak tahmin ederiz
    • program içinde hangi işlevsel ayrımların bulunması gerektiğini düşünürüz
  • Yani amaç, yalnızca giriş aralıklarını bölmek değil; programın bu girdileri nasıl farklı işleyeceğini de dikkate almaktır.

Geliştirilmiş Yaklaşım İçin Girdi Yapısı

  • Konuyu iki değişkenli bir fonksiyon üzerinden incelemeye devam edelim:

\[ F(x_1, x_2) \]

  • Sınır değer testinde kullanılan fonksiyon burada zenginleştirilir.
  • Program düzeyinde \(x_1\) ve \(x_2\) için şu sınırlar ve bu sınırlar içindeki alt aralıklar tanımlanır:

\[ a \leq x_1 \leq d \quad \text{ve aralıklar } [a,b),\ [b,c),\ [c,d] \]

\[ e \leq x_2 \leq g \quad \text{ve aralıklar } [e,f),\ [f,g] \]

Aralıkların Anlamı

  • Bu alt aralıkların, test edilen program içinde anlamlı bir ayrıma karşılık geldiği varsayılır.
  • Örneğin bunlar:
    • farklı ücret dilimleri,
    • farklı komisyon aralıkları,
    • farklı işlem kuralları gibi program mantığında ayrı işlenen bölgeler olabilir.
  • Bu nedenle bu aralıklar yalnızca matematiksel bölmeler değil, aynı zamanda eşdeğer sınıflardır.

Geçerli Değerler İçin Eşdeğer Sınıflar

  • Geçerli değerlerden oluşan eşdeğer sınıflar şu şekilde tanımlanır:

\[ V1 = \{x_1 : a \leq x_1 < b\} \]

\[ V2 = \{x_1 : b \leq x_1 < c\} \]

\[ V3 = \{x_1 : c \leq x_1 \leq d\} \]

\[ V4 = \{x_2 : e \leq x_2 < f\} \]

\[ V5 = \{x_2 : f \leq x_2 \leq g\} \]

  • Burada \(x_1\) için 3 geçerli sınıf, \(x_2\) için 2 geçerli sınıf tanımlanmıştır.

Geçersiz Değerler İçin Eşdeğer Sınıflar

  • Geçersiz değerler ise sınırların dışındaki bölgelerden oluşur:

\[ x_1 < a,\quad x_1 > d,\quad x_2 < e,\quad x_2 > g \]

  • Buna karşılık gelen geçersiz eşdeğer sınıflar şunlardır:

\[ NV1 = \{x_1 : x_1 < a\} \]

\[ NV2 = \{x_1 : d < x_1\} \]

\[ NV3 = \{x_2 : x_2 < e\} \]

\[ NV4 = \{x_2 : g < x_2\} \]

Sınıfların Özellikleri

  • \(V1, V2, V3, V4, V5, NV1, NV2, NV3, NV4\) sınıfları:
    • birbirinden ayrıdır (disjoint)
    • birleşimleri ilgili düzlemin tamamını kapsar
  • Bu özellik önemlidir; çünkü iyi tanımlanmış bir eşdeğer sınıf sistemi:
    • örtüşmeyen sınıflar üretmeli
    • tüm olası durumları kapsamalıdır

Zayıf Normal Eşdeğer Sınıf Testi

  • Zayıf Normal Eşdeğer Sınıf Testi, her test durumunda her eşdeğer sınıftan bir değişken değeri seçilerek uygulanır.

  • Burada yalnızca geçerli sınıflar (valid classes) dikkate alınır.

  • Yaklaşımın temelinde tek hata varsayımı (tek hata varsayımı) vardır.

  • Yani amaç:

    • her testte geçerli bölgelerde kalmak
    • ama farklı eşdeğer sınıfları temsil edecek örnekler seçmektir

Çalışan Örnek Üzerinden Mantık

  • Örneğimizde bu yaklaşım uygulandığında üç adet zayıf eşdeğer sınıf test durumu elde edilir.

  • Bu üç testin her biri, ilgili eşdeğer sınıflardan birer temsilci değer içerir.

  • Örnek yerleşim mantığı şu şekildedir:

    • sol alttaki test durumu:
      • \(x_1 \in [a,b)\)
      • \(x_2 \in [e,f)\)
    • üst ortadaki test durumu:
      • \(x_1 \in [b,c)\)
      • \(x_2 \in [f,g]\)
    • üçüncü test durumu:
      • sağ taraftaki geçerli bölgelerden birinde yer alabilir

Test Sayısı Nasıl Belirlenir?

  • Zayıf Normal yaklaşımda testler sistematik biçimde seçildiğinde belirli bir desen ortaya çıkar.

  • Genel kural şudur:

  • zayıf eşdeğer sınıf test durumu sayısı, partition içinde en fazla alt kümeye sahip değişkenin sınıf sayısına eşittir.

  • Bu örnekte:

    • \(x_1\) için 3 geçerli sınıf vardır
    • \(x_2\) için 2 geçerli sınıf vardır
  • Bu nedenle toplam 3 zayıf normal test durumu yeterli görülür.

Zayıf Normal Test Durumları

Bu Yaklaşım Neden “Zayıf” Olarak Adlandırılır?

  • Bir zayıf normal test durumu başarısız olursa, yani beklenen ve gerçek çıktı uyuşmazsa:
    • sorun \(x_1\)’den kaynaklanıyor olabilir
    • sorun \(x_2\)’den kaynaklanıyor olabilir
    • ya da iki değişken arasındaki etkileşimden doğuyor olabilir
  • Dolayısıyla hata kaynağı kesin biçimde izole edilemez.
  • Bu belirsizlik, yaklaşımın neden zayıf olarak adlandırıldığını açıklar.

Ne Zaman Uygundur?

  • Eğer hata izolasyonu beklentisi düşükse, örneğin regression testing gibi senaryolarda, zayıf normal yaklaşım kabul edilebilir bir seçim olabilir.

  • Çünkü az sayıda testle temel kapsama sağlar.

  • Ancak daha güçlü hata ayrıştırması gerekiyorsa, daha sonra görülecek olan güçlü yaklaşımlar tercih edilmelidir.

Güçlü Normal Eşdeğer Sınıf Testi

  • Güçlü eşdeğer sınıf testi, çoklu hata varsayımına dayanır.
  • Bu nedenle test durumları, eşdeğer sınıfların kartezyen çarpımından elde edilir.
  • Başka bir deyişle:
    • her değişkenin geçerli eşdeğer sınıfları alınır
    • bu sınıfların tüm olası kombinasyonları test kapsamına dahil edilir
  • Bu yaklaşımda yine yalnızca geçerli (normal) sınıflar kullanılır; geçersiz sınıflar henüz işin içine girmez.

Neden Daha “Güçlü”?

  • Zayıf Normal yaklaşımda her sınıf yalnızca temsil edilir.
  • Güçlü Normal yaklaşımda ise:
    • yalnızca sınıfları kapsamakla yetinilmez,
    • sınıfların birlikte oluşabilecek tüm olası geçerli kombinasyonları da kapsanır.
  • Böylece kapsam iki açıdan güçlenir:
    • tüm eşdeğer sınıflar kapsanır
    • bu sınıfların tüm olası kombinasyonları da göz önüne alınır
  • Bu yüzden yaklaşım, zayıf versiyona göre daha güçlü bir tamlık anlayışı sunar.

Doğruluk Tablosu Benzerliği

  • Bu test düzeninin önerme mantığındaki doğruluk tablosuna (truth table) benzediği görülebilir.

  • Gerçekten de her eşdeğer sınıf kombinasyonu ayrı bir satır gibi düşünülebilir.

  • Bu benzerlik önemlidir çünkü:

    • sistematik kapsama sağlar
    • hangi kombinasyonların test edildiği açıkça görülebilir
    • eksik kombinasyon bırakma olasılığı azalır

Çalışan Örnek İçin Test Sayısı

  • Örneğimizdeki geçerli eşdeğer sınıflar şunlardır:
    • \(x_1\) için: \(V1, V2, V3\)
    • \(x_2\) için: \(V4, V5\)
  • Dolayısıyla güçlü normal yaklaşımda test sayısı:

\[ 3 \times 2 = 6 \]

  • Yani tüm geçerli kombinasyonları kapsamak için 6 test durumu gerekir.

Güçlü Normal Test Durumları

Zayıf ve Güçlü Normal Arasındaki Fark

  • Zayıf Normal yaklaşım:
    • her sınıfı en az bir kez temsil etmeyi hedefler
    • daha az test üretir
    • ama tüm kombinasyonları kapsamaz
  • Güçlü Normal yaklaşım:
    • geçerli sınıfların tüm kombinasyonlarını kapsar
    • daha fazla test üretir
    • etkileşimleri görme şansını artırır
  • Bu nedenle güçlü normal yaklaşım, özellikle sınıflar arası birleşimlerin davranışı etkileyebileceği durumlarda daha güçlüdür.

Önemli Kavramsal Nokta

  • “İyi” eşdeğer sınıf testinin asıl anahtarı test sayısı değil, eşdeğerlik ilişkisinin doğru seçimidir.

  • Çünkü programın girdileri gerçekten “aynı şekilde işleyip işlemediği”, sınıfların ne kadar doğru tanımlandığına bağlıdır.

  • Ayrıca eşdeğer sınıflar her zaman yalnızca girdi uzayı (input domain) üzerinde tanımlanmak zorunda değildir.

  • İstenirse programın çıktı uzayı (output range) üzerinde de eşdeğerlik ilişkileri kurulabilir.

  • Örneğin üçgen probleminde en basit yaklaşım budur.

Zayıf Gürbüz Eşdeğer Sınıf Testi

  • Bu adlandırma ilk bakışta çelişkili görünebilir:
    • gürbüz kısmı, geçersiz değerlerin (invalid values) dikkate alınmasından gelir
    • zayıf kısmı ise tek hata varsayımına (tek hata varsayımı) dayanmasından gelir
  • Yani yaklaşım:
    • geçersiz sınıfları da kapsar
    • fakat aynı testte birden fazla hatalı değişken kombinasyonunu hedeflemez
  • Bu nedenle, aslında Zayıf Normal Eşdeğer Sınıf Testi yaklaşımının doğal bir uzantısıdır.

Temel Süreç

  • Zayıf Gürbüz yaklaşımda amaç, her eşdeğer sınıfın en az bir kez temsil edilmesidir.
  • Süreç iki parçalıdır:
  1. Geçerli girdiler için:
    • her geçerli sınıftan bir değer seçilir
    • yani zayıf normal yaklaşım uygulanır
  2. Geçersiz girdiler için:
    • her test durumunda yalnızca bir tane geçersiz değer bulunur
    • diğer tüm değişkenler geçerli tutulur
  • Böylece tek bir geçersizliğin testi başarısız yapması beklenir.

Mantık

  • Bu yaklaşımın hedefi, geçersiz veri sınıflarını da kapsarken hata nedenini mümkün olduğunca tek bir değişkene bağlayabilmektir.
  • Yani bir test başarısız olursa, bunun:
    • geçersiz olan değişkenden
    • ya da o değişkenin ilgili doğrulama mantığından kaynaklandığı daha makul biçimde düşünülebilir.
  • Bu açıdan yaklaşım:
    • gürbüz çünkü invalid sınıfları içerir
    • zayıf çünkü çoklu hata kombinasyonlarını sistematik biçimde kapsamaz

Zayıf Gürbüz Test Durumları

Şekilde Dikkat Edilmesi Gereken Problem

  • Ancak şekildeki testler incelendiğinde olası bir probleme dikkat etmek gerekir.
  • Özellikle:
    • sol üst köşe
    • sağ alt köşe test durumları incelendiğinde, bu noktaların iki farklı değişken açısından birlikte sorun üretebildiği görülür.
  • Başka bir ifadeyle bu testler, görünürde tek bir invalid sınıfı temsil etmek isterken, fiilen iki değişkenin etkileşimini de işin içine katabilir.
  • Böyle bir durumda başarısızlığın nedeni beklenenden daha belirsiz hale gelir.

Revize Edilmiş Zayıf Gürbüz Yaklaşımı

  • Bu problemi azaltmak için daha dengeli bir düzenleme önerilmektedir.
  • Bu yeni düzenleme:
    • “saf” zayıf gürbüz yaklaşım ile
    • onun daha dikkatli bir uyarlaması arasında bir uzlaşma (compromise) sunar
  • Amaç, geçersiz sınıfları temsil etmeye devam ederken, gereksiz etkileşimleri mümkün olduğunca azaltmaktır.

Revize Edilmiş Zayıf Gürbüz Test Durumları

Yorum

  • Zayıf Gürbüz yaklaşımda genel hedef şudur:

    • geçerli sınıfları temsil etmek
    • geçersiz sınıfları da dışarıda bırakmamak
    • ama her başarısızlığı mümkün olduğunca tek bir invalid etkene bağlayabilmek
  • Bu nedenle test noktalarının yalnızca kapsama açısından değil, hata ayırt ediciliği (fault isolation) açısından da dikkatle seçilmesi gerekir.

  • Buradaki temel ders şudur:

    • eşdeğer sınıf testinde yalnızca “kaç sınıf var?” sorusu yetmez
    • test noktalarının nereden seçildiği de en az o kadar önemlidir

Güçlü Gürbüz Eşdeğer Sınıf Testi

  • Bu adlandırma önceki forma göre daha doğrudandır:
    • gürbüz kısmı, geçersiz değerlerin (invalid values) de hesaba katılmasından gelir
    • güçlü kısmı ise çoklu hata varsayımına (çoklu hata varsayımı) dayanır
  • Dolayısıyla bu yaklaşım:
    • hem geçerli sınıfları
    • hem de geçersiz sınıfları birlikte ele alır
  • Üstelik bunu yalnızca temsil düzeyinde değil, tüm kombinasyonları kapsayacak biçimde yapar.

Temel Mantık

  • Güçlü Gürbüz yaklaşımda test durumları, geçerli ve geçersiz tüm eşdeğer sınıfların kartezyen çarpımından elde edilir.

  • Yani her değişken için:

    • geçerli sınıflar
    • geçersiz sınıflar birlikte alınır
  • Daha sonra bunların tüm olası birleşimleri için test durumu oluşturulur.

  • Bu nedenle bu yaklaşım, bölümdeki dört form arasında en kapsamlı olanıdır.

Neden En Güçlü Form?

  • Zayıf Normal:
    • yalnızca geçerli sınıfları temsil eder
  • Güçlü Normal:
    • geçerli sınıfların tüm kombinasyonlarını kapsar
  • Zayıf Gürbüz:
    • geçerli ve geçersiz sınıfları temsil eder
    • ama tek hata varsayımıyla ilerler
  • Güçlü Gürbüz ise:
    • geçerli + geçersiz tüm sınıfları içerir
    • bunların tüm kombinasyonlarını kapsar
  • Bu yüzden kapsama açısından en güçlü, maliyet açısından da en ağır formdur.

Test Sayısının Mantığı

  • Önceki tanıma göre sınıflar şunlardı:
    • \(x_1\) için: \(V1, V2, V3, NV1, NV2\) → toplam 5 sınıf
    • \(x_2\) için: \(V4, V5, NV3, NV4\) → toplam 4 sınıf
  • Dolayısıyla güçlü gürbüz yaklaşımda toplam test sayısı:

\[ 5 \times 4 = 20 \]

  • Yani iki değişkenli bu örnekte 20 test durumu gerekir.

Güçlü Gürbüz Test Durumları

Yorum

  • Şekilde görülen test noktaları:
    • geçerli bölgeleri
    • geçersiz bölgeleri
    • ayrıca bunların birbirleriyle olan tüm kombinasyonlarını sistematik biçimde kapsar
  • Bu yaklaşım, çoklu geçersizliklerin veya değişkenler arası karmaşık etkileşimlerin önemli olduğu durumlarda daha güçlü bilgi sağlar.
  • Ancak bunun bedeli, test kümesinin hızla büyümesidir.

Pratik Sonuç

  • Güçlü Gürbüz Eşdeğer Sınıf Testi teorik olarak çok güçlüdür; ancak her zaman pratik değildir.
  • Çünkü sınıf sayısı arttıkça toplam test sayısı çarpımsal olarak büyür.
  • Bu nedenle gerçek projelerde seçim yapılırken şu denge gözetilir:
    • kapsam gücü
    • hata ayırt ediciliği
    • uygulama maliyeti
  • Bu bölümün ana mesajı şudur:
    • eşdeğer sınıf testi tek bir teknik değildir
    • farklı varsayımlara göre değişen, kapsam ve maliyet dengesi farklı dört ayrı form içerir

Dört Formun Karşılaştırmalı Özeti

Yaklaşım Geçerli sınıflar Geçersiz sınıflar Varsayım Kapsam gücü Hata izolasyonu
Zayıf Normal Dahil Hariç Tek hata varsayımı Temsil düzeyi Sınırlı
Güçlü Normal Dahil Hariç Çoklu hata varsayımı Geçerli kombinasyonların tümü Zayıf Normalden güçlü
Zayıf Gürbüz Dahil Dahil Tek hata varsayımı Geçerli sınıflar + tekil geçersiz durumlar Görece iyi
Güçlü Gürbüz Dahil Dahil Çoklu hata varsayımı Tüm geçerli/geçersiz kombinasyonlar En kapsamlı, en maliyetli

Hangi Form Ne Zaman Daha Uygun?

  • Zayıf Normal
    • hızlı temsil gücü isteniyorsa
    • az sayıda testle temel kapsama aranıyorsa
  • Güçlü Normal
    • geçerli sınıfların birleşimlerinin davranışı önemliyse
    • sınıflar arası etkileşimleri daha güçlü görmek isteniyorsa
  • Zayıf Gürbüz
    • geçersiz veri sınıfları önemliyse
    • ama hata nedenini olabildiğince tek değişkende tutmak isteniyorsa
  • Güçlü Gürbüz
    • en geniş kapsam aranıyorsa
    • çoklu geçersizliklerin ve karmaşık birleşimlerin test edilmesi önemliyse

Üçgen Problemi İçin Eşdeğer Sınıflar

  • Problem tanımına göre dört olası çıktı vardır:
    • NotATriangle
    • Scalene
    • Isosceles
    • Equilateral
  • Bunlar, çıktı uzayı (output / range) üzerinde eşdeğer sınıflar tanımlamak için kullanılabilir.

\[ R1 = \{\langle a,b,c\rangle : a,b,c \text{ kenarlı üçgen eşkenardır}\} \]

\[ R2 = \{\langle a,b,c\rangle : a,b,c \text{ kenarlı üçgen ikizkenardır}\} \]

\[ R3 = \{\langle a,b,c\rangle : a,b,c \text{ kenarlı üçgen çeşitkenardır}\} \]

\[ R4 = \{\langle a,b,c\rangle : a,b,c \text{ değerleri bir üçgen oluşturmaz}\} \]

Zayıf Normal Test Durumları

  • Her çıktı sınıfından keyfi olarak birer örnek seçilirse, dört adet zayıf normal eşdeğer sınıf test durumu elde edilir.
Test Durumu a b c Expected Output
WN1 5 5 5 Equilateral
WN2 2 2 3 Isosceles
WN3 3 4 5 Scalene
WN4 4 1 2 Not a triangle

İnteraktif Uygulama: Üçgen Testi (Python)

  • Kodu inceleyerek Zayıf Normal test durumlarının (WN1-WN4) koda nasıl gömüldüğünü çalıştırarak deneyebilirsiniz.

Güçlü Normal Üçgen Testleri

  • \(a\), \(b\) ve \(c\) değişkenleri için burada ayrıca tanımlanmış geçerli alt aralıklar (valid subintervals) yoktur.

  • Bu nedenle üçgen problemi için:

  • Güçlü Normal equivalence class test durumları, zayıf normal equivalence class test durumları ile aynıdır.

  • Yani bu örnekte geçerli sınıflar arasında ek kombinasyon üretimi söz konusu değildir.

Zayıf Gürbüz İçin Ek Testler

  • \(a\), \(b\) ve \(c\) için geçersiz değerler de dikkate alınırsa, ek zayıf gürbüz equivalence class test durumları elde edilir.
  • Geçersiz değerler şu türlerden biri olabilir: \(0\), herhangi bir negatif sayı, \(200\)’den büyük herhangi bir sayı
Test Durumu a b c Expected Output
WR1 -1 5 5 Value of a is not in the range of permitted values
WR2 5 -1 5 Value of b is not in the range of permitted values
WR3 5 5 -1 Value of c is not in the range of permitted values
WR4 201 5 5 Value of a is not in the range of permitted values
WR5 5 201 5 Value of b is not in the range of permitted values
WR6 5 5 201 Value of c is not in the range of permitted values

Güçlü Gürbüz Üçgen Testleri

  • Güçlü Gürbüz yaklaşımda, üç değişkenli uzayda çok daha fazla kombinasyon oluşur.
  • Aşağıdaki tablo, bu kümenin yalnızca bir kısmını göstermektedir.
Test Durumu a b c Expected Output
SR1 -1 5 5 Value of a is not in the range of permitted values
SR2 5 -1 5 Value of b is not in the range of permitted values
SR3 5 5 -1 Value of c is not in the range of permitted values
SR4 -1 -1 5 Values of a, b are not in the range of permitted values
SR5 5 -1 -1 Values of b, c are not in the range of permitted values
SR6 -1 5 -1 Values of a, c are not in the range of permitted values
SR7 -1 -1 -1 Values of a, b, c are not in the range of permitted values

Beklenen Çıktının Ayrıntı Düzeyi

  • Bu örnekte beklenen çıktılar, yalnızca “geçersiz” demekle kalmaz; hangi değişkenin ya da hangi değişkenlerin geçersiz olduğunu açıkça belirtir.

  • Bu da eşdeğer sınıf testinin, sınıfları tanımlamak için kullanılan eşdeğerlik ilişkisine ne kadar duyarlı olduğunu gösterir.

  • Başka bir deyişle:

    • sınıfları nasıl tanımlarsanız
    • test kümesi ve beklenen çıktılar da buna göre şekillenir

Alternatif Bir Eşdeğerlik İlişkisine Geçiş

  • Buraya kadar üçgen problemi, ağırlıklı olarak çıktı uzayı (output range) üzerinden sınıflandırıldı.
  • Şimdi aynı problemi bu kez girdi yapısı (input structure) üzerinden sınıflandırıyoruz.
  • Yani aşağıdaki sınıflar, önceki \(R1\)–\(R4\) sınıflarının devamı değil; üçgen problemine ait alternatif bir eşdeğerlik ilişkisidir.

Girdi Alanına Dayalı Daha Zengin Sınıflar

  • Çıktı alanı yerine girdi yapısı üzerinden daha zengin bir eşdeğer sınıf ayrımı da yapılabilir.
  • Üç tam sayı \(a\), \(b\), \(c\) için şu durumlar mümkündür: üçü de eşit olabilir, yalnızca bir çift eşit olabilir,hiçbiri eşit olmayabilir. Buna göre şu sınıflar tanımlanır: \[ D1 = \{\langle a,b,c\rangle : a=b=c\} \] \[ D2 = \{\langle a,b,c\rangle : a=b,\ a \ne c\} \] \[ D3 = \{\langle a,b,c\rangle : a=c,\ a \ne b\} \] \[ D4 = \{\langle a,b,c\rangle : b=c,\ a \ne b\} \] \[ D5 = \{\langle a,b,c\rangle : a \ne b,\ a \ne c,\ b \ne c\} \]

Üçgen Özelliğine Dayalı Ek Sınıflar

  • Ayrı bir boyut olarak, bu üç sayının gerçekten bir üçgen oluşturup oluşturmadığı da incelenebilir.

  • Örneğin \(\langle 1,4,1\rangle\) tam olarak bir eşit kenar çifti içerir; ancak yine de bir üçgen oluşturmaz.

  • Bu nedenle üçgen eşitsizliğine göre şu sınıflar tanımlanabilir:

\[ D6 = \{\langle a,b,c\rangle : a \geq b+c\} \] \[ D7 = \{\langle a,b,c\rangle : b \geq a+c\} \]

\[ D8 = \{\langle a,b,c\rangle : c \geq a+b\} \]

Daha da Ayrıntılı Ayrım

  • İstenirse “büyük veya eşit” durumu da iki ayrı sınıfa bölünebilir.
  • Örneğin \(D6\) şu şekilde ayrıştırılabilir:

\[ D6' = \{\langle a,b,c\rangle : a=b+c\} \]

\[ D6'' = \{\langle a,b,c\rangle : a>b+c\} \]

  • Aynı ayrım benzer biçimde \(D7\) ve \(D8\) için de yapılabilir.

Üçgen Probleminden Ne Öğrendik?

  • Buradaki en büyük dersimiz şuydu: Eşdeğer sınıfları belirlerken sadece “Çıktı” sonuçlarına (Eşkenar, İkizkenar vb.) mecbur değiliz.
  • Dilersek aynı problem için odağımızı “Girdi” tarafına çevirip, değişkenlerin kendi aralarındaki yapısal ilişkilere (\(a=b\) mi, \(a \ge b+c\) mi gibi) göre yepyeni test sınıfları üretebiliriz.
  • Demek ki test tasarımında “Bu işin tek bir mutlak doğru sınıfı vardır” diye bir kural yoktur.
  • Testinizin Kalitesi; sizin hangi eşdeğerlik ilişkisini seçtiğinize ve bu seçimin, arka planda çalışan kodun algılayışını ne kadar iyi kopyaladığına bağlıdır.

Örnek Vaka: NextDate Fonksiyonu

NextDate Fonksiyonu İçin Başlangıç Sınıfları

  • NextDate fonksiyonu üç değişkenlidir:
    • month
    • day
    • year
  • Başlangıçta geçerli değer aralıkları şöyle tanımlanır:

\[ M1 = \{\text{month}: 1 \leq \text{month} \leq 12\} \]

\[ D1 = \{\text{day}: 1 \leq \text{day} \leq 31\} \]

\[ Y1 = \{\text{year}: 1812 \leq \text{year} \leq 2012\} \]

Geçersiz Eşdeğer Sınıflar

  • Geçersiz sınıflar ise her değişken için alt ve üst sınır dışı değerlerden oluşur:

\[ M2 = \{\text{month}: \text{month} < 1\} \]

\[ M3 = \{\text{month}: \text{month} > 12\} \]

\[ D2 = \{\text{day}: \text{day} < 1\} \]

\[ D3 = \{\text{day}: \text{day} > 31\} \]

\[ Y2 = \{\text{year}: \text{year} < 1812\} \]

\[ Y3 = \{\text{year}: \text{year} > 2012\} \]

Zayıf Normal ve Güçlü Normal

  • Bu ilk ayrımda, geçerli sınıf sayısı bağımsız değişken sayısına eşittir:
    • month için 1 geçerli sınıf
    • day için 1 geçerli sınıf
    • year için 1 geçerli sınıf
  • Bu nedenle yalnızca bir adet zayıf normal test durumu oluşur.
  • Aynı nedenle bu test durumu, güçlü normal test durumu ile de aynıdır.
Case ID Month Day Year Expected Output
WN1, SN1 6 15 1912 6/16/1912

NextDate Testi (WN1) (Python)

Zayıf Gürbüz Test Kümesi

  • Geçersiz month, day ve year sınıfları da hesaba katıldığında, tüm zayıf gürbüz test durumları aşağıdaki gibi elde edilir.
Case ID Month Day Year Expected Output
WR1 6 15 1912 6/16/1912
WR2 -1 15 1912 Value of month not in the range 1 … 12
WR3 13 15 1912 Value of month not in the range 1 … 12
WR4 6 -1 1912 Value of day not in the range 1 … 31
WR5 6 32 1912 Value of day not in the range 1 … 31
WR6 6 15 1811 Value of year not in the range 1812 … 2012
WR7 6 15 2013 Value of year not in the range 1812 … 2012

Güçlü Gürbüz Test Kümesi

  • Üçgen probleminde olduğu gibi, üç boyutlu uzaydaki ek güçlü gürbüz test durumlarının yalnızca bir kısmı aşağıda gösterilmektedir.
Case ID Month Day Year Expected Output
SR1 -1 15 1912 Value of month not in the range 1 … 12
SR2 6 -1 1912 Value of day not in the range 1 … 31
SR3 6 15 1811 Value of year not in the range 1812 … 2012
SR4 -1 -1 1912 Value of month not in the range 1 … 12
Value of day not in the range 1 … 31
SR5 6 -1 1811 Value of day not in the range 1 … 31
Value of year not in the range 1812 … 2012
SR6 -1 15 1811 Value of month not in the range 1 … 12
Value of year not in the range 1812 … 2012
SR7 -1 -1 1811 Value of month not in the range 1 … 12
Value of day not in the range 1 … 31
Value of year not in the range 1812 … 2012

Geleneksel Yaklaşımın Eksikliği

  • Eşdeğerlik ilişkisi daha dikkatli seçilirse, oluşan sınıflar çok daha yararlı hale gelecektir.

  • Geleneksel yaklaşımın temel eksiği şudur: “aynı şekilde ele alınma” yalnızca valid / invalid düzeyinde tanımlanmıştır.

  • Oysa NextDate fonksiyonunda asıl önemli olan, tarihin hangi tür durumda bulunduğudur:

    • ay sonu mu?
    • yıl sonu mu?
    • Şubat mı?
    • artık yıl mı?
  • Bu nedenle daha ince taneli sınıflar tanımlamak gerekir.

NextDate Ne Yapar?

  • Bir giriş tarihine uygulanacak işlem, tarih türüne göre değişir:

  • Eğer gün, ayın son günü değilse:

    • fonksiyon yalnızca gün değerini 1 artırır
  • Eğer ayın sonundaysak:

    • sonraki gün 1 olur
    • month değeri artırılır
  • Eğer yılın sonundaysak:

    • hem day hem month değeri 1 yapılır
    • year değeri artırılır
  • Ayrıca artık yıl (leap year) durumu, özellikle Şubat ayı için son gün hesabını önemli hale getirir.

Daha Yararlı Eşdeğer Sınıflar

  • Bu gözlemlerle birlikte şu daha ayrıntılı eşdeğer sınıflar önerilir:

\[ M1 = \{\text{month}: \text{month has 30 days}\} \]

\[ M2 = \{\text{month}: \text{month has 31 days}\} \]

\[ M3 = \{\text{month}: \text{month is February}\} \]

\[ D1 = \{\text{day}: 1 \leq \text{day} \leq 28\} \]

\[ D2 = \{\text{day}: \text{day} = 29\} \]

\[ D3 = \{\text{day}: \text{day} = 30\} \]

\[ D4 = \{\text{day}: \text{day} = 31\} \]

\[ Y1 = \{\text{year}: \text{year} = 2000\} \]

\[ Y2 = \{\text{year}: \text{year is a non-century leap year}\} \]

\[ Y3 = \{\text{year}: \text{year is a common year}\} \]

Bu Yeni Ayrım Neden Daha Güçlü?

  • 30 günlük aylar ile 31 günlük aylar ayrı sınıflar olarak seçilince, ayın son günüyle ilgili mantık daha açık test edilebilir.

  • Şubat ayrı bir sınıf yapıldığında, artık yıl sorularına özel dikkat verilebilir.

  • Gün değerleri de özellikle ayrıştırılmıştır:

    • D1 içindeki günler neredeyse her zaman yalnızca artırılır
    • D4 yalnızca 31 günlük aylar için anlamlıdır
    • D2 ve D3 ise özellikle ay sonu ve Şubat senaryoları için önemlidir
  • Yıl tarafında da üç özel durum ayrılmıştır:

    • 2000 yılı
    • yüzyıl olmayan artık yıllar
    • artık olmayan yıllar

Bölümün Ana Mesajı

  • Bu sınıf kümesi kusursuz değildir; ancak çok sayıda olası hatayı ortaya çıkarabilecek kadar güçlüdür.
  • Buradaki temel ders şudur:
    • iyi eşdeğer sınıf testi, yalnızca değerleri valid/invalid diye ayırmak değildir
    • programın iç davranışını etkileyen işlevsel ayrımları sınıflara yansıtmaktır
  • NextDate örneği, eşdeğerlik ilişkisini doğru seçmenin test kalitesini nasıl ciddi biçimde artırdığını açıkça gösterir.

Yeni Sınıflara Göre Test Durumları

Zayıf Normal Test Durumları

  • Tanımlanan yeni sınıflar aşağıdaki zayıf normal equivalence class test durumlarını üretir.
  • Önceki örneklerde olduğu gibi, girişler ilgili sınıfın yaklaşık orta noktasından mekanik olarak seçilmiştir.
Case ID Month Day Year Expected Output
WN1 6 14 2000 6/15/2000
WN2 7 29 1996 7/30/1996
WN3 2 30 2002 Invalid input date
WN4 6 31 2000 Invalid input date

Mekanik Seçimin Sorunu

  • Girdi değerlerinin mekanik biçimde seçilmesi, alan bilgimizi (domain knowledge) dikkate almaz.

  • Bu nedenle yukarıdaki tabloda iki tane imkânsız tarih oluşmuştur.

  • Bu durum, “otomatik” test durumu üretiminde sık görülen temel bir sorunu gösterir:

    • eşdeğer sınıflar seçilmiş olsa bile
    • alan bilgisinin tamamı bu seçimlere yansıtılmamış olabilir

Güçlü Normal Test Durumları — 1

  • Gözden geçirilmiş sınıflar için güçlü normal equivalence class test durumları aşağıdaki gibidir.
Case ID Month Day Year Expected Output
SN1 6 14 2000 6/15/2000
SN2 6 14 1996 6/15/1996
SN3 6 14 2002 6/15/2002
SN4 6 29 2000 6/30/2000
SN5 6 29 1996 6/30/1996
SN6 6 29 2002 6/30/2002
SN7 6 30 2000 Invalid input date
SN8 6 30 1996 Invalid input date
SN9 6 30 2002 Invalid input date
SN10 6 31 2000 Invalid input date
SN11 6 31 1996 Invalid input date
SN12 6 31 2002 Invalid input date
SN13 7 14 2000 7/15/2000
SN14 7 14 1996 7/15/1996

Güçlü Normal Test Durumları — 2

Case ID Month Day Year Expected Output
SN15 7 14 2002 7/15/2002
SN16 7 29 2000 7/30/2000
SN17 7 29 1996 7/30/1996
SN18 7 29 2002 7/30/2002
SN19 7 30 2000 7/31/2000
SN20 7 30 1996 7/31/1996
SN21 7 30 2002 7/31/2002
SN22 7 31 2000 8/1/2000
SN23 7 31 1996 8/1/1996
SN24 7 31 2002 8/1/2002
SN25 2 14 2000 2/15/2000
SN26 2 14 1996 2/15/1996
SN27 2 14 2002 2/15/2002
SN28 2 29 2000 3/1/2000
SN29 2 29 1996 3/1/1996
SN30 2 29 2002 Invalid input date
SN31 2 30 2000 Invalid input date
SN32 2 30 1996 Invalid input date
SN33 2 30 2002 Invalid input date
SN34 2 31 2000 Invalid input date
SN35 2 31 1996 Invalid input date
SN36 2 31 2002 Invalid input date

Güçlü Normal’a Geçişin Sonucu

  • Zayıf Normal testten güçlü normal teste geçiş, sınır değer testinde gördüğümüz bazı tekrar (redundancy) sorunlarını yeniden gündeme getirir.

  • Zayıf’ten güçlü’a geçişte, normal ya da gürbüz fark etmeksizin, her zaman bir bağımsızlık varsayımı (presumption of independence) yapılır.

  • Bu da eşdeğer sınıfların çapraz çarpımı (cross product) ile doğrudan ilişkilidir.

  • Bu örnekte: 3 month sınıfı, 4 day sınıfı, 3 year sınıfı

    bulunduğu için toplam: \[ 3 \times 4 \times 3 = 36 \]

  • adet güçlü normal equivalence class test durumu oluşur.

Güçlü Gürbüz Sayısı

  • Her değişken için iki ek geçersiz sınıf da eklenirse, toplam 150 güçlü gürbüz equivalence class test durumu elde edilir.

Yıl Sınıflarını Birleştirme Fikri

  • Test kümesi, yıl sınıflarına yeniden bakılarak sadeleştirilebilir.

  • Eğer Y1 ve Y2 birleştirilir ve sonuç leap years kümesi olarak ele alınırsa, toplam 36 test durumu 24 test durumuna düşer.

  • Ancak bu değişiklik iki sonuca yol açar:

    • 2000 yılına özel dikkat ortadan kalkar
    • hangi yılların artık yıl olduğunun belirlenmesi daha karmaşık hale gelir
  • Dolayısıyla burada da temel denge şudur:

    • test sayısını azaltmak
    • ama öğrenilecek bilgiyi fazla kaybetmemek

Örnek Vaka: Commission (Komisyon) Problemi

Komisyon Problemi İçin Girdi Alanı Sınıfları

  • Komisyon probleminin girdi uzayı, locks, stocks ve barrels değişkenlerinin sınırları tarafından doğal biçimde bölünür.

  • Bu eşdeğer sınıflar, geleneksel eşdeğer sınıf testinin de belirleyeceği sınıflardır.

  • İlk sınıf geçerli, diğerleri ise geçersiz sınıflardır.

  • Ancak yalnızca girdi alanına dayalı bu tür sınıfların ürettiği test kümeleri pek tatmin edici değildir.

  • Bu nedenle komisyon fonksiyonunun çıktı aralığı (output range) üzerinden tanımlanan eşdeğer sınıflar daha yararlı olabilir.

Geçerli ve Geçersiz Girdi Sınıfları

  • Girdi değişkenlerinin geçerli sınıfları:

\[ L1 = \{\text{locks}: 1 \leq \text{locks} \leq 70\} \]

\[ L2 = \{\text{locks}: \text{locks} = -1\} \]

\[ S1 = \{\text{stocks}: 1 \leq \text{stocks} \leq 80\} \]

\[ B1 = \{\text{barrels}: 1 \leq \text{barrels} \leq 90\} \]

  • Karşılık gelen geçersiz sınıflar:

\[ L3 = \{\text{locks}: \text{locks}=0 \lor \text{locks}<-1\} \]

\[ L4 = \{\text{locks}: \text{locks}>70\} \]

\[ S2 = \{\text{stocks}: \text{stocks}<1\} \]

\[ S3 = \{\text{stocks}: \text{stocks}>80\} \]

\[ B2 = \{\text{barrels}: \text{barrels}<1\} \]

\[ B3 = \{\text{barrels}: \text{barrels}>90\} \]

Sentinel Olarak Kullanılan locks

  • Burada özel bir durum vardır. locks değişkeni aynı zamanda artık sipariş olmadığını gösteren bir sentinel değer taşır bu sentinel değer -1’dir

  • locks = -1 verildiğinde:

    • while döngüsü sonlanır
    • ardından totalLocks, totalStocks ve totalBarrels değerleriyle satış hesaplanır
    • sonra komisyon hesaplaması yapılır
  • Bu nedenle locks = -1 durumu sıradan bir geçersiz girdi gibi ele alınmaz; program akışını sonlandıran özel bir davranış üretir.

  • Başka bir deyişle bu değer sıradan bir hesaplama girdisi gibi davranmaz daha çok kontrol akışını yöneten özel bir giriş niteliği taşır.

NextDate ile Benzerlik

  • Değişken adları ve sınır uçları dışında bu yapı, NextDate fonksiyonunun ilk sürümüyle temelde aynıdır.
  • Bu yüzden burada:
    • tam olarak bir zayıf normal eşdeğer sınıf test durumu vardır
    • ve bu test durumu aynı zamanda güçlü normal test durumu ile aynıdır
  • Ayrıca:
    • locks = -1 durumu yalnızca iterasyonu sonlandırır
    • toplamda sekiz zayıf gürbüz test durumu oluşur

Zayıf Gürbüz Test Durumları

Case ID Locks Stocks Barrels Expected Output
WR1 10 10 10 $100
WR2 -1 40 45 Program terminates
WR3 -2 40 45 Value of locks not in the range 1 … 70
WR4 71 40 45 Value of locks not in the range 1 … 70
WR5 35 -1 45 Value of stocks not in the range 1 … 80
WR6 35 81 45 Value of stocks not in the range 1 … 80
WR7 35 40 -1 Value of barrels not in the range 1 … 90
WR8 35 40 91 Value of barrels not in the range 1 … 90

Commission Testi (WR8)(Python)

  • Çoklu sınırların test edilebildiği Komisyon hesabı (locks, stocks, barrels) formülünü aşağıda çalıştırabilirsiniz.

Güçlü Gürbüz Test Durumları

  • Aşağıdaki tablo, üç boyutlu uzaydaki ek güçlü gürbüz test durumlarının yalnızca bir köşesini göstermektedir.
Case ID Locks Stocks Barrels Expected Output
SR1 -2 40 45 Value of locks not in the range 1 … 70
SR2 35 -1 45 Value of stocks not in the range 1 … 80
SR3 35 40 -2 Value of barrels not in the range 1 … 90
SR4 -2 -1 45 Value of locks not in the range 1 … 70
Value of stocks not in the range 1 … 80
SR5 -2 40 -1 Value of locks not in the range 1 … 70
Value of barrels not in the range 1 … 90
SR6 35 -1 -1 Value of stocks not in the range 1 … 80
Value of barrels not in the range 1 … 90
SR7 -2 -1 -1 Value of locks not in the range 1 … 70
Value of stocks not in the range 1 … 80
Value of barrels not in the range 1 … 90

Girdi Alanına Dayalı Yaklaşımın Sınırı

  • Dikkat edilirse, güçlü test durumlarında —normal ya da gürbüz olsun— yalnızca bir tanesi gerçekten meşru bir girdidir.

  • Hata durumlarıyla çok ilgileniyorsak bu test kümesi anlamlı olabilir.

  • Ancak bu küme, problemin hesaplama kısmı hakkında güçlü bir güven vermez.

  • Bu yüzden, eşdeğer sınıfları bu kez çıktı aralığı üzerinden tanımlamak daha tutarlı bir yaklaşımdır.

Neden Çıktı Aralığına Dayalı Sınıflar Daha Yararlı?

  • Girdi alanına dayalı sınıflar burada çoğunlukla:
    • sınır ihlallerini
    • hata mesajlarını
    • sentinel davranışını görünür kılar
  • Buna karşılık çıktı aralığına dayalı sınıflar:
    • komisyon hesabının farklı bölgelerini
    • hesaplama mantığındaki işlevsel ayrımları
    • farklı komisyon dilimlerini daha doğrudan test eder
  • Bu nedenle Commission probleminde çıktı temelli sınıflandırma, yalnızca hata yakalamak için değil, hesaplama davranışını güvence altına almak için de daha öğreticidir.

Satış Fonksiyonu

  • Satış miktarı, satılan locks, stocks ve barrels sayısına bağlıdır:

\[ \text{Sales} = 45 \cdot \text{locks} + 30 \cdot \text{stocks} + 25 \cdot \text{barrels} \]

  • Bu ifadeye göre komisyon aralıkları üzerinden üç eşdeğer sınıf tanımlanabilir:

\[ S1 = \{\langle \text{locks}, \text{stocks}, \text{barrels} \rangle : \text{sales} \leq 1000\} \]

\[ S2 = \{\langle \text{locks}, \text{stocks}, \text{barrels} \rangle : 1000 < \text{sales} \leq 1800\} \]

\[ S3 = \{\langle \text{locks}, \text{stocks}, \text{barrels} \rangle : \text{sales} > 1800\} \]

Çıktı Aralığına Dayalı Sınıfların Yorumu

  • Giriş uzayını üç boyutlu geometrik bir modelle düşünürsek konuyu canlandırmak kolaylaşır:
  • Buna göre kavramsal olarak:
    • S1 elemanları, orijine yakın piramitte yer alan tamsayı koordinatlı noktalardır
    • S2 elemanları, bu piramit ile giriş uzayının geri kalanı arasındaki “üçgensel dilim”dedir
    • S3 elemanları ise S1 ve S2 dışında kalan dikdörtgensel hacimdeki noktalardır
  • Girdi alanındaki güçlü eşdeğer sınıfların bulduğu hata durumlarının tümü, analiz edilen bu temel uzay hacminin dışındadır.

Çapraz Çarpım Artık Kullanılmıyor

  • Üçgen probleminde olduğu gibi, girdinin bir üçlü (triplet) olması nedeniyle artık test durumlarını bir Kartezyen çarpımdan seçmiyoruz.
  • Bunun yerine, satış/komisyon aralıklarını temsil eden anlamlı üçlüler seçiyoruz.
Test Durumu Locks Stocks Barrels Sales Commission
OR1 5 5 5 500 50
OR2 15 15 15 1500 175
OR3 25 25 25 2500 360

Çıkarım

  • Bu test durumları, problemin önemli bölümlerini çalıştırdığımıza dair anlamlı bir güven sağlar.

  • Zayıf Gürbüz testlerle birlikte kullanıldığında, komisyon problemi için oldukça iyi bir test kümesi elde edilmiş olur.

  • Yine de satış değerinin \(1000\), \(1800\) sınırlarında geçişlerin doğru olup olmadığını görmek için ek boundary checking yararlı olabilir.

  • Bunun kolay olmamasının nedeni, doğrudan satış değerini değil, yalnızca locks, stocks ve barrels değerlerini seçebiliyor olmamızdır.

  • Bu örnekte sabitler bilhassa öyle seçilmiştir ki, bu sınırlar için “güzel” üçlüler bulunabilsin.

Edge Testing

  • ISTQB Advanced Level Syllabus (ISTQB, 2012), sınır değer analizi (boundary value analysis) ile eşdeğer sınıf testinin (eşdeğer sınıf testi) birleşiminden oluşan hibrit bir yaklaşımı edge testing olarak adlandırır.

  • Bu yaklaşıma ihtiyaç duyulan durum şudur:

    • belirli bir değişkenin bitişik (contiguous) değer aralıkları
    • aynı zamanda eşdeğer sınıfları oluşturuyorsa
  • Böyle durumlarda sınıf sınırlarının yakınında hata bulunma olasılığı artar.

  • Edge testing, özellikle bu tür potansiyel hataları hedefler.

Temel Fikir

  • Önceki örnekte:

    • \(x_1\) için 3 geçerli eşdeğer sınıf
    • \(x_2\) için 2 geçerli eşdeğer sınıf vardı
  • Bu sınıfların, uygulamada “aynı şekilde işlenen” bölgeleri temsil ettiği varsayılır.

  • Ancak sınıflar arası geçiş noktaları, yani kenarlar / sınırlar (edges), hata üretmeye daha yatkın olabilir.

  • Edge testing bu nedenle:

    • yalnızca sınıfın içinden örnek seçmekle yetinmez
    • sınıf sınırının hemen çevresindeki değerleri de özellikle test eder

\(x_1\) İçin Normal Edge Değerleri

  • Örnekte \(x_1\) için tam normal edge test değer kümesi şöyledir:

\[ \{a,\ a^{+},\ b^{-},\ b,\ b^{+},\ c^{-},\ c,\ c^{+},\ d^{-},\ d\} \]

  • Burada:
    • \(a^{+}\) → \(a\)’nın hemen üstündeki değer
    • \(b^{-}\) → \(b\)’nin hemen altındaki değer
    • \(b^{+}\) → \(b\)’nin hemen üstündeki değer gibi yorumlanır

\(x_1\) İçin Gürbüz Edge Değerleri

  • \(x_1\) için gürbüz edge test değer kümesi ise şöyledir:

\[ \{a^{-},\ a,\ a^{+},\ b^{-},\ b,\ b^{+},\ c^{-},\ c,\ c^{+},\ d^{-},\ d,\ d^{+}\} \]

  • Burada normal kümeye ek olarak:
    • alt sınırın hemen dışı
    • üst sınırın hemen dışı da test edilir
  • Böylece yalnızca sınırların kendisi değil, sınır dışına taşma davranışı da sınanmış olur.

\(x_2\) İçin Normal ve Gürbüz Edge Değerleri

  • \(x_2\) için normal edge test değerleri:

\[ \{e,\ e^{+},\ f^{-},\ f,\ f^{+},\ g^{-},\ g\} \]

  • \(x_2\) için gürbüz edge test değerleri:

\[ \{e^{-},\ e,\ e^{+},\ f^{-},\ f,\ f^{+},\ g^{-},\ g,\ g^{+}\} \]

Boundary Value Testing ile Fark

  • Buradaki ince ama önemli fark şudur:
    • edge test values, sınır değer testinde kullandığımız nominal değerleri içermez
  • Yani edge testing’in odağı:
    • sınıfın ortasındaki tipik bir değer değil
    • sınıfın kenarı ve kenarın hemen çevresidir
  • Bu yönüyle edge testing, eşdeğer sınıf yaklaşımını sınır çevresine doğru yoğunlaştırır.

Boundary Value Testing ve Edge Testing Karşılaştırması

  • Boundary Value Testing
    • sınırların kendisini ve hemen çevresini test eder
    • çoğu kullanımda ayrıca nominal değerleri de içerir
  • Edge Testing
    • eşdeğer sınıf sınırlarını hedef alır
    • nominal değer seçmek yerine kenar çevresini yoğun biçimde örnekler
  • Dolayısıyla edge testing, sınır değer testinin mantığını eşdeğer sınıf yapısıyla birleştiren daha odaklı bir seçim stratejisi olarak düşünülebilir.

Nasıl Uygulanır?

  • Edge değer kümeleri belirlendikten sonra, edge testing şu dört eşdeğer sınıf test formundan herhangi biriyle birlikte uygulanabilir:
    • Zayıf Normal
    • Güçlü Normal
    • Zayıf Gürbüz
    • Güçlü Gürbüz
  • Dolayısıyla edge testing başlı başına ayrı bir sınıflandırma değil, mevcut eşdeğer sınıf test biçimlerine uygulanan bir seçim stratejisidir.

Sonuç

  • Sınır değer testi, eşdeğer sınıf testi ve edge testing arasında doğrudan bir ilişki vardır:
    • eşdeğer sınıflar → hangi bölgelerin “aynı şekilde işlendiğini” söyler
    • sınır değer yaklaşımı → sınır çevresini önemli görür
    • edge testing → bu ikisini birleştirir
  • Doğal olarak test sayısı da, sınır değer testi ve eşdeğer sınıf testindeki varyasyonlarda olduğu gibi, seçilen forma bağlı olarak artar.

Uygulama Kılavuzları ve Gözlemler

  • Üç örnek üzerinden ilerledikten sonra, eşdeğer sınıf testi için bazı genel gözlemler ve uygulama kılavuzları çıkarılabilir.
  • Bu gözlemler iki başlık altında okunabilir:
    • hangi durumda hangi form daha uygundur?
    • eşdeğerlik ilişkisi tasarlanırken nelere dikkat edilmelidir?

1–2. Kapsam ve Güçlü Tipli Diller

  1. Zayıf formlar (normal ya da gürbüz), karşılık gelen güçlü formlar kadar kapsamlı değildir.
  2. Eğer gerçekleme dili güçlü tipli (strongly typed) ise ve geçersiz değerler çalışma zamanında doğrudan hata üretiyorsa, gürbüz formları kullanmak anlamlı olmayabilir.
  • Yani:
    • zayıf ↔︎ daha az kapsam
    • güçlü ↔︎ daha fazla kapsam
    • gürbüz ↔︎ geçersiz girdilere odak ilişkisi nettir.

3–4. Gürbüz Formların Uygun Olduğu Durumlar

  1. Eğer hata durumları (error conditions) yüksek öncelikliyse, gürbüz formlar uygundur.
  2. Eşdeğer sınıf testi, özellikle giriş verisi:
    • aralıklar (intervals) biçiminde
    • ya da ayrık değer kümeleri (sets of discrete values) biçiminde tanımlanıyorsa uygundur.
  • Özellikle değişken sınırlarının aşılması sistem arızalarına yol açabiliyorsa, eşdeğer sınıf testi güçlü bir adaydır.

5–6. Hibrit Kullanım ve Karmaşık Fonksiyonlar

  1. Eşdeğer sınıf testi, sınır değer testi (boundary value testing) ile hibrit biçimde kullanıldığında güçlenir.
    • Böylece eşdeğer sınıfları tanımlarken yapılan emek yeniden kullanılabilir.
  2. Program fonksiyonu karmaşıksa, eşdeğer sınıf testi daha da uygun hale gelir.
    • Çünkü fonksiyonun iç karmaşıklığı, yararlı eşdeğer sınıfların belirlenmesine yardımcı olabilir.
    • NextDate örneği bunun tipik bir örneğidir.

7. Güçlü Formlarda Bağımsızlık Varsayımı

  1. Güçlü eşdeğer sınıf testi, değişkenlerin bağımsız olduğu varsayımını yapar.
  • Buna bağlı olarak test durumlarının çarpımsal artışı, tekrar (redundancy) sorunlarını gündeme getirir.

  • Eğer değişkenler arasında bağımlılıklar varsa:

    • güçlü yaklaşım sık sık “hata” test durumları üretir
    • NextDate örneğinde görüldüğü gibi bazı kombinasyonlar doğal olarak geçersiz hale gelir
  • Değişkenler arası bağımlılığın yarattığı bu tür karmaşık durumları yönetmek için, ilerleyen derslerimizde işleyeceğimiz decision table (karar tablosu) tekniği daha güçlü bir alternatif sunar.

8. Doğru Eşdeğerlik İlişkisini Bulmak

  1. “Doğru” eşdeğerlik ilişkisini bulmadan önce birden fazla deneme gerekebilir.
  • NextDate örneğinde gördüğümüz gibi, ilk akla gelen sınıflandırma her zaman en yararlı olan değildir.

  • Bazı problemlerde ise daha “doğal” ya da “bariz” bir eşdeğerlik ilişkisi bulunur.

  • Emin olunmadığında en iyi yaklaşım:

    • makul bir gerçeklemeyi zihinde canlandırmak
    • programın hangi girdileri aynı şekilde işleyeceğini tahmin etmektir
  • Bu yaklaşım bazen competent programmer hypothesis olarak adlandırılır.

9. Progression ve Regression Ayrımı

  1. Eşdeğer sınıf testinin güçlü ve zayıf biçimleri arasındaki fark, progression testing ile regression testing ayrımında yararlıdır.
  • Genel sezgi şu şekilde okunabilir:
    • daha güçlü ve kapsamlı test kümeleri → yeni davranışı keşfetme / güven artırma
    • daha hafif ve temsil gücü olan test kümeleri → mevcut davranışı tekrar doğrulama

Bölümün Genel Sonucu

  • Eşdeğer sınıf testi tek bir sabit yöntem değildir.
  • Etkinliği şu kararlara bağlıdır:
    • eşdeğerlik ilişkisinin nasıl tanımlandığı
    • zayıf / güçlü seçimi
    • normal / gürbüz seçimi
    • gerekirse boundary value testing ile hibrit kullanım
  • Bu nedenle iyi eşdeğer sınıf testi, yalnızca sınıf saymak değil, program davranışını doğru soyutlamak demektir.

Dersin Özeti

  • Eşdeğer Sınıf Testi, daha sistematik bir kapsama sunarak gereksiz test tekrarlarını önler.
  • Temel odak “kaç sınıf var” değildir, asıl olan eşdeğerlik ilişkisinin doğru tanımlanmasıdır.
  • Sistem gereksinimlerine ve hata izolasyonu ihtiyacına göre Zayıf/Güçlü ve Normal/Gürbüz formlar tercih edilmelidir.
  • Sadece girdi alanını düşünmektense çıktı aralığını modellemek test kümesini daha işlevsel hale getirir.
  • Bir sonraki derste daha karmaşık iş mantıklarını modelleyebilmek için Karar Tablolarına (Decision Tables) giriş yapacağız.