Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Tekniği Seçmek ve Birleştirmek: Requirement'tan Test Listesine, Acceptance Criteria ile Hizalamak ve AI ile Test Case Üretmenin Sınırları
Test tekniğini requirement'ın şekli seçer: aralıklar için equivalence partitioning ve boundary value analysis, koşul kombinasyonları için decision table, geçmişe bağlı sonuç için state transition; teknikler birleştirilip tekrarları atılınca tek bir test listesi kalır. Bookstore'un kurumsal kısmi sevkiyat story'sinde beş teknik 27 condition üretti, liste 19'a indi ve üç tekniğin buluştuğu satır sevkiyat hatasını yakaladı. AI'dan test case istemek için prompt ve review checklist'i.
White-box ve Experience-based Teknikler: Branch Coverage'ı Test Tasarımı için Kullanmak, Error Guessing, Checklist ve Exploratory Testing
Branch coverage raporu test tasarımında hedef değil, hiç çalışmamış dalı gösterip yeni test case'ler çıkaran bir araçtır; ama yazılmamış kodu göremez, onu error guessing, checklist ve exploratory testing bulur. Bookstore'un kupon kodunda rapor story'de olmayan tavan dalındaki hatayı, error guessing Türkçe I hatasını, bir saatlik exploratory session de çift tıklamayla açılan iki siparişi ve negatif tutarlı siparişi buldu; hepsi regression testine döndü.
Kombinatoryal Test: Pairwise, Orthogonal Array ve PICT ile Konfigürasyon Patlamasını Yönetmek
Pairwise testing, her iki parametrenin her değer çiftini en az bir testte yan yana getirerek tam kombinasyonun maliyetini düşürür; hataların çoğunun bir ya da iki parametrenin etkileşiminden çıktığı varsayımına dayanır. Bookstore'un checkout'unda each choice'un üç testi eksik İngilizce mağazadan teslim template'ini kaçırdı; PICT'in constraint'li modelden ürettiği 11 satır yakaladı. t-wise, orthogonal array, seed, oracle ve Playwright project'leri.
State Transition Testing: Sipariş State Machine'inden Test Case Üretmek, Geçersiz Geçişler ve 0-switch/1-switch Coverage
State transition testing, sistemin davranışı geçmişine bağlıysa test case'leri state diagram'ından ve state table'dan çıkarır: geçerli transition'lar (0-switch), state table'ın boş hücrelerindeki geçersiz transition'lar ve art arda iki transition'dan oluşan çiftler (1-switch). Bookstore'un siparişinde üç yeşil test, kargodaki siparişin iptal edilebilmesini ve beklemeden dönen siparişin kargoya verilememesini kaçırdı; 40 geçersiz geçiş ve 10 transition çifti ikisini de yakaladı.
Decision Table Testing: Kural Kombinasyonları, Tabloyu Sadeleştirmek ve Kural Tablosundan Teste
Decision table testing, sonucu birden fazla koşulun kombinasyonuna bağlı kurallar için bütün kombinasyonları tabloya döker, sadeleştirir ve her sütunu bir teste çevirir. Bookstore'un kargo ücretinde cümle başına yazılan dört yeşil test, Plus üyesinin yurt dışı kargosundaki çelişkiyi ve yedi tanımsız kupon durumunu kaçırdı; tablo hepsini test yazmadan gösterdi. Limited ve extended-entry tablo, "–" ve N/A, iade onayı ve testi koddaki tablodan kopyalamamak.
Boundary Value Analysis: 2-Value ve 3-Value BVA, Off-by-One, Tarih, Para ve Uzunluk Sınırları
Boundary value analysis, test değerini partition'ın ortasından değil sınırından ve komşusundan seçer; komşunun ne olduğunu tipin ve kuralın hassasiyeti belirler. Bookstore'da partition başına bir test yeşilken 500,00 TL ücretsiz kargo, UTC'ye kaymış Kasım kampanyası ve 23:59:59'da kapanan son saniye ancak sınır testleriyle yakalandı. 2-value ve 3-value BVA, FakeTimeProvider ile tarih sınırı, ISBN uzunluğu ve sepet boyutu.
Equivalence Partitioning: Girdiyi Sınıflara Bölmek, Geçerli ve Geçersiz Partition'lar, Coverage ve xUnit Theory'ye Dökmek
Equivalence partitioning, girdiyi kodun aynı davranması beklenen partition'lara böler ve her partition'ı bir testle kapsar; geçersiz partition'lar ise her biri ayrı testte denenir. Bookstore'un sipariş validator'ında iki geçersiz değeri birleştiren testler eksik misafir ödeme kuralını sakladı; partition tablosundan türetilen dokuz test hem onu hem tanımsız enum değeri hatasını yakaladı. Each Choice coverage, çıktı partition'ları ve TheoryData.
Test Case Tasarımı Nedir? Test Koşulu, Test Case, Coverage Hedefi ve Teknik Aileleri
Test case tasarımı, test case'leri sezgiyle değil requirement'tan türetmektir: test basis'ten test condition'a, coverage item'a, test case'e ve test verisine giden bir zincir. Bookstore'un kurumsal sipariş kuralında aynı senaryoyu deneyen beş yeşil test iki hatayı kaçırdı; kuraldan türetilen sekiz test ikisini de yakaladı. ISTQB CTFL v4.0.1'e göre black-box, white-box, experience-based teknikler ve collaboration-based yaklaşımlar.
Statik Analizde Neler Değişti: .NET 5–11 Analyzer'ları, TSLint'ten ESLint 10'a, TypeScript 7 ve Yeni Nesil Linter'lar
Analyzer'lar .NET 5'ten beri SDK'nın parçası ve her sürüm yeni kural getiriyor: aynı kod .NET 10 SDK'sıyla sıfır, .NET 11 SDK'sıyla dört uyarı verdi (CA2026, CA2027, CA1877, CA2028). Yazı .NET 6–11 kural tarihini, CA2028'in source-generated regex'i görmemesini, .eslintrc'den flat config'e otomatik taşımanın angular-eslint 22'de neden yetmediğini, TypeScript 7'nin typescript-eslint'i beklettiğini, Oxlint ve Biome'un Bookstore'daki sonuçlarını ve Sonar'ın yeni adlarını anlatıyor.
SonarQube ile Quality Gate: Community Build mi Server mı, Quality Profile, Yeni Kod Odaklı Gate ve CI Entegrasyonu
SonarQube'un varsayılan gate'i yalnız yeni koda bakar: yeni issue sıfır, yeni kodda coverage en az %80. Bookstore'da build'i ve testleri temiz olan 'benzer kitaplar' endpoint'i gate'i %10,3 yeni kod coverage'ıyla kırdı, iki test sonrası geçti. Yazı Community Build'i Docker'da PostgreSQL ile kurmayı, SonarScanner for .NET'i, Sonar way core profilini, Roslyn ile çift raporlamayı, eski coverage raporu tuzağını ve Community Build'in PR analizi olmayışını gerçek çıktılarla anlatıyor.
Angular ve TypeScript'te ESLint: Flat Config, typescript-eslint Type-Aware Kurallar ve angular-eslint Template Kuralları
Promise'leri await etmeyen kodu ancak tip bilgisi kullanan kurallar yakalar: Bookstore'un Angular istemcisinde ng add angular-eslint'in config'i bir PR'da 2 sorun buldu, strictTypeChecked ve projectService ile bu sayı 12'ye çıktı. Yazı ESLint 10'un flat config zorunluluğunu, no-floating-promises ve no-misused-promises bug'larını, accessibility template kurallarını, type-aware lint'in maliyetini, cache'in eski sonuç vermesini ve TypeScript 7 ile uyumsuzluğu gerçek çıktılarla anlatıyor.
Third-Party Analyzer'lar ve Kendi Roslyn Analyzer'ını Yazmak: BannedApiAnalyzers, Popüler Paketler, DiagnosticAnalyzer ve CodeFix
Bir kural yalnız 'şu API'yi kullanma' diyorsa BannedApiAnalyzers yeter; code fix, ekibe özgü mantık ya da bağlama göre mesaj gerekiyorsa kendi Roslyn analyzer'ını yazarsın. Bookstore'da Meziantou, Roslynator ve SonarAnalyzer 87 uyarı ve 14 kat analiz süresi getirdi ama DateTime.UtcNow'ı varsayılan ayarlarla yakalamadı. Yazı TimeProvider kuralını operation callback'li bir analyzer, ayrı assembly'de code fix, Microsoft.CodeAnalysis.Testing testleri ve NuGet paketiyle yazıyor.