Yazılım Test Süreçleri

Testçiler İçin Ayrık Matematik

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

2026

Öğrenim Çıktıları

  • Bu derste küme teorisinin temel kavramlarını öğreneceksiniz.
  • Bu kavramlar, test senaryoları yazarken size yardımcı olacaktır.

Testçiler için Ayrık Matematik

  • Test, yazılım yaşam döngüsündeki aktiviteler içinde matematiksel tanımlama ve analize en uygun olanlardan biridir.
  • Bu nedenle bu bölümde testçinin ihtiyaç duyacağı matematiksel araçlar ele alınır.
  • Buradaki matematik konuları “amaç değil”, testçilik için araçtır:
    • daha fazla kesinlik
    • daha fazla titizlik
    • daha yüksek verimlilik

Testte Küme Neden İşe Yarar?

  • Örnek: NextDate testinde “30 çeken aylar”ı tek tek saymak yerine bir küme tanımlarız.

\[ M1 = \{Nisan,\, Haziran,\, Eylül,\, Kasım\} \]

  • Okunuş: “M1, elemanları Nisan, Haziran, Eylül, Kasım olan kümedir.”

Küme Üyeliği (Set Membership)

  • Üyelik sembolü: \(\in\)

Örnek:

\[ Nisan \in M1 \]

Üye Değilse

  • Üye olmama sembolü: \(\notin\)

\[ Aralık \notin M1 \]

Küme Tanımlama (Set Definition)

Bir kümeyi 3 şekilde tanımlayabiliriz:

  1. Elemanları listeleyerek
  2. Bir kural vererek (karar kuralı)
  3. Diğer kümelerden oluşturarak

1) Elemanları Listeleyerek

  • Az elemanlı kümelerde ve düzeni açık olan durumlarda uygundur.

Örnek: NextDate için “izin verilen yıllar”:

\[ Y = \{1812, 1813, 1814, \ldots, 2011, 2012\} \]

  • Not: Kümede sıra önemli değildir.

2) Kural Vererek (Karar Kuralı)

  • Kümeyi “şu koşulu sağlayanlar” diye tanımlarız.
  • Bu yöntem daha esnektir ama kural net olmalıdır.

Örnek:

\[ Y = \{year : 1812 \le year \le 2012\} \]

  • Okunuş: “Y, 1812 ile 2012 arasında (dahil) olan tüm yıllar kümesidir.”
  • Bu tanım sayesinde herhangi bir year için “Y’nin üyesi mi?” sorusu cevaplanır.

Test Açısından Avantaj: Belirsizliği Zorlar

  • Kural ile tanım, “muğlak” ifadeleri hızlıca ortaya çıkarır.
  • Deneyimli testçilerin karşılaştığı birçok “test edilemez gereksinim” sorunu, aslında belirsiz bir kural yüzündendir.

Belirsiz Kurala Örnek

Örnek küme tanımı:

\[ N = \{t : t \text{ neredeyse eşkenar bir üçgendir}\} \]

  • Soru: (500, 500, 501) bu kümeye girer mi?
  • Peki (50, 50, 51) veya (5, 5, 6) için ne diyeceğiz?

“Neredeyse” ifadesi kuralı belirsiz yapar → test zorlaşır.

2) Kural Vererek: Listelemesi Zor Kümeler

Bazı kümelerde elemanları tek tek yazmak pratik değildir.

Örnek: Commission probleminde:

\[ S = \{sales : \text{toplam satışa } \%15 \text{ komisyon oranı uygulanır}\} \]

  • Bu kümenin elemanlarını tek tek yazamayız.
  • Ama verilen bir sales için kuralı uygulayıp “S’nin üyesi mi?” diyebiliriz.

Kural Tanımının Dezavantajı

  • Kural, mantıksal olarak karmaşık hale gelebilir.
  • Özellikle “var” / “tüm” gibi niceleyicilerle yazılırsa okunabilirlik azalabilir.

Bu niceleyiciler kuralı çok kesin yapar, ama:

  • herkes bu notasyona alışık değilse
  • müşteri / paydaş metni okurken boğulabilir
  • gereksinimi anlamak zorlaşır

Karar Kuralı ve Kendi Kendine Referans

Karar kuralı bazen kendi kendisine referans verebilir. Bu ne demek?

  • Kural, tanımladığı şeyi tanımlamak için kendini kullanır.
  • Bu da bir döngü (circularity) oluşturur.
  • Sonuç: tanım paradoksal hale gelebilir.

Sevilla Berberi Paradoksu (Self-Reference)

“Sevilla berberi, kendini tıraş etmeyen herkesı tıraş eden kişidir.” Peki berber kendisini tıraş eder mi?

  1. Ederse
  • O zaman “kendini tıraş etmeyenler” grubunda değildir.
  • Ama berber sadece “kendini tıraş etmeyenleri” tıraş eder.
  • Çelişki: Berberin kendini tıraş etmesi tanımla uyuşmaz.
  1. Etmezse
  • O zaman “kendini tıraş etmeyenler” grubundadır.
  • Tanıma göre berber bu gruptaki herkesi tıraş eder.
  • Çelişki: Berberin kendini tıraş etmesi gerekir.

Yani bu tanım, tutarlı bir durum/varlık tanımlamaz → kendine referans (circularity) paradoksu.

Boş Küme (Empty Set)

  • Boş küme \(\emptyset\) sembolü ile gösterilir.
  • Boş kümenin hiç elemanı yoktur.

Boş Kümeyle İlgili 2 Not

  1. Boş küme tektir (iki farklı boş küme olamaz).
  2. \(\emptyset\), \(\{\emptyset\}\) ve \(\{\{\emptyset\}\}\) birbirinden farklı kümelerdir.

