Yazılım Test Süreçleri

Test Örnekleri

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

2026

Öğrenim Çıktıları

Bu bölümün sonunda öğrenci:

  • Birim test ve üst seviye test (entegrasyon/sistem) örneklerini ayırt eder; hangi örneğin hangi test seviyesine hizmet ettiğini açıklar.

  • Verilen sözde kod üzerinden temel kontrol yapılarıyla (sequence/selection/loop/case) program akışını okuyup karar noktalarını belirler.

  • Triangle / NextDate / Commission örneklerinde girdi uzayı, sınır değerler ve geçersiz kombinasyonlar kavramlarını kullanarak test gereksinimlerini çıkarır.

  • “Basit” ve “geliştirilmiş” sürümler arasındaki farkları input doğrulama + hata davranışı + test edilebilirlik açısından analiz eder.

  • SATM, GUI döviz çevirici, silecek kontrolörü ve garaj kapısı gibi örnekleri durum/olay tabanlı davranış perspektifinden yorumlayarak, uygun modelleme yaklaşımını (FSM/Statechart/UML/decision table) seçer.

Ortak Senaryo Setleri

Ders boyunca farklı test yöntemlerini somutlaştırmak için tekrar tekrar kullanılacak örnekler seçilmiştir.

İki ana kategoriye ayrılır:

  • Birim test (unit) düzeyi → 3 Örnek
  • Daha üst test seviyeleri → 5 Örnek

Birim Test (Unit) Düzeyi Örnekler

  • Üçgen problemi
  • NextDate
  • Commission problem

Daha Üst Test Seviyeleri Örnekler

  • Basitleştirilmiş ATM sistemi (SATM)
  • Döviz çevirici
  • GUI tabanlı olay güdümlü bir uygulama
  • Saturn araç silecek kontrol sistemi
  • Garaj kapısı kontrolörü

Genelleştirilmiş Sözde Kod (Pseudocode)

  • Sözde kod, programı dilden bağımsız ifade etme yoludur.
  • Amaç: Gereksiz ayrıntıyı gizleyip, test için önemli olan yapıyı görünür kılmak.
  • Bu sözde kod yaklaşımı iki seviyeyi kapsar:
    • Birim (procedure/function ya da sınıf/metot)
    • Program bileşenleri
  • Köşeli parantez içindeki ifadeler (<...>) ilgili yerde kullanılabilecek yer tutucuları gösterir.
  • Gerektiğinde karmaşık koşullar yerine daha anlaşılır doğal dil ifadelerine izin verilir.

Genelleştirilmiş Sözde Kod Yapıları

Dil Elemanı Genelleştirilmiş Sözde Kod Yapısı
Comment <text>
Data structure declaration Type <type name>
<list of field descriptions>
End <type name>
Data declaration Dim <variable> As <type>
Assignment statement <variable> = <expression>
Input Input (<variable list>)
Output Output (<variable list>)
Condition <expression> <relational operator> <expression>
Compound condition <Condition> <logical connective>
<Condition>
Sequence statements in sequential order
Simple selection If <condition> Then
<then clause>
EndIf
Selection If <condition>
Then <then clause>
Else <else clause>
EndIf
Multiple selection Case <variable> Of
Case 1: <predicate>
<Case clause>
...
Case n: <predicate>
<Case clause>
EndCase
Counter-controlled repetition For <counter> = <start> To <end>
<loop body>
EndFor
Pretest repetition While <condition>
<loop body>
EndWhile
Posttest repetition Do
<loop body>
Until <condition>
Procedure definition <procedure name> (Input: <list of variables>;
Output: <list of variables>)
<body>
End <procedure name>
Interunit communication Call <procedure name> (<list of variables>; <list of variables>)
Class/Object definition <name> (<attribute list>; <method list>, <body>)
End <name>
Interunit communication msg <destination object name>.<method name> (<list of variables>)
Object creation Instantiate <class name>.<object name> (list of attribute values)
Object destruction Delete <class name>.<object name>
Program Program <program name>
<unit list>
End <program name>

Üçgen Problemi (Triangle Problem)

  • Üçgen problemi, yazılım testi literatüründe en yaygın kullanılan örneklerden biridir.
  • Bu ders kapsamında üçgen problemi:
    • test tekniklerini aynı problem üzerinde karşılaştırmak,
    • “girdi uzayı” ve “sınır durum” düşüncesini göstermek için kullanılacaktır.

Problem Tanımı (Basit Sürüm)

  • Program üç tamsayı alır: a, b, c
  • Bu değerler bir üçgenin kenar uzunlukları olarak yorumlanır
  • Çıktı, üçgenin türüdür:
    • Equilateral (Eşkenar)
    • Isosceles (İkizkenar)
    • Scalene (Çeşitkenar)
    • NotATriangle (Üçgen değil)
  • Bazı varyantlarda Right triangle (dik üçgen) ayrı bir tür olarak eklenebilir

