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)
Ö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:
- Elemanları listeleyerek
- Bir kural vererek (karar kuralı)
- 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?
- 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.
- 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
- Boş küme tektir (iki farklı boş küme olamaz).
- \(\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 = 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:
Kapsama (completeness): \[
A_1 \cup A_2 \cup \cdots \cup A_n = A
\]
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:
- Üçgen / Üçgen değil
- Eşkenar / İkizkenar / Çeşitkenar / Üçgen değil
- Eşkenar / İkizkenar / Çeşitkenar / Dik / Üçgen değil
Bölümlemeler “çakışmamalı”
- 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)
| 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)
| 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:
Fonksiyon Gösterimi (2 yaygın notasyon)
- “A’dan B’ye fonksiyon”
\[
f: A \rightarrow B
\]
- “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?
\[
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:
- Ö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:
- Ö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
| 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
| 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
| 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)
| Ö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)
| İ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)
| 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)
| 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ı
\[
T(p)\ \cup\ (T(p))' \ =\ U
\]
\[
(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)\}
\]
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:
- Tüm senaryoları \(U\) olarak kurduk,
- “Hangi senaryolar bu yolu çalıştırır?”ı \(T(p)\) ile yakaladık,
- 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.