Kural Her Zaman Yanlışsa → Küme Boştur

  • Bir kümeyi “kural ile” tanımladığınızda, eğer kural hiçbir değer için doğru değilse, küme boştur.

Örnek:

\[ \emptyset = \{year : 2012 \le year \le 1812\} \]

  • Bu aralık mümkün olmadığı için küme boştur.

Venn Diyagramları

  • Kümeler arası ilişkileri çizmek için iki klasik araç vardır:
    • Venn diyagramları
    • Euler diyagramları
  • İkisi de, metinle anlatılan kavramları görselleştirmeye yardım eder.
  • Testte Venn’i zaten kullandık:
    • Önceki derste S (tanımlı) ve P (uygulanmış) davranış kümeleri

Venn Diyagramı Nasıl Okunur?

  • Bir küme genelde bir çember ile gösterilir.
  • Çemberin içi, kümenin elemanlarını temsil eder.
  • Diyagram genelde bir evren (U) içinde çizilir.

Örnek: “30 çeken aylar” kümesi

Venn Diyagramları Hakkında Notlar

  • Klasik Venn diyagramları çoğunlukla 2 veya 3 küme için kullanışlıdır.
    • 5 kümenin tüm kesişimlerini aynı anda göstermek pratik değildir.
  • Tarama/gölgeleme iki farklı amaçla kullanılabilir:
    • ilgi bölgesini vurgulamak
    • boş bölgeyi göstermek
  • Bu yüzden gölgeleme kullanılıyorsa mutlaka açıklama (legend) eklenmelidir.

Boş Küme ve Tarama

  • “Bir küme (ya da bir bölge) boş” nasıl gösterilir?
  • Yaygın yöntem: ilgili bölgeyi tarama ile göstermek
    (ama bu bazen “ilgi bölgesi” taramasıyla karışabilir)
  • En iyi pratik: taramanın ne anlama geldiğini açıkça yazmak.

Evren (Universe of Discourse) U

  • Çoğu tartışmada, kümeler daha büyük bir kümenin alt kümeleri gibi düşünülür:
    • bu büyük kümeye evren (U) denir.
  • Evren, çoğu zaman metinde açık yazılmadığı için karışıklık doğurabilir.
    • müşteri–geliştirici iletişiminde tipik bir belirsizlik kaynağıdır.

Küme İşlemleri (Set Operations)

  • Küme teorisinin “ifade gücü” büyük ölçüde temel işlemlerden gelir:
    • birleşim (union)
    • kesişim (intersection)
    • tümleyen (complement)
  • Sık kullanılan diğerleri:
    • fark (relative complement)
    • simetrik fark (symmetric difference)
    • Kartezyen çarpım (Cartesian product)
  • Bu tanımlar yapılırken genelde iki küme \(A\) ve \(B\), bir evrenin \(U\) içinde düşünülür.

Temel Mantıksal Bağlaçlar

Küme tanımları, mantıksal bağlaçlarla okunur:

  • “ve” : \(\land\)
  • “veya” : \(\lor\)
  • “özel veya (xor)” : \(\oplus\)
  • “değil” : \(\sim\)

Birleşim ve Kesişim (Tanım)

Verilen \(A\) ve \(B\) kümeleri için:

  • Birleşim
    • \(A \cup B = \{x : x \in A \lor x \in B\}\)
  • Kesişim
    • \(A \cap B = \{x : x \in A \land x \in B\}\)

