[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:backend\u002Fcsharp-testing-tooling":4,"config":253},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":148,"samples":168},"backend","Backend","","csharp-testing-tooling","Csharp Testing Tooling","tr",75,3300,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136,139,142,145],{"key":19,"name":20,"count":11},"api-design","API Tasarımı",{"key":22,"name":23,"count":11},"caching","Caching",{"key":25,"name":26,"count":11},"concurrency","Eşzamanlılık",{"key":28,"name":29,"count":11},"csharp-concurrency-async","Csharp Concurrency Async",{"key":31,"name":32,"count":11},"csharp-exceptions","Csharp Exceptions",{"key":34,"name":35,"count":11},"csharp-generics-interfaces","Csharp Generics Interfaces",{"key":37,"name":38,"count":11},"csharp-memory-performance","Csharp Memory Performance",{"key":40,"name":41,"count":11},"csharp-stdlib-http","Csharp Stdlib Http",{"key":8,"name":9,"count":11},{"key":44,"name":45,"count":11},"databases-sql","Veritabanı \u002F SQL",{"key":47,"name":48,"count":11},"go-concurrency","Go Concurrency",{"key":50,"name":51,"count":11},"go-errors","Go Errors",{"key":53,"name":54,"count":11},"go-interfaces-generics","Go Interfaces Generics",{"key":56,"name":57,"count":11},"go-memory-performance","Go Memory Performance",{"key":59,"name":60,"count":11},"go-stdlib-http","Go Stdlib Http",{"key":62,"name":63,"count":11},"go-testing-tooling","Go Testing Tooling",{"key":65,"name":66,"count":11},"java-concurrency","Java Concurrency",{"key":68,"name":69,"count":11},"java-exceptions","Java Exceptions",{"key":71,"name":72,"count":11},"java-generics-interfaces","Java Generics Interfaces",{"key":74,"name":75,"count":11},"java-memory-jvm","Java Memory Jvm",{"key":77,"name":78,"count":11},"java-stdlib-http","Java Stdlib Http",{"key":80,"name":81,"count":11},"java-testing-tooling","Java Testing Tooling",{"key":83,"name":84,"count":11},"messaging-queues","Mesajlaşma \u002F Kuyruklar",{"key":86,"name":87,"count":11},"networking-http","Ağ \u002F HTTP",{"key":89,"name":90,"count":11},"nodejs-error-handling","Nodejs Error Handling",{"key":92,"name":93,"count":11},"nodejs-event-loop-async","Nodejs Event Loop Async",{"key":95,"name":96,"count":11},"nodejs-memory-performance","Nodejs Memory Performance",{"key":98,"name":99,"count":11},"nodejs-modules-streams","Nodejs Modules Streams",{"key":101,"name":102,"count":11},"nodejs-stdlib-http","Nodejs Stdlib Http",{"key":104,"name":105,"count":11},"nodejs-testing-tooling","Nodejs Testing Tooling",{"key":107,"name":108,"count":11},"php-concurrency-async","Php Concurrency Async",{"key":110,"name":111,"count":11},"php-exceptions","Php Exceptions",{"key":113,"name":114,"count":11},"php-generics-interfaces","Php Generics Interfaces",{"key":116,"name":117,"count":11},"php-memory-performance","Php Memory Performance",{"key":119,"name":120,"count":11},"php-stdlib-http","Php Stdlib Http",{"key":122,"name":123,"count":11},"php-testing-tooling","Php Testing Tooling",{"key":125,"name":126,"count":11},"python-concurrency-async","Python Concurrency Async",{"key":128,"name":129,"count":11},"python-errors-context","Python Errors Context",{"key":131,"name":132,"count":11},"python-memory-performance","Python Memory Performance",{"key":134,"name":135,"count":11},"python-stdlib-http","Python Stdlib Http",{"key":137,"name":138,"count":11},"python-testing-tooling","Python Testing Tooling",{"key":140,"name":141,"count":11},"python-typing-oop","Python Typing Oop",{"key":143,"name":144,"count":11},"security","Güvenlik",{"key":146,"name":147,"count":11},"testing","Test",[149,153,156,159,162,165],{"key":150,"name":151,"count":152},"csharp","C#\u002F.NET",450,{"key":154,"name":155,"count":152},"go","Go",{"key":157,"name":158,"count":152},"java","Java",{"key":160,"name":161,"count":152},"nodejs","Node.js",{"key":163,"name":164,"count":152},"php","PHP",{"key":166,"name":167,"count":152},"python","Python",[169,187,200,214,227,240],{"id":170,"topic":9,"difficulty":171,"body":172,"options":173,"correct_key":178,"explanation":186},"019f70e2-e89d-715d-9745-661e4445d083",1,"xUnit'te bir metodun test olarak keşfedilip çalıştırılmasını ne belirler?",[174,177,180,183],{"key":175,"text":176},"a","Metot adı `Test` ile başlamalıdır; xUnit hâlâ keşif için isimlendirme kuralına dayanır, tıpkı bazı eski test framework'lerinin gerektirdiği gibi",{"key":178,"text":179},"b","Metot `[Fact]` (ya da `[Theory]`) ile işaretlenmelidir; xUnit'in keşif mekanizması bunu tarar",{"key":181,"text":182},"c","Metot, runner'ın instance oluşturmadan çağırabilmesi için `public static void` olmalıdır",{"key":184,"text":185},"d","İçinde bulunduğu sınıf, xUnit'in runner'ının başlangıçta aradığı `ITestCase` arayüzünü implement etmelidir","xUnit testleri tamamen attribute ile keşfeder: parametresiz bir test için `[Fact]`, veri odaklı bir test için `[Theory]`. İsimlendirme kuralı gerekmez, `static` şartı yoktur (xUnit her test için bir instance oluşturur) ve implement edilecek bir `ITestCase` arayüzü de yoktur.",{"id":188,"topic":9,"difficulty":171,"body":189,"options":190,"correct_key":175,"explanation":199},"019f70e2-e89d-78c9-8c9f-90d5f0d7186a","xUnit'te `[Fact]` ile `[Theory]` arasındaki temel fark nedir?",[191,193,195,197],{"key":175,"text":192},"`[Fact]`, parametre almayan ve bir kez çalışan bir testi işaretler; `[Theory]` ise parametre alan ve değerleri sağlamak için `[InlineData]` gibi bir veri kaynağına ihtiyaç duyan bir testi işaretler",{"key":178,"text":194},"`[Fact]` senkron testler, `[Theory]` ise `async Task` testler içindir, bu yüzden aynı test sınıfında ikisini karıştırmak ayrı assertion kütüphaneleri ve ayrı test runner yapılandırması gerektirir",{"key":181,"text":196},"`[Theory]`, eski test runner'larla geriye dönük uyumluluk için tutulan, `[Fact]`'in kullanımdan kaldırılmış bir takma adıdır",{"key":184,"text":198},"`[Fact]`, sınıftaki tüm `[Theory]` testlerinden önce çalışır ve veri odaklı testler için bir setup adımı görevi görür","`[Fact]`, tek ve parametresiz bir test durumu içindir. `[Theory]` ise parametre alan veri odaklı bir test metodu içindir ve bir ya da daha fazla çalıştırma için argüman değerlerini sağlayan en az bir veri kaynağı attribute'üne (`[InlineData]`, `[MemberData]` ya da `[ClassData]`) ihtiyaç duyar. İki attribute de senkron\u002Fasenkron ile ilgili değildir ve aralarında örtük bir sıralama yoktur.",{"id":201,"topic":9,"difficulty":202,"body":203,"options":204,"correct_key":175,"explanation":213},"019f70e2-e89e-7d8b-920b-8dc9a7c79576",2,"```csharp\n[Fact]\npublic void ChecksTotal()\n{\n    int actualTotal = ComputeTotal(); \u002F\u002F 7 döner\n    Assert.Equal(actualTotal, 10);\n}\n```\nTest başarısız oluyor. Hata mesajı ne rapor eder?",[205,207,209,211],{"key":175,"text":206},"\"Expected: 7, Actual: 10\" — çünkü `Assert.Equal`'a geçilen ilk argüman expected sayılır ve burada yanlışlıkla önce `actualTotal` (7) geçilmiştir",{"key":178,"text":208},"\"Expected: 10, Actual: 7\" — çünkü xUnit her zaman küçük sayısal değeri actual olarak etiketler, niyeti argüman pozisyonundan değil değerlerden çıkarır",{"key":181,"text":210},"Derleme hatası oluşur, çünkü `Assert.Equal` literal expected değerinin ikinci argüman olarak geçilmesini zorunlu kılar",{"key":184,"text":212},"\"Expected: 10, Actual: 10\" — çünkü xUnit raporlamadan önce iki argümanı da aynı karşılaştırma hedefine indirger","`Assert.Equal(expected, actual)` sadece pozisyona göre birinci argümanı \"expected\", ikincisini \"actual\" sayar. Buradaki çağrı `Assert.Equal(actualTotal, 10)` olduğundan xUnit `actualTotal`'ı (7) expected, `10`'u actual olarak raporlar. Bu yaygın bir junior hatasıdır — argümanlar ters geçilmiştir, bu testin geçip geçmemesini değiştirmez ama yanıltıcı bir mesaj üretir.",{"id":215,"topic":9,"difficulty":202,"body":216,"options":217,"correct_key":181,"explanation":226},"019f70e2-e89f-7946-826c-81b5578602da","```csharp\npublic class MathTests\n{\n    [Theory]\n    [InlineData(2, 4)]\n    [InlineData(3, 9)]\n    public void SquaresNumber(int input, int expected)\n    {\n        Assert.Equal(expected, input * input);\n    }\n}\n```\n`SquaresNumber` kaç kez çalışır ve her `[InlineData]` ne sağlar?",[218,220,222,224],{"key":175,"text":219},"Bir kez çalışır, iki `[InlineData]` satırı tek bir dizi parametresinde birleştirilerek alınır",{"key":178,"text":221},"4 kez çalışır, çünkü iki `[InlineData]` attribute'ü iki metot parametresiyle çarpılınca metot gövdesinin dört ayrı çalıştırması ortaya çıkar",{"key":181,"text":223},"2 kez çalışır, her `[InlineData]` satırı için bir kez; `input`\u002F`expected` her seferinde o satırın değerlerine bağlanır",{"key":184,"text":225},"Derlenmez, çünkü bir `[Theory]` metodu yalnızca tek bir `[InlineData]` attribute'üne sahip olabilir","Her `[InlineData(...)]` attribute'ü, `[Theory]` metodunun bir çalıştırması için tam bir argüman seti sağlar. İki `[InlineData]` attribute'üyle metot iki kez çalışır: bir kez `input=2, expected=4` ile, bir kez `input=3, expected=9` ile. Bir `[Theory]` metodunun üzerine istenildiği kadar `[InlineData]` attribute'ü yığılabilir.",{"id":228,"topic":9,"difficulty":171,"body":229,"options":230,"correct_key":184,"explanation":239},"019f70e2-e8a2-70f7-bdc9-9580da366111","\"Test izolasyonu\" (her testin diğerlerinden bağımsız olması) neden temel bir test prensibi sayılır?",[231,233,235,237],{"key":175,"text":232},"İzolasyon esasen bir performans optimizasyonudur — izole testler, her bir test metodu arasında runtime'ın class loading ve assembly çözümlemesini atlayabilmesi sayesinde sadece daha hızlı çalışır",{"key":178,"text":234},"İzolasyon, her testin mock yerine gerçek veritabanı ve gerçek network çağrıları kullanması gerektiği, böylece bütün sistemin birlikte çalıştığının kanıtlanması demektir",{"key":181,"text":236},"İzolasyon sadece integration testler için geçerlidir; unit testler paylaşılan kaynaklara asla dokunmadığı için bu prensipten muaftır",{"key":184,"text":238},"İzole bir testin sonucu yalnızca kendi setup'ına ve test edilen koda bağlıdır, bu yüzden tek başına, herhangi bir sırayla ya da paralel çalıştırıldığında da güvenilir sonuç verir","Test izolasyonu, bir testin sonucunun çalıştırma sırasına, önce başka testlerin çalışmış olmasına ya da artakalan paylaşılan duruma bağlı olmaması demektir. Bu önemlidir çünkü test runner'ları testleri istediği sırayla (ve genellikle paralel) çalıştırmakta serbesttir; testler mutable durumu sıfırlamadan paylaşıyorsa sonuçlar sıraya bağımlı ve kararsız (flaky) hâle gelir. Mock kullanılıp kullanılmamasıyla ilgisizdir ve unit testler için de integration testler kadar geçerlidir.",{"id":241,"topic":9,"difficulty":202,"body":242,"options":243,"correct_key":178,"explanation":252},"019f70e2-e8a3-71d1-897e-4edc705700a2","```csharp\npublic class CounterTests\n{\n    private int _count;\n\n    public CounterTests()\n    {\n        _count = 10;\n    }\n\n    [Fact]\n    public void FirstIncrements()\n    {\n        _count++;\n        Assert.Equal(11, _count);\n    }\n\n    [Fact]\n    public void SecondStartsFresh()\n    {\n        Assert.Equal(10, _count);\n    }\n}\n```\nİki test birlikte çalıştırıldığında ikisi de geçiyor. `FirstIncrements`'in `_count = 11` bırakması neden `SecondStartsFresh`'i etkilemiyor?",[244,246,248,250],{"key":175,"text":245},"Bu çalıştırma sırasının bir tesadüfüdür — `SecondStartsFresh`, herhangi bir yeniden başlatma olmadan aynı test sürecinde `FirstIncrements`'in hemen ardından çalışsaydı 11'i görürdü",{"key":178,"text":247},"xUnit her `[Fact]` metodu için `CounterTests`'in yepyeni bir instance'ını oluşturur, bu yüzden constructor tekrar çalışır ve `_count`, `SecondStartsFresh` için yeniden 10'dan başlar",{"key":181,"text":249},"Test runner, aynı nesnede bile her `[Fact]`'ten önce her instance alanını deklare edilmiş varsayılanına sıfırlar, constructor'ın ayarladığını geçersiz kılar",{"key":184,"text":251},"`SecondStartsFresh` sadece geçer çünkü `Assert.Equal(10, _count)`, canlı alan değerini değil `FirstIncrements` çalışmadan önce alınmış önbelleklenmiş bir anlık görüntüyü okur","xUnit her `[Fact]`\u002F`[Theory]` metodu için test sınıfının yeni bir instance'ını oluşturur — constructor, diğer framework'lerdeki `[SetUp]`\u002F`[BeforeEach]`'in yerini alan test-başına setup görevi görür. `FirstIncrements` ve `SecondStartsFresh` bu yüzden iki ayrı `CounterTests` nesnesi üzerinde çalışır, her biri kendi taze constructor çağrısını alır (`_count = 10`). Bir instance'daki `_count`'u mutasyona uğratmak diğer instance'ın alanını etkilemez.",{"fields":254,"seniorities":424,"interview_shapes":425,"locales":430,"oauth":432,"question_count":435,"coach_enabled":436,"jd_match_enabled":436},[255,266,286,303,327,340,359,378,398,405,411,418],{"key":5,"name_tr":6,"name_en":6,"sort":171,"specializations":256},[257,260,261,262,263,264,265],{"key":258,"name":259,"field":5},"general","Genel",{"key":154,"name":155,"field":5},{"key":166,"name":167,"field":5},{"key":157,"name":158,"field":5},{"key":150,"name":151,"field":5},{"key":160,"name":161,"field":5},{"key":163,"name":164,"field":5},{"key":267,"name_tr":268,"name_en":268,"sort":202,"specializations":269},"frontend","Frontend",[270,271,274,277,280,283],{"key":258,"name":259,"field":267},{"key":272,"name":273,"field":267},"javascript","JavaScript",{"key":275,"name":276,"field":267},"typescript","TypeScript",{"key":278,"name":279,"field":267},"react","React",{"key":281,"name":282,"field":267},"vue","Vue",{"key":284,"name":285,"field":267},"angular","Angular",{"key":287,"name_tr":288,"name_en":288,"sort":289,"specializations":290},"fullstack","Fullstack",3,[291,292,293,294,295,296,297,298,299,300,301,302],{"key":258,"name":259,"field":287},{"key":154,"name":155,"field":5},{"key":166,"name":167,"field":5},{"key":157,"name":158,"field":5},{"key":150,"name":151,"field":5},{"key":160,"name":161,"field":5},{"key":163,"name":164,"field":5},{"key":272,"name":273,"field":267},{"key":275,"name":276,"field":267},{"key":278,"name":279,"field":267},{"key":281,"name":282,"field":267},{"key":284,"name":285,"field":267},{"key":304,"name_tr":305,"name_en":305,"sort":306,"specializations":307},"devops-cloud","DevOps \u002F Cloud",4,[308,309,312,315,318,321,324],{"key":258,"name":259,"field":304},{"key":310,"name":311,"field":304},"aws","AWS",{"key":313,"name":314,"field":304},"gcp","GCP",{"key":316,"name":317,"field":304},"azure","Azure",{"key":319,"name":320,"field":304},"kubernetes","Kubernetes",{"key":322,"name":323,"field":304},"terraform","Terraform",{"key":325,"name":326,"field":304},"linux","Linux",{"key":328,"name_tr":329,"name_en":329,"sort":330,"specializations":331},"ai-engineer","AI Engineer",5,[332,333,334,337],{"key":258,"name":259,"field":328},{"key":166,"name":167,"field":328},{"key":335,"name":336,"field":328},"llm-rag","LLM\u002FRAG",{"key":338,"name":339,"field":328},"mlops","MLOps",{"key":341,"name_tr":342,"name_en":343,"sort":344,"specializations":345},"database","Veritabanı","Database",6,[346,347,350,353,356],{"key":258,"name":259,"field":341},{"key":348,"name":349,"field":341},"postgresql","PostgreSQL",{"key":351,"name":352,"field":341},"mysql","MySQL",{"key":354,"name":355,"field":341},"mongodb","MongoDB",{"key":357,"name":358,"field":341},"redis","Redis",{"key":360,"name_tr":361,"name_en":362,"sort":363,"specializations":364},"mobile","Mobil","Mobile",7,[365,366,369,372,375],{"key":258,"name":259,"field":360},{"key":367,"name":368,"field":360},"ios-swift","iOS (Swift)",{"key":370,"name":371,"field":360},"android-kotlin","Android (Kotlin)",{"key":373,"name":374,"field":360},"flutter","Flutter",{"key":376,"name":377,"field":360},"react-native","React Native",{"key":143,"name_tr":144,"name_en":379,"sort":380,"specializations":381},"Security",8,[382,383,386,389,392,395],{"key":258,"name":259,"field":143},{"key":384,"name":385,"field":143},"appsec","AppSec",{"key":387,"name":388,"field":143},"offensive-pentest","Offensive \u002F Pentest",{"key":390,"name":391,"field":143},"cloud-security","Cloud Security",{"key":393,"name":394,"field":143},"devsecops","DevSecOps",{"key":396,"name":397,"field":143},"blue-team-incident","Blue Team \u002F Incident",{"key":399,"name_tr":400,"name_en":401,"sort":402,"specializations":403},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[404],{"key":258,"name":259,"field":399},{"key":406,"name_tr":407,"name_en":407,"sort":408,"specializations":409},"data-engineer","Data Engineer",10,[410],{"key":258,"name":259,"field":406},{"key":412,"name_tr":413,"name_en":414,"sort":415,"specializations":416},"game-dev","Oyun Geliştirme","Game Development",11,[417],{"key":258,"name":259,"field":412},{"key":419,"name_tr":420,"name_en":420,"sort":421,"specializations":422},"ml-engineer","ML Engineer",12,[423],{"key":258,"name":259,"field":419},[14,15,16],{"junior":426,"mid":428,"senior":429},{"questions":427,"median_sec":3},20,{"questions":427,"median_sec":3},{"questions":427,"median_sec":3},[10,431],"en",[433,434],"google","github",21750,true]