.NET TEST VE PERFORMANS EĞİTİMİ
.NET test ve performans eğitimi, "hızlı çalışıyor" cümlesini ölçümle savunan bir disiplin kazandırmak için tasarlandı. xUnit, NUnit ve MSTest arasında ekip yapısına göre framework seçimi; BenchmarkDotNet ile mikro-benchmark yazımı; dotMemory ve PerfView ile memory leak ve allocation pattern tespiti işlenir.
Program sonunda katılımcı, async/await deadlock senaryolarını test eder ve çözer; Span<T> ve Memory<T> ile allocation azaltır; Testcontainers ile gerçek DB üzerinde integration test yazar. NBomber veya k6 ile stress ve load test pipeline'ı kurma eğitimin pratik kapanışıdır. Eğitim, .NET test belgeleri baz alınarak kurgulanır.
Katılımcı Profili
Bu eğitim, .NET tarafında performans iddialarını ölçümle savunmak isteyen rollere yöneliktir:
- .NET Geliştiriciler: Production-grade test ve performans hedefleyen mühendisler
- QA Mühendisleri: xUnit ve integration test yazan test ekipleri
- Performans Mühendisleri: BenchmarkDotNet ve profiling kullanan roller
- Backend Mühendisleri: Hot path optimizasyonu yapan ekipler
- Tech Lead'ler: Test stratejisi ve kalite süreçlerini belirleyen roller
Ön Gereklilikler
Bu eğitime katılım için aşağıdaki ön bilgiler önerilir:
- C# ve .NET ekosistemiyle temel geliştirme deneyimi
- Unit test kavramına giriş düzeyi aşinalık
- Async/await ve task tabanlı asenkron programlama temel bilgisi
- Visual Studio veya Rider kullanım deneyimi
- Komut satırı (dotnet CLI) ile rahat çalışma
Süresi ve Tarihi
Süre: 3 gün. Bu süre standart program içindir; ek modüllere ve hedefe göre süre özelleştirilebilir.
Eğitim tarihleri ve saatleri, ekibinizin uygunluğuna göre birlikte planlanır.
Kazanımlar
Program sonunda katılımcı, .NET'te performans iddialarını ölçümle savunur, tahminle değil:
- xUnit, NUnit ve MSTest arasında ekip yapısına göre framework seçer
- BenchmarkDotNet ile mikro-benchmark yazar ve regression tespit eder
- dotMemory ve PerfView ile memory leak ve allocation pattern bulur
- async/await deadlock senaryolarını test eder ve çözer
- Span<T> ve Memory<T> ile allocation azaltır
- Testcontainers ile gerçek veritabanı üzerinde integration test kurar
- NBomber veya k6 ile stress ve load test pipeline'ı kurar
.NET Test ve Performans Eğitimi Konuları
1. Test Piramidi - Unit, Integration, E2E
- Test piramidi ve test trofesi (testing trophy) tartışması
- Unit, integration, end-to-end seviye sınırları
- Hızlı geri bildirim ve doğru kapsam dengesi
- Test maliyet vs değer matrisi
2. xUnit Framework Temelleri
- [Fact], [Theory], [InlineData] attribute'leri
- Constructor injection ile test setup
- IClassFixture ve ICollectionFixture
- FluentAssertions ile okunabilir assertion
3. NUnit ve MSTest Karşılaştırması
- NUnit [SetUp], [TearDown], [TestCase]
- MSTest [TestInitialize], [DataRow]
- Framework seçim kriterleri
- Parallel test execution farkları
4. Moq ile Mocking
- Setup, Returns, Callback metotları
- Verify ile davranış doğrulama
- It.IsAny, It.Is matcher kullanımı
- Strict ve Loose mock davranışı
5. NSubstitute ve FakeItEasy Alternatifleri
- NSubstitute akıcı söz dizimi
- FakeItEasy ve API tasarımı
- Mocking kütüphaneleri arası karar matrisi
- Mock dependency'ye karşı manuel fake
6. Test Fixture ve Setup/Teardown
- Shared fixture ile pahalı kurulumu paylaşma
- Test izolasyonu ve sıralı bağımlılık önleme
- Constructor vs IAsyncLifetime
- Database fixture pattern
7. Theory ve Parametrize Test
- InlineData ile basit parametre
- MemberData ve ClassData ile dış kaynak
- Property-based testing: FsCheck
- Test case türetme stratejisi
8. AutoFixture ile Test Data Generation
- Anonymous object üretimi
- Customization ve specimen builder
- AutoMoq, AutoNSubstitute entegrasyonu
- Test data builder pattern alternatifi
9. WebApplicationFactory ile Integration Test
- In-memory TestServer kurulumu
- Service replacement ile bağımlılık değiştirme
- Authentication bypass ve test user
- HttpClient ile API endpoint test
10. TestContainers ile Gerçek Bağımlılık
- Testcontainers .NET kütüphanesi
- PostgreSQL, Redis, RabbitMQ container'ları
- Test başına izole environment
- CI pipeline'da Docker-in-Docker yaklaşımı
11. Code Coverage - Coverlet, ReportGenerator
- Line, branch, method coverage farkı
- Coverlet ile coverage toplama
- ReportGenerator ile HTML rapor
- Coverage hedefi ve gaming önlemi
12. Mutation Testing - Stryker.NET
- Mutation testing felsefesi: testleri test etme
- Stryker.NET kurulumu ve çalıştırma
- Mutation score yorumlama
- Survived mutant analizi
13. Performance - BenchmarkDotNet
- [Benchmark] ve [Params] attribute'leri
- MemoryDiagnoser ve allocation ölçümü
- Baseline ve karşılaştırmalı sonuç
- Mikro benchmark tuzakları
14. Memory Profiling - dotMemory ve PerfView
- JetBrains dotMemory ile snapshot analizi
- Memory leak ve retention path
- PerfView ile ETW event toplama
- LOH (Large Object Heap) izleme
15. CPU Profiling - dotTrace
- Sampling, tracing, timeline profili
- Hot path tespiti ve call tree
- Async/await profiling zorluğu
- Production profiling stratejisi
16. Load Test - NBomber, k6
- NBomber C# load test framework
- k6 (JavaScript) ile cross-platform load
- Senaryo tasarımı: ramp-up, sustained, spike
- Metric: requests/sec, p95 latency, error rate
17. CI Pipeline'da Test Otomasyonu
- GitHub Actions, Azure DevOps ile test koşumu
- Test paralelizasyonu ve sharding
- Coverage gate ve PR engelleme
- Flaky test detection ve karantina
18. Test Smell ve Anti-Pattern
- Fragile test ve over-specified mock
- Test interdependence ve random failure
- Slow test ve fast feedback ihlali
- Magic value vs descriptive constant
- Assert roulette ve single assertion prensibi
.NET TEST VE PERFORMANS EĞİTİMİ ile İlgili
Sıkça Sorulan Sorular ve Cevapları
BenchmarkDotNet ile mikro-benchmark yazımındaki tuzaklar nelerdir?
Dead code elimination compiler benchmark'ınızı silebilir — sonucu Consumer veya return ile kullanmak gerekir. Cold start, JIT warmup, GC etkisi BDN tarafından yönetilir. Yanlış [Params] kullanımı veya küçük input'la asıl darboğazı görmeme klasik hatalar. Mean değil median ve standart sapmaya bakmak şart.
dotMemory ve PerfView arasındaki fark nedir?
dotMemory (JetBrains) GUI tabanlı; snapshot karşılaştırma, retention path analizi kolay ama lisanslı. PerfView Microsoft'un ücretsiz aracı; ETW event'leri ile düşük overhead, allocation sampling ve GC analizi yapar — öğrenme eğrisi dik ama production-safe. Profil için PerfView, hızlı keşif için dotMemory.
Spanve Memoryallocation azaltır mı?
Span
xUnit, NUnit ve MSTest arasında nasıl seçim yapılır?
xUnit modern .NET projelerin yaygın tercihi; constructor injection ve parallel execution default. NUnit daha çok attribute ve fluent assertion ekosistemine sahip — Java JUnit deneyimi olanlar için tanıdık. MSTest Microsoft'un built-in'i; Azure DevOps entegrasyonu iyi. Yeni proje için xUnit en sık tavsiye edilen.
Testcontainers ile mock database arasında karar?
Mock (in-memory provider) hızlı ama gerçek DB davranışını taklit etmez — özellikle constraint, trigger, transaction izolasyonu fark eder. Testcontainers gerçek PostgreSQL/SQL Server'ı Docker'da ayağa kaldırır; CI'da yavaş ama doğru. Critical path'te Testcontainers, unit-level testte mock pratik.
Async/await deadlock senaryoları nasıl test edilir?
Klasik deadlock SynchronizationContext olan UI/ASP.NET Framework'te .Result veya .Wait() çağrısıdır. ASP.NET Core'da context yok, bu pattern güvenli. Test için stress test (NBomber, k6) ve concurrent request senaryoları kurulur; ConfigureAwait(false) deadlock'a karşı library kodunda standart koruma.