Tümleyen ve Fark (Tanım)

  • A’nın tümleyeni
    • \(A' = \{x : x \notin A\}\)
  • Fark (B’nin A’ya göre tümleyeni)
    • \(A - B = \{x : x \in A \land x \notin B\}\)

Simetrik Fark (Tanım)

  • Simetrik fark
    • \(A \oplus B = \{x : x \in A \oplus x \in B\}\)

Ayrıca şu ilişki sezgisel olarak görülebilir:

\[ A \oplus B = (A \cup B) - (A \cap B) \]

Venn ile Görselleştirme

  • Bu temel işlemler Venn ile çok net görülür.
  • Bu sezgisel güç, testte de işe yarar:
    • test case kümeleri arasındaki ilişkileri anlatmak
    • “hangi kısım kapsandı?” sorusunu görselleştirmek

Yazılım Geliştirmede Venn Nerede Karşımıza Çıkar?

  • Venn, yönlü graflarla birlikte:
    • StateCharts gösteriminin temelinde yer alır
    • UML’de kullanılan kontrol notasyonlarını destekler

Sıralı İkili ve Sırasız İkili

  • Sırasız çift: \((a, b)\)
  • Sıralı çift: \(\langle a, b \rangle\)

Fark: - \(a \ne b\)iken\((a,b) = (b,a)\) - ama \(\langle a,b \rangle \ne \langle b,a \rangle\)

Kartezyen Çarpım

  • \(A \times B = \{\langle x, y \rangle : x \in A \land y \in B\}\)

  • Venn diyagramları Kartezyen çarpımı doğrudan göstermez; aşağıdaki gibi örnekleyebiliriz.

  • \(A = \{1,2,3\}\), \(B = \{w,x,y,z\}\)

\[ A \times B = \{\langle 1,w\rangle,\langle 1,x\rangle,\langle 1,y\rangle,\langle 1,z\rangle, \langle 2,w\rangle,\ldots,\langle 3,z\rangle\} \]

Kardinalite ve “Test Sayısı Patlaması”

  • Bir kümenin eleman sayısı: \(|A|\)
  • Çarpımın eleman sayısı:

\[ |A \times B| = |A| \cdot |B| \]

Fonksiyonel testte çoklu girdi değişkenleri olduğunda, Kartezyen çarpım test case sayısını hızla büyütür.

Küme İlişkileri (Set Relations)

  • Küme işlemleriyle yeni kümeler üretiriz.
  • Ürettiğimiz yeni küme ile eski küme arasındaki ilişkiyi bilmek isteriz.
  • Bu nedenle iki küme \(A\) ve \(B\) arasında 3 temel ilişki tanımlarız:
    • alt küme
    • öz alt küme
    • eşitlik

Alt Küme (Subset)

  • \(A\), \(B\)`’nin alt kümesidir:

\[ A \subseteq B \]

Anlamı: \(A\)’nın her elemanı \(B\)’de de vardır.

\[ x \in A \Rightarrow x \in B \]

Öz Alt Küme (Proper Subset)

  • \(A\), \(B\)’nin öz alt kümesidir:

\[ A \subset B \]

Anlamı:

  • \(A \subseteq B\) olmalı
  • ve \(B\)’de \(A\)’da olmayan en az bir eleman bulunmalı

Boş küme ile ifade:

\[ B - A \ne \emptyset \]

Küme Eşitliği (Equality)

  • \(A\) ve \(B\) eşitse:

\[ A = B \]

Bu, iki taraflı alt küme demektir:

\[ A \subseteq B \ \land\ B \subseteq A \]

Kısa Özet

  • Alt küme: “A’nın hepsi B’nin içinde”
  • Öz alt küme: “A, B’nin içinde ama B daha büyük”
  • Eşitlik: “İkisi de birbirinin içinde → aynı küme”

Küme Bölümlemesi (Set Partitions)

  • Bölümleme (partition), testçiler için çok önemli bir fikirdir.
  • Günlük hayattaki benzetmeler:
    • ofisi bölmelere ayırmak
    • bir bölgeyi seçim bölgelerine ayırmak
  • Temel fikir: Bir bütünü öyle parçalara ayır ki:
    • her şey bir parçanın içinde olsun
    • hiçbir şey dışarıda kalmasın

Tanım: Partition Ne Zaman Olur?

Bir küme \(A\) ve \(A\)’nın alt kümeleri \(A_1, A_2, \ldots, A_n\) için:

  • Alt kümeler \(A\)’nın bir bölümlemesidir ancak ve ancak:
  1. Kapsama (completeness): \[ A_1 \cup A_2 \cup \cdots \cup A_n = A \]

  2. Ayrıklık (non-overlap): \[ i \ne j \Rightarrow A_i \cap A_j = \emptyset \]

Test Açısından Neden Önemli?

Bu iki şart testte iki garanti verir:

  • Tamlık: “her durum bir yere düşer”
  • Tekrar yok: “aynı durum iki kez test edilmez”

Fonksiyonel testte en zor işlerden biri doğru bölümlemeyi bulmaktır.

Bölümleme Nasıl Görselleştirilir?

  • Bölümlemeler Venn diyagramlarında bazen “puzzle” gibi çizilir.

Üçgen Örneği ile Bölümleme

Üçgen probleminde evreni (tüm (a,b,c) girişleri) şu şekilde bölümleyebiliriz:

  1. Üçgen / Üçgen değil
  2. Eşkenar / İkizkenar / Çeşitkenar / Üçgen değil
  3. Eşkenar / İkizkenar / Çeşitkenar / Dik / Üçgen değil

Bölümlemeler “çakışmamalı”

    1. bölümleme ilk bakışta iyi görünür ama bir problem var:
    • Dik üçgen ile çeşitkenar kümeleri ayrık değildir.
  • Örnek:
    • (3,4,5) hem dik üçgen hem çeşitkenardır.

Bölümleme tasarlarken “etiketler mantıklı mı?”dan önce şu iki kontrol şart: Kapsıyor mu? (coverage), Çakışıyor mu? (disjointness)

Küme Özdeşlikleri (Set Identities)

  • Küme işlemleri ve ilişkileri birlikte ele alındığında, karmaşık küme ifadelerini sadeleştirmeyi sağlayan özdeşlikler ortaya çıkar.
  • Test için amacımız hepsini ispatlamak değil test bağlamında gerektiğinde tanıyıp kullanmak

Temel Özdeşlikler (1)

Ad İfade
Kimlik yasaları (Identity) \(A \cup \emptyset = A\)
\(A \cap U = A\)
Baskınlık yasaları (Domination) \(A \cup U = U\)
\(A \cap \emptyset = \emptyset\)
İdempotent yasalar (Idempotent) \(A \cup A = A\)
\(A \cap A = A\)
Tümleme yasası (Complementation) \((A')' = A\)
Değişme yasaları (Commutative) \(A \cup B = B \cup A\)
\(A \cap B = B \cap A\)

Temel Özdeşlikler (2)

Ad İfade
Birleşme yasaları (Associative) \(A \cup (B \cup C) = (A \cup B) \cup C\)
\(A \cap (B \cap C) = (A \cap B) \cap C\)
Dağılma yasaları (Distributive) \(A \cup (B \cap C) = (A \cup B) \cap (A \cup C)\)
\(A \cap (B \cup C) = (A \cap B) \cup (A \cap C)\)
De Morgan yasaları \((A \cup B)' = A' \cap B'\)
\((A \cap B)' = A' \cup B'\)

Mini Not

  • Bu özdeşlikler, küme ifadelerini sadeleştirerek:
    • “hangi durumları kapsıyorum?”
    • “hangi durumlar dışarıda kaldı?” sorularını daha net görmeyi sağlar.

Fonksiyonlar (Functions)

  • Fonksiyon kavramı, yazılım geliştirme ve test için merkezîdir.
  • Yazılımı çoğu zaman “girdi → çıktı” eşlemesi olarak düşünürüz.

Örnekler (önceki bölümden):

  • NextDate: (month, day, year) → yarının tarihi
  • Triangle: (a,b,c) → üçgen türü
  • Commission: sales → komisyon
    (sales de (locks, stocks, barrels) satışlarından türetilir)
  • SATM: daha karmaşık fonksiyonlar içerir → test de daha karmaşıktır.

Yazılımı Fonksiyon Gibi Düşünmek

  • Her program, girdilerini alıp bir çıktı üreten bir fonksiyon gibi görülebilir.
  • Matematiksel terimler:
    • Domain (tanım kümesi): olası girdiler
    • Range (değer kümesi): olası çıktılar

Tanım (Kısa)

Verilen \(A\) ve \(B\) kümeleri için bir fonksiyon:

  • \(f\), \(A \times B\) Kartezyen çarpımının bir alt kümesidir.
  • Kritik şart: \(A\)’daki her eleman en fazla bir \(B\) elemanı ile eşleşir.

Daha açık ifadeyle:

  • Eğer \(a_1 \ne a_2\) ise, \(f(a_1)\) ve \(f(a_2)\) ayrı olabilir; sorun yok.
  • Ama aynı girdi için iki farklı çıktı olamaz.

“İyi davranan fonksiyon” ne demek?

  • Fonksiyon, şu anlamda “iyi davranır”:
    • \(A\)’daki bir eleman, \(B\)’de birden fazla elemana eşlenmez.
  • Eğer aynı girdi bazen farklı çıktı üretiyorsa:
    • bu deterministik olmayan (nondeterministic) bir davranıştır.

Testte bu önemli: Determinizm yoksa “beklenen çıktı” tanımlamak zorlaşır (oracle problemi büyür).

Tanım Kümesi ve Değer Kümesi (Domain & Range)

  • Bir fonksiyon \(f\) için:
    • \(A\) = tanım kümesi (domain) → girdiler
    • \(B\) = değer kümesi (range) → çıktılar
  • Girdi ve çıktının “doğal bir sırası” vardır:
    • önce girdi, sonra çıktı

Fonksiyon Gösterimi (2 yaygın notasyon)

  1. “A’dan B’ye fonksiyon”

\[ f: A \rightarrow B \]

  1. “A×B’nin bir alt kümesi olarak”

\[ f \subseteq A \times B \]

Küme Seçimi Serbesttir

  • Bu tanımda \(A\) ve \(B\) için özel bir kısıt yoktur:
    • \(A = B\) olabilir
    • \(A\) veya \(B\), başka kümelerin Kartezyen çarpımı da olabilir

Fonksiyon Türleri (Function Types)

  • Fonksiyonları, “eşlemenin” özelliklerine göre sınıflandırırız.
  • Bir fonksiyon \(f: A \rightarrow B\) için şu kümeyi tanımlarız:

\[ f(A) = \{ b_i \in B : b_i = f(a_i) \text{ olan bir } a_i \in A \text{ vardır} \} \]

  • Bu kümeye bazen “A’nın f altındaki görüntüsü” (image) denir.

Örtme (Onto / Surjective)

  • \(f\), \(A\)’dan \(B\)’ye örten (onto) fonksiyondur:

\[ f(A) = B \]

Anlamı: \(B\)’deki her eleman, \(A\)’dan en az bir elemanın çıktısıdır.

İçine (Into)

  • \(f\), \(A\)’dan \(B\)’ye içine (into) fonksiyondur:

\[ f(A) \subset B \]

Anlamı: \(B\)’deki bazı elemanlara hiç ulaşılamaz (çıktı olarak hiç üretilmez).

Birebir (One-to-One / Injective)

  • \(f\), birebir ise farklı girdiler farklı çıktılar üretir:

\[ a_i \ne a_j \Rightarrow f(a_i) \ne f(a_j) \]

Çoktan Bire (Many-to-One)

  • \(f\), çoktan bire ise farklı girdiler aynı çıktıya gidebilir:

\[ \exists a_i, a_j \in A,\ a_i \ne a_j \text{ ve } f(a_i) = f(a_j) \]

Not: “Fonksiyon” tanımı gereği, bire çok (one-to-many) olamaz.
Aynı girdi iki farklı çıktı verirse deterministik olmaz.

NextDate ile Örnek

NextDate için:

  • \(A\): 1 Jan 1812 – 31 Dec 2012 tarihleri
  • \(B\): 2 Jan 1812 – 1 Jan 2013 tarihleri
  • \(C = A \cup B\)

Bu durumda:

  • NextDate: \(A \rightarrow B\) birebir ve örten olabilir.
  • NextDate: \(A \rightarrow C\) birebir ama içine olabilir.

Test Açısından Neden Önemli?

  • onto vs into ayrımı:
    • domain ve range tabanlı testte “hangi çıktıların üretilebildiği”ni etkiler
  • birebir fonksiyonlar çoğu zaman:
    • daha fazla ayırt edici test gerektirebilir
  • çoktan bire fonksiyonlarda:
    • farklı girdilerin aynı çıktıyı üretmesi normal olabilir
      (test oracle’ı buna göre yazılmalıdır)

Fonksiyon Bileşimi (Function Composition)

  • Bazı durumlarda bir fonksiyonun çıktısı, bir sonraki fonksiyonun girdisi olur.
  • Örneğin:

\[ f: A \rightarrow B \]

\[ g: B \rightarrow C \]

\[ h: C \rightarrow D \]

Bu durumda fonksiyonlar bileştirilebilir.

Bileşim Nasıl Okunur?

  • \(a \in A\) için:

\[ h \circ g \circ f (a) = h(g(f(a))) \]

Adım adım:

  • \(f(a) = b\)
  • \(g(b) = c\)
  • \(h(c) = d\)

Sonuç:

\[ h(g(f(a))) = d \]

Yazılımda Bileşim Çok Yaygındır

  • Prosedürler / alt rutinler / servis katmanları doğal olarak bileşim yapar.
  • Commission örneği üzerinden:

\[ f_1(locks, stocks, barrels) = sales \]

\[ f_2(sales) = commission \]

Dolayısıyla:

\[ f_2(f_1(locks, stocks, barrels)) = commission \]

Test Açısından Risk: Zincir Etkisi

  • Fonksiyon zincirleri testte zorlayıcı olabilir:
    • bir fonksiyonun range’i, sonraki fonksiyonun domain’ine tam oturmayabilir
    • bu da “ara katmanlarda” beklenmeyen durumlar doğurur

Özel Durum: Ters Fonksiyon ile Çapraz Kontrol

  • Eğer bir fonksiyon birebir ve örten ise:
    • ters fonksiyonu vardır ve tektir.
  • Ters fonksiyon gösterimi: \(f^{-1}\)

Özellik:

\[ f^{-1}(f(a)) = a \]

ve

\[ f(f^{-1}(b)) = b \]

Testte bu çok işe yarar: ters fonksiyon bir “cross-check” gibi çalışır.

NextDate Örneği (Sezgisel)

  • NextDate ve YesterDate birbirinin tersi gibi düşünülebilir.
  • Bu bakış:
    • fonksiyonel test case üretiminde
    • hızlı doğrulama (cross-check) sağlar.

İlişkiler (Relations)

  • Fonksiyon, bir ilişkinin özel bir türüdür.
  • Hem fonksiyonlar hem ilişkiler, bir Kartezyen çarpımın alt kümesi olarak düşünülebilir:
    • \(f \subseteq A \times B\) (fonksiyon)
    • \(R \subseteq A \times B\) (ilişki)

Temel Fark: “İyi Davranma” Şartı

  • Fonksiyonda (iyi davranan ilişki):
    • aynı girdi en fazla bir çıktıyla eşleşir
  • İlişkide bu zorunlu değildir:
    • bir girdinin birden fazla çıktıyla eşleşmesi mümkündür

“Fonksiyon” dediğimizde aslında deterministik bir eşleme varsayarız.

İlişkiler Her Zaman Fonksiyonel Değildir

  • Birçok gerçek dünya eşlemesi fonksiyon değildir.

Örnek: Hasta–Doktor eşlemesi

  • Bir hasta birden fazla doktor tarafından tedavi edilebilir
  • Bir doktorun birden fazla hastası olabilir

Bu ilişki çoktan çoğa (many-to-many) bir ilişkidir.

Kümeler Arası İlişkiler (Relations among Sets)

  • Verilen iki küme \(A\) ve \(B\) için bir ilişki:

\[ R \subseteq A \times B \]

  • İlişkiyi göstermek için genelde:

\[ aRb \]

yazılır ve “\(a\), \(b\) ile ilişkilidir” anlamına gelir.

Kardinalite: İlişkide “Kaç Eşleşme Var?”

  • Kümede kardinalite \(|A|\) eleman sayısıydı.
  • İlişkide kardinalite, \(R\) içindeki sıralı ikililerin sayısıdır:

\[ |R| \]

Sezgisel hata: “ilişki = küme” diye düşünüp kardinaliteyi yanlış yorumlamak.

İlişki Tipleri (Cardinality Pattern)

Bir ilişki için temel eşleme tipleri:

  • Bire bir (one-to-one)
    (her \(a\) en fazla bir \(b\) ile; her \(b\) en fazla bir \(a\) ile)
  • Çoktan bire (many-to-one)
    (farklı \(a\)’lar aynı \(b\)’ye gidebilir)
  • Bire çok (one-to-many)
    (bir \(a\) birden fazla \(b\) ile ilişkili olabilir)
  • Çoktan çoğa (many-to-many)
    (her iki yönde de çoklu eşleşme olabilir)

Fonksiyonlarla Bağlantı

  • Fonksiyonlar:
    • bire çok olamaz (aynı girdi iki çıktı veremez)
  • İlişkiler:
    • bire çok / çoktan çoğa olabilir
  • Bu yüzden fonksiyonlar, ilişkilerin özel bir alt sınıfıdır.

Katılım (Participation): Total mi, Partial mi?

İlişkinin “kümeleri ne kadar kapsadığı”nı tanımlarız.

Verilen \(R \subseteq A \times B\) için:

A tarafı

  • Total (A-total): \(A\)’nın her elemanı, R’de en az bir ikilide geçer
  • Partial (A-partial): \(A\)’dan bazı elemanlar R’de hiç geçmez

B tarafı

  • Onto (B-total): \(B\)’nin her elemanı, R’de en az bir ikilide geçer
  • Into (B-partial): \(B\)’den bazı elemanlar R’de hiç geçmez

Test Açısından Neden Önemli?

  • “İlişki tipi” ve “katılım” bilgisi:
    • kapsam boşluklarını görmeyi kolaylaştırır
    • test setinin bazı durumları hiç kapsamadığını erken fark ettirir
  • Ayrıca exception/özel durumların önemli bir kısmı, bu ayrımların ihlal edildiği yerlerde çıkar.

Tek Küme Üzerinde İlişkiler

  • İlişki bazen tek bir küme üzerinde tanımlanır:

\[ R \subseteq A \times A \]

  • Bu tür ilişkilerden iki önemli sınıf çıkar:
    • sıralama (ordering) ilişkileri
    • eşdeğerlik (equivalence) ilişkileri

Bir İlişkinin 4 Temel Özelliği

Verilen \(R \subseteq A \times A\) için:

  • Reflexive (yansımalı):
    Her \(a \in A\) için \(aRa\)

  • Symmetric (simetrik):
    \(aRb \Rightarrow bRa\)

  • Antisymmetric (anti-simetrik):
    \(aRb \land bRa \Rightarrow a=b\)

  • Transitive (geçişli):
    \(aRb \land bRc \Rightarrow aRc\)

Sıralama İlişkisi (Ordering Relation)

  • \(R\), bir sıralama ilişkisidir eğer:
    • yansımalı + anti-simetrik + geçişli ise

Örnek sezgi: “≤” gibi bir ilişki (her zaman simetrik değildir).

Eşdeğerlik İlişkisi (Equivalence Relation)

  • \(R\), bir eşdeğerlik ilişkisidir eğer:
    • yansımalı + simetrik + geçişli ise

Örnek sezgi: “eşitlik” veya “aynı sınıfta olma” gibi ilişkiler.

Eşdeğerlik → Bölümleme (Partition)

  • Eşdeğerlik ilişkisi, kümeyi “benzerlik sınıflarına” böler:
    • eşdeğerlik sınıfları (equivalence classes)
  • Bu, pratikte bir bölümleme üretir:
    • her eleman tam olarak bir sınıfa düşer
    • sınıflar birbirini örtmez

Test Açısından Not

  • Bu kavramlar, fonksiyonel testte doğrudan kullanılır:
    • eşdeğer bölütleme fikrinin matematiksel temeli burada
  • “Her sınıftan bir temsilci test et” yaklaşımı, test sayısını azaltırken kapsama güveni sağlar.

Önerme Mantığı (Propositional Logic)

  • Önerme mantığı notasyonu, ilk bakışta “tavuk-yumurta” gibi görünebilir:
    • “Önerme nedir?” sorusu için mantık gerekir,
    • mantığı anlatmak için de önermelerle konuşuruz.

Önerme (Proposition) Nedir?

  • Önerme, doğruluk değeri olan bir ifadedir:
    • ya doğrudur
    • ya yanlıştır
  • Önemli şart: Önerme muğlak olmamalıdır.

Önerme Olmayan İfade Örneği

  • “Matematik zordur” ifadesi genellikle önerme sayılmaz:
    • çünkü yoruma açıktır (muğlak)

Bağlama Bağımlılık Notu

  • Bazı ifadelerde doğruluk değeri bağlama göre değişebilir:
    • zamana göre (şu an yağmur yağıyor mu?)
    • mekâna göre (hangi şehirde?)
    • kişiye göre (kimin için doğru?)
  • Bu yüzden testte de:
    • “doğru/yanlış” dediğimiz şeyin koşullarını netleştirmek gerekir.

Notasyon

  • Önermeleri genelde küçük harflerle gösteririz:
    • \(p\), \(q\), \(r\)
  • Önerme mantığındaki işlemler, yapısal olarak küme işlemleriyle benzerlik taşır .

Mantıksal Operatörler (Logical Operators)

  • Mantıksal operatörler (bağlaçlar), önermelerin doğruluk değerlerini dönüştürür.
  • Doğruluk değerleri:
    • T (true / doğru)
    • F (false / yanlış)

Aritmetik operatörler sayılar üzerinde çalışır; mantıksal operatörler önermeler üzerinde çalışır.

Temel Mantıksal Operatörler

Üç temel operatör:

  • VE (and): \(p \land q\)
  • VEYA (or): \(p \lor q\)
  • DEĞİL (not): \(\lnot p\)

Not: - \(\lnot\) tekli (unary) operatördür. - \(\land\) ve \(\lor\) ikilidir (binary).

Doğruluk Tablosu: AND / OR / NOT

\(p\) \(q\) \(p \land q\) \(p \lor q\) \(\lnot p\)
T T T T F
T F F T F
F T F T T
F F F F T

Sezgisel Okuma

  • \(p \land q\) yalnızca ikisi de doğruysa doğrudur.
  • \(p \lor q\) en az biri doğruysa doğrudur.
  • \(\lnot p\) doğruluğu tersine çevirir.

Diğer İki Yaygın Bağlaç

  • Özel veya (XOR): \(p \oplus q\)
    • sadece “tam olarak biri” doğruysa doğru
  • İse (IF–THEN / implication): \(p \rightarrow q\)
    • “p doğruysa q doğru olmalı”

Doğruluk Tablosu: XOR / IF–THEN

\(p\) \(q\) \(p \oplus q\) \(p \rightarrow q\)
T T F T
T F T F
F T T T
F F F T

Neden IF–THEN Kafa Karıştırır?

  • Günlük dilde “ise” beklentimiz ile mantıktaki tanım tam örtüşmeyebilir.
  • \(p \rightarrow q\) sadece şu durumda yanlıştır:
    • \(p\) doğru, \(q\) yanlış

Testte karşılığı: “önkoşul sağlanıyorsa beklenen davranış gerçekleşmeli”.

Mantıksal İfadeler (Logical Expressions)

  • Mantıksal operatörler, aritmetik operatörler gibi cebirsel ifadeler (logical/algebraic expressions) kurmak için kullanılır.
  • Operatörlerin uygulanma sırası (öncelik / precedence) önemlidir; parantezler bu sırayı açıkça belirler.
  • Genel kural: parantez içi önce değerlendirilir.
  • Yaygın öncelik sırası:
    • Değilleme: \(\lnot\)
    • Ve: \(\land\)
    • Veya: \(\lor\)
    • Koşullu (implikasyon): \(\rightarrow\)
    • Denkli̇k (eşdeğerlik): \(\leftrightarrow\)

Örnek: Parantezlerle İşlem Sırası

Aşağıdaki ifadede işlem sırası parantezlerle belirlenmiştir:

\[ \sim(p \rightarrow q) \ \wedge \ (q \rightarrow \sim p) \]

  • Önce \((p \rightarrow q)\) ve \((q \rightarrow \sim p)\) hesaplanır.
  • Sonra iki sonuç \(\wedge\) ile birleştirilir.
  • İfade içinde geçen değillemeler \(\sim\) ilgili önerme üzerine uygulanır.

Örnek İfade İçin Doğruluk Tablosu

\(p\) \(q\) \(p \rightarrow q\) \(q \rightarrow \sim p\) \((p \rightarrow q)\wedge(q \rightarrow \sim p)\) \(\sim\big((p \rightarrow q)\wedge(q \rightarrow \sim p)\big)\)
T T T F F T
T F F T F T
F T T T T F
F F T T T F

Mantıksal Eşdeğerlik (Logical Equivalence)

  • Aritmetik eşitlik kavramının önermeler mantığındaki karşılığı mantıksal eşdeğerliktir.
  • İki ifade tüm olası doğruluk değerleri atamalarında aynı sonucu veriyorsa eşdeğerdir.
  • Gösterim: \(p \equiv q\) (mantıksal eşdeğerlik)

Tanım: Mantıksal Eşdeğerlik

  • İki önerme \(p\) ve \(q\), doğruluk tabloları özdeş ise eşdeğerdir: \[ p \equiv q \]
  • “Ancak ve ancak” (if and only if) ifadesi çift yönlü koşul (bi-conditional) anlamındadır: \[ p \leftrightarrow q \]
  • \(p \leftrightarrow q\) ifadesi, “\(p \rightarrow q\) ve \(q \rightarrow p\) birlikte doğru” fikrini yakalar: \[ p \leftrightarrow q \ \equiv\ (p \rightarrow q) \wedge (q \rightarrow p) \]

Tanım: Tautoloji ve Çelişki

  • Her durumda doğru olan önerme: tautoloji (tautology)
  • Her durumda yanlış olan önerme: çelişki (contradiction)
  • Gösterim:
    • Tautoloji: \(T\)
    • Çelişki: \(F\)
  • Bir ifadenin tautoloji/çelişki olduğunu göstermek için doğruluk tablosu kullanılabilir.

Temel Eşdeğerlik Yasaları (1)

Yasa (Law) İfade (Expression)
Özdeşlik (Identity) \(p \wedge T \equiv p\)
\(p \vee F \equiv p\)
Baskınlık (Domination) \(p \vee T \equiv T\)
\(p \wedge F \equiv F\)

Temel Eşdeğerlik Yasaları (2)

Yasa (Law) İfade (Expression)
İdempotent \(p \wedge p \equiv p\)
\(p \vee p \equiv p\)
Tümleme (Complementation) \(\sim(\sim p) \equiv p\)
\(p \wedge \sim p \equiv F\)
\(p \vee \sim p \equiv T\)

Temel Eşdeğerlik Yasaları (3)

Yasa (Law) İfade (Expression)
Değişme (Commutative) \(p \wedge q \equiv q \wedge p\)
\(p \vee q \equiv q \vee p\)
Birleşme (Associative) \(p \wedge (q \wedge r) \equiv (p \wedge q)\wedge r\)
\(p \vee (q \vee r) \equiv (p \vee q)\vee r\)

Temel Eşdeğerlik Yasaları (4)

Yasa (Law) İfade (Expression)
Dağılma (Distributive) \(p \wedge (q \vee r) \equiv (p \wedge q)\vee(p \wedge r)\)
\(p \vee (q \wedge r) \equiv (p \vee q)\wedge(p \vee r)\)
De Morgan Yasaları \(\sim(p \wedge q) \equiv \sim p \vee \sim q\)
\(\sim(p \vee q) \equiv \sim p \wedge \sim q\)

Olasılık Kuramı (Probability Theory)

  • Yazılım testinde olasılık kuramını iki bağlamda kullanacağız:
    • Belirli bir ifade/yolun çalıştırılma olasılığı
    • Endüstride sık kullanılan operasyonel profil (operational profile) kavramına geçiş
  • Şuan için sadece temel kavramlar ele alınacaktır.

Olay Olasılığı: Klasik Tanım (Laplace)

Sonlu ve eş olasılıklı örnek uzay \(S\) için, \(E \subseteq S\) bir olay olsun:

\[ p(E)=\frac{|E|}{|S|} \]

  • \(S\): örnek uzay (tüm olası sonuçlar)
  • \(E\): olay (sonuçların bir alt kümesi)
  • \(|.|\): eleman sayısı (kardinalite)

Not: “Eş Olasılıklı” Varsayımı

  • Tanım, “eş olasılıklı sonuçlar” fikrine dayanır.
  • Pratikte zor taraf: hangi sonuçların “eş olasılıklı” kabul edileceği, modele/evrene bağlıdır.
  • Bu nedenle, doğru evreni/örnek uzayı seçmek kritik bir tasarım kararıdır.

Test Perspektifi: Evren ve Önerme

  • Test bağlamında gerçekleşen şeyleri olay (event) olarak düşüneceğiz.
  • Tüm olayların oluşturduğu kümeye evren (universe of discourse) diyeceğiz: \(U\)
  • Evrenin elemanları hakkında önermeler kurarız: \(p\)

Tanım: Doğruluk Kümesi (Truth Set)

Bir önerme \(p\) için doğruluk kümesi \(T(p)\):

\[ T(p)=\{x \in U \mid p(x)\ \text{doğru}\} \]

  • Önerme \(p\), evreni iki kümeye böler:
    • \(T(p)\) (p doğru olanlar)
    • \((T(p))'\) (p yanlış olanlar)

Doğruluk Kümesinin Tamamlayanı

  • Evren ayrışımı:

\[ T(p)\ \cup\ (T(p))' \ =\ U \]

  • Ayrıca:

\[ (T(p))' \ =\ T(\sim p) \]

Tanım: Bir Önermenin Olasılığı

Önerme \(p\)’nin doğru olma olasılığı:

\[ \Pr(p)=\frac{|T(p)|}{|U|} \]

  • Laplace’ın “uygun durum sayısı / tüm durum sayısı” fikri:
    • uygun durum sayısı: \(|T(p)|\)
    • tüm durum sayısı: \(|U|\)

Olasılıkta Pivot: Test Senaryosu Üzerinden

Senaryo:

  • Bir API’de discount hesaplayan bir fonksiyon var.
  • İki girdi değişkeni kullanacağız (basitleştirilmiş):
    • UserType ∈ {Student, Regular}
    • CartTotalBand ∈ {Low, High}

Bu durumda tüm olası giriş kombinasyonları (evren):

\[ U = \{(Student,Low),(Student,High),(Regular,Low),(Regular,High)\} \]

Adım 1 — Evreni (Universe) Tanımla: \(U\)

  • \(U\): “tüm olası test girdileri / senaryolar”
  • Burada \(|U|=4\) (4 kombinasyon var)

Adım 2 — İlgilendiğin Olayı Önerme ile Tanımla: \(p(x)\)

  • İlgilendiğimiz olay: “İndirim uygulanan kod yolu çalışsın”
  • Önerme:

\[ p(x): \text{ “senaryo } x \text{ indirim yolunu çalıştırır”} \]

(Bu, testte “hangi path çalıştı?” sorusu.)

Adım 3 — Doğruluk Kümesi (Truth Set) Kur: \(T(p)\)

Kural (örnek):

  • Sadece Student ise indirim uygulanıyor.

O zaman \(p(x)\) şu senaryolarda doğrudur:

\[ T(p)=\{(Student,Low),(Student,High)\} \]

  • Burada \(|T(p)|=2\)

Adım 4 — Olasılığı Oran Olarak Yaz

“İndirim yolunun çalıştırılma olasılığı”:

\[ \Pr(p)=\frac{|T(p)|}{|U|}=\frac{2}{4}=\frac{1}{2} \]

Yani seçtiğin rastgele bir test senaryosunda indirim yoluna girme olasılığı %50.

Ne Kazandık

  • “Olay”ı doğrudan saymaya çalışmak yerine:
    1. Tüm senaryoları \(U\) olarak kurduk,
    2. “Hangi senaryolar bu yolu çalıştırır?”ı \(T(p)\) ile yakaladık,
    3. Olasılığı basit bir oran olarak hesapladık.

Aynı yöntemle: “hata mesajı yolu”, “validasyon yolu”, “exception yolu” gibi her path için \(\Pr(\cdot)\) tanımlanabilir.

Tautoloji ve Çelişki ile Bağlantı

  • Tautoloji için doğruluk kümesi evrenin tamamıdır:

\[ T(T)=U \Rightarrow \Pr(T)=1 \]

  • Çelişki için doğruluk kümesi boştur:

\[ T(F)=\varnothing \Rightarrow \Pr(F)=0 \]

Örnek: 30 Gün Çeken Aylar

Evren (aylar):

\[ U=\{Jan., Feb., \ldots, Dec.\} \]

Önerme:

\[ p(m):\ m\ \text{30 gün çeken bir aydır} \]

Doğruluk kümesi:

\[ T(p(m))=\{Apr., June, Sept., Nov.\} \]

Örnek Sonuç: Olasılık Hesabı

\[ \Pr(p(m))=\frac{|T(p(m))|}{|U|}=\frac{4}{12} \]

  • Burada \(|U|=12\), \(|T(p(m))|=4\)

İncelik: Doğru Evreni Seçmek (Shifting Universes)

  • “Şubat ayı gelme olasılığı” için \(U\) aylar seçilirse sonuç: \(1/12\)
  • “Tam 29 gün çeken ay gelme olasılığı” için sadece aylar evreni yetersiz kalır:
    • artık yıl bilgisi (artık yıl / normal yıl) evrene dahil edilmelidir
  • Sonuç: Evren seçimi hesaplanan olasılığı doğrudan değiştirir; evreni kaydırmaktan (shifting universes) kaçınılmalıdır.

Kullanacağımız Temel Olasılık Gerçekleri (1)

Verilen bir evrende, önermeler \(p\) ve \(q\) için:

\[ \Pr(\sim p)=1-\Pr(p) \]

Kullanacağımız Temel Olasılık Gerçekleri (2)

\[ \Pr(p \wedge q)=\Pr(p)\times \Pr(q) \]

\[ \Pr(p \vee q)=\Pr(p)+\Pr(q)-\Pr(p \wedge q) \]

  • Bu ilişkiler, küme kuramı ve önermeler mantığındaki özdeşliklerle birlikte, olasılık ifadelerini cebirsel olarak dönüştürmeyi kolaylaştırır.