Problem Tanımı (Geliştirilmiş Sürüm)

Program üç tamsayı alır: a, b, c. Şu koşullar sağlanmalıdır:

Aralık koşulları

  • c1. 1 ≤ a ≤ 200
  • c2. 1 ≤ b ≤ 200
  • c3. 1 ≤ c ≤ 200

Üçgen eşitsizliği koşulları

  • c4. a < b + c
  • c5. b < a + c
  • c6. c < a + b

Çıktı Kuralları

  • Eğer giriş değerleri c1, c2 veya c3 koşullarından birini sağlamazsa:
    • Program bir hata mesajı üretir (örn. “Değer izin verilen aralıkta değil.”)
  • Eğer c4, c5, c6 sağlanıyorsa, çıktı şu dört durumdan biri olur:
  1. a = b = c ise → Equilateral
  2. Tam olarak bir çift eşitse (örn. a=b≠c) → Isosceles
  3. Hiçbir çift eşit değilse → Scalene
  4. c4, c5, c6 koşullarından biri sağlanmazsa → NotATriangle

Tartışma

  • Bu örneğin yıllardır kullanılmasının bir nedeni mantığının net, ama aynı zamanda karmaşık olmasıdır.
  • Ayrıca, gerçek hayatta sık görülen bir probleme işaret eder:
    • eksik/yarım tanımlar, müşteri–geliştirici–testçi arasında iletişimi bozar.
  • Örnek bir “varsayım”:
    • Üçgen eşitsizliğini geliştiricinin zaten bildiği kabul edilir
      (iki kenarın toplamı, üçüncü kenardan büyük olmalı)
  • Üst sınır olan 200 değeri ise hem keyfi hemde kullanışlı bir aralık sunar.

Geleneksel Uygulama

  • Bu klasik örneğin “geleneksel” uygulaması FORTRAN benzeri bir stile sahiptir.
  • Akış diyagramları:
    • Geleneksel uygulama
    • Geliştirilmiş uygulama (2 versiyon)

Akış Diyagramı: Geleneksel Uygulama

Match Değişkeni: Ne İşe Yarar?

  • match değişkeni, kenarlar arasındaki eşitlik durumunu kaydetmek için kullanılır.
  • FORTRAN tarzındaki klasik ayrıntı:
    • Üçgen eşitsizliği kontrollerinin hepsi her zaman yapılmaz.
    • Örn. iki kenar eşitse (a=c gibi) sadece gerekli karşılaştırmalar seçilir.

Bu yaklaşım bazı karşılaştırmaları azaltır ama okunabilirliği düşürür.

Verimlilik mi Netlik mi?

  • Bu sürümde verimlilik, anlaşılırlık (ve test edilebilirlik) pahasına elde edilir.
  • Bu örnek ileride şu konuyu tartışmak için özellikle faydalıdır:
    • Çalıştırılamayan program yürütme yolları (infeasible paths)

Yol Çeşitliliği (Path Variety)

  • Bu akışta bazı çıktılara birden fazla yoldan gidilir:
    • NotATriangle kutusuna ulaşmak için birden çok yol vardır.
    • Isosceles kutusuna ulaşmak için de birden çok yol vardır.
  • Bu durum, test tasarımında “hangi yolları hedefliyoruz?” sorusunu doğurur.

Sözde Kod (Geleneksel)

Program triangle1

Dim a, b, c, match As INTEGER

Output("Enter 3 integers which are sides of a triangle")
Input(a, b, c)

Output("Side A is", a)
Output("Side B is", b)
Output("Side C is", c)

match = 0

If a = b            '(1)
  Then match = match + 1  '(2)
EndIf

If a = c            '(3)
  Then match = match + 2  '(4)
EndIf

If b = c            '(5)
  Then match = match + 3  '(6)
EndIf

If match = 0        '(7)
  Then
    If (a + b) <= c       '(8)
      Then Output("NotATriangle")  '(12.1)
    ElseIf (b + c) <= a    '(9)
      Then Output("NotATriangle")  '(12.2)
    ElseIf (a + c) <= b    '(10)
      Then Output("NotATriangle")  '(12.3)
    Else
      Output("Scalene")            '(11)
    EndIf

ElseIf match = 1    '(13)
  Then
    If (a + c) <= b        '(14)
      Then Output("NotATriangle")  '(12.4)
    Else
      Output("Isosceles")          '(15.1)
    EndIf

ElseIf match = 2    '(16)
  Then
    If (a + c) <= b
      Then Output("NotATriangle")  '(12.5)
    Else
      Output("Isosceles")          '(15.2)
    EndIf

ElseIf match = 3    '(18)
  Then
    If (b + c) <= a        '(19)
      Then Output("NotATriangle")  '(12.6)
    Else
      Output("Isosceles")          '(15.3)
    EndIf

Else
  Output("Equilateral")           '(20)
EndIf

End Triangle1

Akış Diyagramı: Geliştirilmiş Uygulama

Yapılandırılmış Uygulamalar (Structured Implementations)

  • Aynı problem, daha okunabilir şekilde yapılandırılmış programlama ile de yazılabilir.
  • Amaç:
    • koşulları daha net görmek
    • test case üretimini kolaylaştırmak
  • Bu bölümde iki sürüm var:
    • triangle2: daha basit spesifikasyonun yapılandırılmış hali
    • triangle3: aralık kontrollerini de içeren daha kapsamlı sürüm

triangle2: Yapılandırılmış sürümün fikri

  • 3 adım:
    1. Girdiyi al
    2. Üçgen mi kontrol et (IsATriangle)
    3. Üçgense türünü belirle

Bu yapı, “önce geçerlilik, sonra sınıflandırma” ayrımını netleştirir.

Sözde Kod (triangle2)

Program triangle2

Dim a,b,c As Integer
Dim IsATriangle As Boolean

'Step 1: Get Input
Output("Enter 3 integers which are sides of a triangle")
Input(a,b,c)
Output("Side A is",a)
Output("Side B is",b)
Output("Side C is",c)

'Step 2: Is A Triangle?
If (a < b + c) AND (b < a + c) AND (c < a + b)
  Then IsATriangle = True
  Else IsATriangle = False
EndIf

'Step 3: Determine Triangle Type
If IsATriangle
  Then If (a = b) AND (b = c)
         Then Output ("Equilateral")
       Else If (a # b) AND (a # c) AND (b # c)
              Then Output ("Scalene")
              Else Output ("Isosceles")
            EndIf
       EndIf
Else Output("Not a Triangle")
EndIf

End triangle2

triangle3: Aralık kontrolleri eklenmiş sürüm

  • triangle3, ayrıca şu kontrolleri de içerir:

    • 1 ≤ a ≤ 300
    • 1 ≤ b ≤ 300
    • 1 ≤ c ≤ 300
  • Geçersiz girişlerde mesaj üretir ve geçerli giriş gelene kadar tekrar ister.

Sözde Kod (triangle3)

Program triangle3
Dim a, b, c As Integer
Dim c1, c2, c3, IsATriangle As Boolean

'Step 1: Get Input
Do
  Output("Enter 3 integers which are sides of a triangle")
  Input(a, b, c)
  c1 = (1 <= a) AND (a <= 300)
  c2 = (1 <= b) AND (b <= 300)
  c3 = (1 <= c) AND (c <= 300)
  If NOT(c1)
    Then Output("Value of a is not in the range of permitted values")
  EndIf
  If NOT(c2)
    Then Output("Value of b is not in the range of permitted values")
  EndIf
  If NOT(c3)
    ThenOutput("Value of c is not in the range of permitted values")
  EndIf
Until c1 AND c2 AND c3

Output("Side A is",a)
Output("Side B is",b)
Output("Side C is",c)

'Step 2: Is A Triangle?
If (a < b + c) AND (b < a + c) AND (c < a + b)
  Then IsATriangle = True
  Else IsATriangle = False
EndIf

'Step 3: Determine Triangle Type
If IsATriangle
  Then If (a = b) AND (b = c)
         Then Output ("Equilateral")
       Else If (a # b) AND (a # c) AND (b # c)
              Then Output ("Scalene")
              Else Output ("Isosceles")
            EndIf
       EndIf
Else Output("Not a Triangle")
EndIf

End triangle3

Bu sürümler test açısından ne sağlar?

  • Mantık daha açık olduğunda:
    • karar noktaları daha net görülür
    • test case’leri hangi koşulların tetikleyeceği daha kolay planlanır
  • Sonraki adımlarda bu örnekleri:
    • white-box (kod-temelli) test mantığıyla
    • coverage hedefleriyle birlikte kullanacağız.

NextDate Fonksiyonu

  • Üçgen problemindeki karmaşıklık, daha çok girdiler ile doğru çıktı arasındaki ilişkinden geliyordu.
  • NextDate örneğinde ise farklı bir karmaşıklık var:
    • girdi değişkenleri arasındaki mantıksal ilişkiler (ay–gün–yıl uyumu)

Problem Tanımı

  • NextDate, üç değişkenli bir fonksiyondur:
    • month (ay), day (gün), year (yıl)
  • Çıktı: Girilen tarihten bir sonraki günün tarihi

Girdi Koşulları

Girdiler tamsayıdır ve şu aralıklarda olmalıdır:

  • c1. 1 ≤ month ≤ 12
  • c2. 1 ≤ day ≤ 31
  • c3. 1812 ≤ year ≤ 2012

Geçersiz Değerler ve Geçersiz Kombinasyonlar

  • Üçgen örneğinde olduğu gibi, tanımı daha net yapmak için:
    • aralık dışı değerler için çıktı tanımlanır (örn. “month 1..12 aralığında değil”)
    • geçersiz tarih kombinasyonları için çıktı tanımlanır
      (örn. “Haziran 31” gibi)

Hata Mesajları Mantığı

  • c1/c2/c3 koşullarından biri sağlanmazsa:
    • ilgili değişken için “aralık dışı” mesajı üretir
      (örn. “month 1..12 aralığında değil”)
  • Gün–ay–yıl kombinasyonu geçersizse:
    • tek bir genel mesaj üretir: “Invalid Input Date”

Tartışma: NextDate Neden Zor?

NextDate’te iki ana karmaşıklık kaynağı vardır:

  • Girdi uzayı karmaşıklığı
    • Ay, gün ve yıl aralıkları
    • Geçersiz gün–ay kombinasyonları (örn. Haziran 31)
  • Artık yıl (leap year) kuralı
    • “Şubat 29” gibi özel durumları doğru yönetmek gerekir

Artık Yıl Neden Var?

  • Bir yıl tam olarak 365 gün değildir (yaklaşık 365.2422 gün).
  • “Ek gün” problemini çözmek için artık yıllar kullanılır.
  • Her 4 yılda bir artık yıl yapsaydık küçük bir hata birikirdi.
  • Bu yüzden Gregoryen takvim, yüzyıl yıllarında ek bir düzeltme yapar.

Artık Yıl Kuralı (Gregoryen)

Bir yıl artık yıldır:

  • 4’e bölünüyorsa → artık yıl
  • Ama yıl bir yüzyıl yılıysa (100’e bölünüyorsa) → artık yıl değil
  • Ancak 400’e de bölünüyorsa → yine artık yıl

Örnekler: - 1992, 1996, 2000 → artık yıl - 1900 → artık yıl değildir

Test Açısından Ek Gözlem: “80/20” Etkisi

  • Yazılımda sıkça “80/20” durumları görülür:
    • Aktivitenin büyük kısmı, alanın küçük bir kısmında yoğunlaşır (Zipf’s law)
  • NextDate’te bu genelde şurada görünür:
    • Kodun büyük kısmı artık yıl ve girdi doğrulama gibi özel durumlara gider

Sonuç: Test tasarımında “az ama kritik” alanları kaçırmamak gerekir.

NextDate2: Geliştirilmiş Uygulama (Improved Version)

  • Bu sürüm, NextDate problemini daha “tam” ele alır:
    • önce girdi doğrulama yapar
    • sonra ay türüne göre (31/30/Şubat/Aralık) case ile ilerler
  • Amaç: Test üretirken karar noktalarını açık görmek

Adım 1: Girdi Doğrulama

  • Kullanıcıdan month, day, year alınır
  • Aralık kontrolleri yapılır:
    • 1 ≤ day ≤ 31
    • 1 ≤ month ≤ 12
    • 1812 ≤ year ≤ 2012
  • Hatalı olan alan için mesaj verilir
  • Tüm koşullar sağlanana kadar tekrar edilir
Do
  Input(month, day, year)
  c1 = (1 ≤ day) AND (day ≤ 31)
  c2 = (1 ≤ month) AND (month ≤ 12)
  c3 = (1812 ≤ year) AND (year ≤ 2012)

  If NOT(c1) Then Output("Value of day not in the range 1..31")
  If NOT(c2) Then Output("Value of month not in the range 1..12")
  If NOT(c3) Then Output("Value of year not in the range 1812..2012")
Until c1 AND c2 AND c3

Adım 2: Ay Bazlı Mantık (Case month Of)

  • Ayın tipine göre farklı kurallar uygulanır:

    • 31 çeken aylar (Aralık hariç bazıları)
    • 30 çeken aylar
    • Aralık (yıl geçişi)
    • Şubat (artık yıl dahil)

Bu yapı test açısından şunu sağlar: “Hangi ay tipinde hangi kural var?” netleşir.

31 Çeken Aylar

  • day < 31 ise → day + 1
  • day = 31 ise → day = 1, month = month + 1
Case 1: month is 1,3,5,7,8,10
  If day < 31 Then
    tomorrowDay = day + 1
  Else
    tomorrowDay = 1
    tomorrowMonth = month + 1
  EndIf

30 Çeken Aylar

  • day < 30 ise → day + 1
  • day = 30 ise → day = 1, month = month + 1
  • day > 30 ise → Invalid Input Date
Case 2: month is 4,6,9,11
  If day < 30 Then
    tomorrowDay = day + 1
  Else
    If day = 30 Then
      tomorrowDay = 1
      tomorrowMonth = month + 1
    Else
      Output("Invalid Input Date")
    EndIf
  EndIf

Aralık (December) ve Yıl Geçişi

  • day < 31 ise → day + 1
  • day = 31 ise → day = 1, month = 1, year = year + 1
  • En üst yıl sınırı (2012) için ayrıca geçersizlik üretilebilir

Şubat (February) ve Artık Yıl

  • Şubat günleri:

    • normal yıl: 28
    • artık yıl: 29
  • day = 28 veya day = 29 durumlarında “yarın” hesabı artık yıl kuralına bağlıdır

  • day > 29 ise → Invalid Input Date

Case 4: month is 2
  ...
  If (year is a leap year) Then
    ...
  Else
    ...
  EndIf

Örnek Test Senaryoları

  • Normal durumlar:
    • 15 Mart 2023 → 16 Mart 2023
    • 30 Nisan 2023 → 1 Mayıs 2023
  • Artık yıl durumları:
    • 28 Şubat 2024 → 29 Şubat 2024
    • 29 Şubat 2024 → 1 Mart 2024
  • Sınır durumları:
    • 31 Aralık 2023 → 1 Ocak 2024
    • 1 Ocak 2000 → 2 Ocak 2000
  • Geçersiz durumlar:
    • 31 Nisan 2023 → Invalid Input Date
    • 29 Şubat 2023 → Invalid Input Date

Sözde Kod (Simple Version)

Program NextDate1 'Simple version
Dim tomorrowDay,tomorrowMonth,tomorrowYear As Integer
Dim day,month,year As Integer
Output ("Enter today's date in the form MM DD YYYY")
Input (month, day, year)

Case month Of

Case 1: month Is 1,3,5,7,8, Or 10: '31 day months (except Dec.)
  If day < 31
    Then tomorrowDay = day + 1
  Else
    tomorrowDay = 1
    tomorrowMonth = month + 1
  EndIf

Case 2: month Is 4,6,9, Or 11 '30 day months
  If day < 30
    Then tomorrowDay = day + 1
  Else
    tomorrowDay = 1
    tomorrowMonth = month + 1
  EndIf

Case 3: month Is 12: 'December
  If day < 31
    Then tomorrowDay = day + 1
  Else
    tomorrowDay = 1
    tomorrowMonth = 1
    If year = 2012
      Then Output ("2012 is over")
    Else tomorrow.year = year + 1
    EndIf
  EndIf

Case 4: month is 2: 'February
  If day < 28
    Then tomorrowDay = day + 1
  Else
    If day = 28
      Then If ((year is a leap year)
             Then tomorrowDay = 29   'leap year
           Else 'not a leap year
             tomorrowDay = 1
             tomorrowMonth = 3
           EndIf

    Else If day = 29
      Then If ((year is a leap year)
             Then tomorrowDay = 1
                  tomorrowMonth = 3
           Else 'not a leap year
             Output("Cannot have Feb.", day)
           EndIf
    EndIf
  EndIf

EndIf
EndIf
EndCase

Output ("Tomorrow's date is", tomorrowMonth, tomorrowDay, tomorrowYear)
End NextDate

Sözde Kod (Improved Version)

Program NextDate2  'Improved version

Dim tomorrowDay,tomorrowMonth,tomorrowYear As Integer
Dim day,month,year As Integer
Dim c1, c2, c3 As Boolean

Do
  Output ("Enter today's date in the form MM DD YYYY")
  Input (month, day, year)

  c1 = (1 <= day) AND (day <= 31)
  c2 = (1 <= month) AND (month <= 12)
  c3 = (1812 <= year) AND (year <= 2012)

  If NOT(c1)
    Then Output("Value of day not in the range 1..31")
  EndIf
  If NOT(c2)
    Then Output("Value of month not in the range 1..12")
  EndIf
  If NOT(c3)
    Then Output("Value of year not in the range 1812..2012")
  EndIf

Until c1 AND c2 AND c2

Case month Of

Case 1: month Is 1,3,5,7,8, Or 10: '31 day months (except Dec.)
  If day < 31
    Then tomorrowDay = day + 1
  Else
    tomorrowDay = 1
    tomorrowMonth = month + 1
  EndIf

Case 2: month Is 4,6,9, Or 11 '30 day months
  If day < 30
    Then tomorrowDay = day + 1
  Else
    If day = 30
      Then tomorrowDay = 1
           tomorrowMonth = month + 1
      Else Output("Invalid Input Date")
    EndIf
  EndIf

Case 3: month Is 12: 'December
  If day < 31
    Then tomorrowDay = day + 1
  Else
    tomorrowDay = 1
    tomorrowMonth = 1
    If year = 2012
      Then Output ("Invalid Input Date")
      Else tomorrow.year = year + 1
    EndIf
  EndIf

Case 4: month is 2: 'February
  If day < 28
    Then tomorrowDay = day + 1
  Else
    If day = 28
      Then
        If (year is a leap year)
          Then tomorrowDay = 29  'leap day
        Else 'not a leap year
          tomorrowDay = 1
          tomorrowMonth = 3
        EndIf
    Else
      If day = 29
        Then
          If (year is a leap year)
            Then tomorrowDay = 1
                 tomorrowMonth = 3
          Else
            If day > 29
              Then Output("Invalid Input Date")
            EndIf
          EndIf
      EndIf
    EndIf
  EndIf

EndCase

Output ("Tomorrow's date is", tomorrowMonth, tomorrowDay, tomorrowYear)

End NextDate2

Test Açısından Mesaj

  • Bu örnekte kodun büyük kısmı iki yere gider:

    • girdi doğrulama
    • artık yıl / Şubat özel durumu
  • Yani test setinde de bu bölgeler özellikle hedeflenmelidir.

Mini Soru

Bu kod yapısına göre test tasarlarken:

  • Hangi testler “aralık doğrulama”yı hedefler?
  • Hangi testler “ay tipi” dallarını hedefler?
  • Hangi testler “artık yıl” ayrımını hedefler?

Commission Problemi

  • Üçüncü örnek, ticari uygulamalara daha yakındır.
  • Hem hesaplama hem karar verme içerir → test açısından ilginçtir.

Problem Tanımı

Bir satış temsilcisi ay boyunca üç ürün kalemi satar:

  • Kilit (lock): $45
  • Dipçik (stock): $30
  • Namlu (barrel): $25

Aylık satışın kısıtları:

  • Ay içinde en fazla: 70 kilit, 80 dipçik, 90 namlu
  • Temsilci her ziyaret (şehir) sonrası adetleri bildirir
  • Ay sonunda satışın bittiğini göstermek için -1 kilit bilgisi gönderilir (bitirme işareti)

Komisyon Hesabı (Katmanlı)

Aylık toplam satış tutarı üzerinden:

  • %10: $1000’a kadar (dahil)
  • %15: sonraki $800 (yani $1000–$1800 arası)
  • %20: $1800 üzerindeki kısım

Tartışma

  • Örnek, hesaplamaları hızlı görünür yapmak için kurgulanmıştır.
  • Problem üç parçaya ayrılabilir:
    1. Girdi/veri toplama (ziyaret bazlı adetler + bitirme işareti)
    2. Satış tutarı hesabı
    3. Komisyon hesabı
  • Bu örnekte:
    • Girdi doğrulama kısmı (önceki örneklerdeki gibi) detaylandırılmayabilir
    • MIS (Management Information Systems) tarzı uygulamalarda görülen sentinel-controlled while (bitirme işaretiyle döngü) yaklaşımı vurgulanır

Uygulama: Commission Programı (Genel Akış)

Bu uygulamada üç ana parça var:

  1. Veri toplama (sentinel ile biten döngü)
  2. Satış tutarı hesabı
  3. Komisyon hesabı (katmanlı oran)

Değişkenler ve Sabitler

  • Ürün adetleri:
    • locks, stocks, barrels
  • Birim fiyatlar:
    • lockPrice = 45, stockPrice = 30, barrelPrice = 25
  • Toplam adetler:
    • totalLocks, totalStocks, totalBarrels
  • Satış tutarları:
    • lockSales, stockSales, barrelSales, sales
  • Komisyon:
    • commission

Sentinel-Controlled Döngü (Bitirme İşareti)

  • locks = -1 değeri, “veri girişi bitti” anlamına gelir.
  • Bu değer gelene kadar döngü sürer ve toplamlar birikir.
Input(locks)
While NOT(locks = -1)
  Input(stocks, barrels)
  totalLocks   = totalLocks   + locks
  totalStocks  = totalStocks  + stocks
  totalBarrels = totalBarrels + barrels
  Input(locks)
EndWhile

Satış Tutarı Hesabı

  • Ürün bazında satış:

    • lockSales = lockPrice * totalLocks
    • stockSales = stockPrice * totalStocks
    • barrelSales = barrelPrice * totalBarrels
  • Toplam satış:

    • sales = lockSales + stockSales + barrelSales
lockSales   = lockPrice   * totalLocks
stockSales  = stockPrice  * totalStocks
barrelSales = barrelPrice * totalBarrels
sales = lockSales + stockSales + barrelSales

Komisyon Hesabı (Katmanlı)

  • Eğer sales > 1800:
    • %10 * 1000
    • %15 * 800
    • %20 * (sales - 1800)
  • Eğer sales > 1000:
    • %10 * 1000
    • %15 * (sales - 1000)
  • Aksi halde:
    • %10 * sales
If (sales > 1800)
  commission = 0.10 * 1000
  commission = commission + 0.15 * 800
  commission = commission + 0.20 * (sales - 1800)
Else If (sales > 1000)
  commission = 0.10 * 1000
  commission = commission + 0.15 * (sales - 1000)
Else
  commission = 0.10 * sales
EndIf

Test Açısından Kritik Noktalar

  • Döngü: sentinel değerinin doğru ele alınması (-1)
  • Toplamlar: birikimli toplama hataları
  • Eşikler: 1000 ve 1800 sınırları (özellikle eşitlik durumları)
  • Katmanlı oranlar: her dalın doğru çalıştığının kanıtı

Mini Soru

Komisyon hesabı için şu satış değerleri hangi dala düşer?

  • sales = 1000
  • sales = 1000.01
  • sales = 1800
  • sales = 1800.01

SATM Sistemi

  • Entegrasyon ve sistem testi konularını daha iyi tartışmak için daha geniş kapsamlı bir örneğe ihtiyaç var.
  • Bu örnek: basitleştirilmiş bir ATM sistemi (SATM).
  • Sistem “minimal” olsa da şunları iyi temsil eder:
    • farklı işlevler
    • ekran/akış temelli etkileşim
    • istemci–sunucu sistemlerde tipik “istemci tarafı” davranışları

Görselleştirme

Problem Tanımı

  • SATM, kullanıcıyla 15 farklı ekran üzerinden iletişim kurar.
  • Kullanıcı üç işlem türünden birini seçebilir:
    • Para yatırma (deposit)
    • Para çekme (withdrawal)
    • Bakiye sorgulama (balance inquiry)
  • Basitlik için: işlemler tek bir vadesiz hesap (checking account) üzerinden düşünülür.

SATM Ekranları

Giriş Akışı: Kart ve PIN

  • Başlangıçta Ekran 1 gösterilir (kart takma).
  • Kart üzerindeki PAN (hesap numarası) müşteri dosyasında aranır:
    • PAN bulunursa → Ekran 2 (PIN istenir)
    • PAN bulunmazsa → Ekran 4 (kart geçersiz, kart alıkonur)

PIN Doğrulama

  • Ekran 2’de kullanıcı PIN girer:
    • PIN doğruysa → Ekran 5 (işlem seçimi)
    • PIN yanlışsa → Ekran 3 (yeniden dene)
  • Kullanıcının 3 deneme hakkı vardır:
    • 3 yanlış sonrası → Ekran 4 (kart alıkonur)

Ekran 5: İşlem Seçimi

Kullanıcı üç işlemden birini seçer:

  • Balance → ilgili ekran akışı
  • Deposit → ilgili ekran akışı
  • Withdrawal → ilgili ekran akışı

Bu nokta, sistem testi için “kritik karar düğümü”dür.

Bakiye Sorgulama (Balance)

  • Bakiye istenirse:
    • sistem ilgili ekranı gösterir
    • işlem sonunda “başka işlem?” sorusuna bağlanır

Para Yatırma (Deposit)

  • Para yatırma seçilirse:
    • zarf yuvasının durumu kontrol edilir (terminal kontrol dosyasından)
    • sorun yoksa tutar istenir
    • sorun varsa ilgili hata ekranı gösterilir
  • Tutar girilince:
    • zarf alınır, işlem yapılır, sonra “başka işlem?” akışına geçilir

Para Çekme (Withdrawal)

  • Para çekme seçilirse:
    • para çıkış kanalının durumu (jammed/free) kontrol edilir
    • jammed ise hata ekranı
    • değilse tutar girişi ekranı
  • Tutar girilince:
    • kasada yeterli para var mı kontrol edilir
    • bakiye yeterli mi kontrol edilir
    • uygunsa para verilir ve “başka işlem?” ekranına geçilir

“Başka İşlem?” Mantığı

  • Ekran 10, 12 veya 14’te:
    • No → Ekran 15 (kartı ve fişi al, bitir)
    • Yes → Ekran 5 (yeni işlem seç)

Test Açısından Not

Bu örnek, üst seviye testlerde şu tip sorunları çalışmak için idealdir:

  • ekran akışı (state/transition)
  • entegrasyon noktaları (kart doğrulama, terminal durum dosyası, hesap bilgisi)
  • hata senaryoları (yanlış PIN, jammed, yetersiz para vb.)

Tartışma

  • Verilen sistem tanımının içinde, dikkat edilmezse gözden kaçacak birçok bilgi “gömülü”dür.
  • Örneğin metinden şu çıkarım yapılabilir:
    • ATM sadece $10’luk banknot veriyor (Ekran 7’den anlaşılır).
  • Bu metinsel tanım, pratikte karşılaşılan birçok tanıma göre daha “net” olabilir.
  • Örnek bilinçli şekilde basit tutulmuştur (adı da buradan gelir).

Basitlik İçin Bilerek Dışarıda Bırakılan Sorular

Gerçek hayatta şu tür sorular doğar; bu örnekte ise basitlik için dışarıda bırakılır:

  • Borç/limit var mı?
  • Müşteri, farklı ATM’lerden art arda çekerek bakiyeyi aşabilir mi? (çoklu terminal konusu)
  • Başlangıçta kasada ne kadar para var?
  • Sisteme yeni müşteriler nasıl ekleniyor?

Örnekler basitleştirilirken “varsayımlar” açık yazılmazsa testte boşluk oluşur.

Döviz Çevirici (Currency Converter)

  • GUI odaklı, olay güdümlü (event-driven) bir örnek.
  • Amaç: Arayüz olayları ile tetiklenen davranışları test etmeye uygun bir senaryo sağlamak.

Uygulamanın Davranışı

  • Uygulama, ABD dolarını 4 para birimine çevirebilir:
    • Brezilya reali
    • Kanada doları
    • Euro
    • Japon yeni
  • Para birimi seçimi radio button ile yapılır:
    • seçenekler birbirini dışlar (aynı anda sadece biri seçilebilir)

Seçim Yapılınca Ne Olur?

  • Ülke seçilince sistem arayüzde tepki verir:
    • “Equivalent in …” etiketi seçilen ülkeye göre tamamlanır
      (örn. “Equivalent in Canadian dollars”)
    • Çıktı alanının yanında ilgili küçük bayrak gösterilebilir

Kullanıcı Aksiyonları

Kullanıcı şu işleri yapar:

  • Para birimini seçer (önce/sonra olabilir)
  • USD miktarını girer
  • Sonra üç butondan birine basar:
    • Compute: çevirimi yap
    • Clear: seçimi ve alanları sıfırla
    • Quit: uygulamadan çık

Compute / Clear / Quit Davranışı

  • Compute
    • Girilen USD tutarını seçilen para birimine çevirir
  • Clear
    • Para birimi seçimini sıfırlar
    • USD alanını sıfırlar
    • Çıktı alanını ve etiketini sıfırlar
  • Quit
    • Uygulamayı sonlandırır

Test Açısından Not

Bu örnek şunları çalışmak için uygundur:

  • GUI olay sıraları (önce seçim mi, önce giriş mi?)
  • Radio button “tek seçim” kuralı
  • Compute / Clear akışları
  • UML ile tanımlanmış davranış + OO implementasyon bağlantısı
    (ileride daha detaylı kullanılacak)

Saturn Silecek Kontrolörü (Windshield Wiper Controller)

  • Bazı Saturn araçlarında silecek, kol + kadran ile kontrol edilir.
  • Kolun 4 konumu vardır:
    • OFF, INT (aralıklı), LOW, HIGH
  • Kadranın 3 konumu vardır:
    • 1, 2, 3
  • Kadran sadece kol INT konumundayken anlamlıdır.

Karar Tablosu: Kol + Kadran → Silecek Hızı

Aşağıdaki tablo, silecek hızını (dakikadaki silme sayısı) verir:

Koşul OFF INT(1) INT(2) INT(3) LOW HIGH
Kadran n/a 1 2 3 n/a n/a
Silecek (wipe/min) 0 4 6 12 30 60

Test Açısından Not

  • Bu örnek, karar tablosu ile test üretmeye çok uygundur.
  • Ayrıca “kadran sadece INT’te geçerli” kuralı sayesinde:
    • geçersiz kombinasyonlar
    • arayüz/iş kuralı tutarlılığı kolayca test edilir.

Garaj Kapısı Açıcı (Garage Door Opener)

  • Garaj kapısını açan sistem birden fazla bileşenden oluşur:
    • motor, zincir, raylar, lamba, elektronik kontrolcü
  • Kontrolcü ile haberleşen cihazlar:
    • araç içi kablosuz kumanda
    • dış kapıdaki tuş takımı
    • duvardaki buton
  • Güvenlik özellikleri:
    • zemine yakın ışık bariyeri (laser/light beam)
    • engel sensörü (obstacle/resistance)

Güvenlik Davranışları (Kapanırken)

  • Kapı kapanırken ışık bariyeri kesilirse (örn. evcil hayvan):
    • kapı hemen durur
    • sonra ters yöne gidip tamamen açılana kadar devam eder
  • Kapı kapanırken bir engele çarparsa (örn. bisiklet):
    • kapı durur
    • sonra ters yöne gidip tamamen açılana kadar devam eder

“Durdur / Devam Et” Davranışı

  • Kapı hareket halindeyken (açılırken ya da kapanırken):
    • üç girişten biri sinyal verirse (kumanda / tuş takımı / duvar butonu)
    • kapı bulunduğu yerde durur
  • Sonraki sinyal geldiğinde:
    • kapı, durmadan önceki aynı yönde hareketine devam eder

Limit Sensörleri ve Lamba

  • Kapı tamamen açık/kapalı uç konumlara geldiğinde bunu algılayan sensörler vardır.
  • Kapı hareket halindeyken lamba yanar.
  • Kapı uç konuma geldikten sonra lamba yaklaşık 30 saniye daha yanık kalır.

Bileşenler Arası İlişki (SysML Bağlamı)

Test Açısından Not

  • Bu örnek, “sistemlerin sistemi” (systems-of-systems) türü sorunlara iyi bir örnektir:
    • çoklu giriş kaynağı
    • güvenlik odaklı tepki kuralları
    • sensör + aktüatör + kontrolcü etkileşimi
  • İleride durum makineleri / statechart ile modellenmesi özellikle anlamlıdır.