[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:qa-test-automation\u002Fsd-test-framework-design":4,"config":169},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":76,"samples":84},"qa-test-automation","QA \u002F Test Otomasyonu","","sd-test-framework-design","Sd Test Framework Design","tr",75,1500,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,58,61,64,67,70,73],{"key":19,"name":20,"count":11},"qa-api-testing","Qa Api Testing",{"key":22,"name":23,"count":11},"qa-automation-fundamentals","Qa Automation Fundamentals",{"key":25,"name":26,"count":11},"qa-ci-cd-testing","Qa Ci Cd Testing",{"key":28,"name":29,"count":11},"qa-defect-management","Qa Defect Management",{"key":31,"name":32,"count":11},"qa-exploratory-manual-testing","Qa Exploratory Manual Testing",{"key":34,"name":35,"count":11},"qa-performance-testing","Qa Performance Testing",{"key":37,"name":38,"count":11},"qa-test-case-design","Qa Test Case Design",{"key":40,"name":41,"count":11},"qa-test-strategy","Qa Test Strategy",{"key":43,"name":44,"count":11},"sd-ci-test-infrastructure","Sd Ci Test Infrastructure",{"key":46,"name":47,"count":11},"sd-code-quality-test-code","Sd Code Quality Test Code",{"key":49,"name":50,"count":11},"sd-contract-testing","Sd Contract Testing",{"key":52,"name":53,"count":11},"sd-test-data-management","Sd Test Data Management",{"key":55,"name":56,"count":11},"sd-test-doubles-mocking","Sd Test Doubles Mocking",{"key":8,"name":9,"count":11},{"key":59,"name":60,"count":11},"ta-cross-browser-parallel-execution","Ta Cross Browser Parallel Execution",{"key":62,"name":63,"count":11},"ta-framework-architecture-patterns","Ta Framework Architecture Patterns",{"key":65,"name":66,"count":11},"ta-locators-selectors-strategy","Ta Locators Selectors Strategy",{"key":68,"name":69,"count":11},"ta-selenium-cypress-playwright-tradeoffs","Ta Selenium Cypress Playwright Tradeoffs",{"key":71,"name":72,"count":11},"ta-synchronization-flaky-tests","Ta Synchronization Flaky Tests",{"key":74,"name":75,"count":11},"ta-visual-regression-reporting","Ta Visual Regression Reporting",[77,81],{"key":78,"name":79,"count":80},"sdet","SDET",450,{"key":82,"name":83,"count":80},"test-automation","Test Automation",[85,103,116,130,143,156],{"id":86,"topic":9,"difficulty":87,"body":88,"options":89,"correct_key":94,"explanation":102},"019fb4ec-2b55-76d5-91dd-91acd944d79b",1,"En basit anlamda, düz bir betik dilinin tek başına yapamayacağı, bir test framework'ünün sorumlu olduğu şey nedir?",[90,93,96,99],{"key":91,"text":92},"a","Testlerin çalıştıracağı production kodunu yazmak",{"key":94,"text":95},"b","Test case'leri keşfetmek, onları tutarlı bir şekilde çalıştırmak ve pass\u002Ffail sonuçlarını raporlamak",{"key":97,"text":98},"c","Testler geçtikten sonra uygulamayı bir production sunucusuna deploy etmek, yeni sunucuları hazırlamak ve deployment kimlik bilgilerini döndürmek dahil",{"key":100,"text":101},"d","Geliştiricilerin herhangi bir assertion yazmasına gerek bırakmamak","Bir test framework'ünün temel işi keşif (test fonksiyonlarını\u002Fsınıflarını bulmak), çalıştırma (setup\u002Fteardown ile tutarlı biçimde çalıştırmak) ve raporlamadır (pass\u002Ffail sonuçlarını toplayıp sunmak) — bu (b). Framework'ler production kodu yazmaz (a), deployment ile ilgilenmez (c), ve geliştiricilerin yine de kendi assertion'larını yazmasını gerektirir (d).",{"id":104,"topic":9,"difficulty":87,"body":105,"options":106,"correct_key":91,"explanation":115},"019fb4ec-2b57-72c2-8f1d-9d60f59bff89","Bir test framework'ü içindeki assertion library'sinin temel amacı nedir?",[107,109,111,113],{"key":91,"text":108},"Gerçek bir değeri beklenen bir değerle karşılaştırmak ve eşleşmediklerinde net bir hata fırlatmak",{"key":94,"text":110},"Bir testi geçene kadar otomatik olarak yeniden denemek",{"key":97,"text":112},"Her test çalıştırması için rastgele test verisi üretmek",{"key":100,"text":114},"Entegrasyon testlerinin kullandığı veritabanı bağlantılarını yönetmek, bağlantı havuzlarını açmak ve test çalıştırmaları arasında kimlik bilgilerini döndürmek dahil","Assertion library'sinin işi gerçek değeri beklenen değerle karşılaştırmak ve eşleşmediğinde neyin yanlış gittiğini açıkça anlatan bir hata fırlatmaktır — bu (a). Testleri yeniden deneme (b), rastgele veri üretme (c) ve DB bağlantısı yönetimi (d) bir test yığınının başka parçalarının işidir.",{"id":117,"topic":9,"difficulty":118,"body":119,"options":120,"correct_key":97,"explanation":129},"019fb4ec-2b59-7c0d-b4a1-eccb27ab53ce",2,"pytest'te, `db_connection` adında `@pytest.fixture` ile dekore edilmiş bir fonksiyon, bir test tarafından sadece test fonksiyonuna `db_connection` adında bir parametre eklenerek istenir. Bunu çalıştıran mekanizma nedir?",[121,123,125,127],{"key":91,"text":122},"pytest test dosyasının import'larını tarar ve bunları fixture adlarıyla alfabetik eşleştirir",{"key":94,"text":124},"Fixture'ın çalışması için testin gövdesinde `db_connection()` fonksiyonunu manuel çağırması gerekir",{"key":97,"text":126},"pytest test fonksiyonunun parametre adlarını inceler ve eşleşen fixture'ın return\u002Fyield değerini enjekte eder",{"key":100,"text":128},"Fixture'lar sadece `conftest.py` içindeki bir `__all__` değişkeninde açıkça listelenmişse kullanılabilir","pytest'in fixture sistemi parametre adlarına dayalı dependency injection ile çalışır: bir test fonksiyonunun imzasını inceler, kayıtlı fixture adlarıyla eşleşen parametreleri bulur ve her fixture'ın return (veya yield edilen) değerini otomatik enjekte eder — bu (c). Import'a dayalı bir eşleştirme yoktur (a), pytest fixture'ı kendisi çağırdığı için manuel çağrı gerekmez (b), ve fixture'lar `conftest.py`'de bir `__all__` listesi gerektirmez (d).",{"id":131,"topic":9,"difficulty":118,"body":132,"options":133,"correct_key":100,"explanation":142},"019fb4ec-2b5b-7b44-9260-35ab919a8577","Bir takım, sadece `if actual != expected: raise AssertionError()` yapan, mesajsız kendi `assertEqual(actual, expected)` assertion yardımcısını yazıyor. Bu neden zayıf bir assertion library tasarımıdır?",[134,136,138,140],{"key":91,"text":135},"Çünkü `!=` hiçbir programlama dilinde iki tamsayıyı karşılaştıramaz, çünkü karşılaştırma operatörleri sadece string'ler ve kayan noktalı değerler için tanımlıdır",{"key":94,"text":137},"Çünkü `AssertionError` fırlatmak hiçbir test runner tarafından desteklenmez",{"key":97,"text":139},"Çünkü değerler gerçekten farklı olduğunda sessizce geçer",{"key":100,"text":141},"Çünkü bir hata, gerçek ve beklenen değerlerin ne olduğu hakkında hiçbir bilgi vermez, bu da debug'ı zorlaştırır","İyi bir assertion library'sinin temel değerlerinden biri, geliştiricinin print ifadesi eklemeden debug edebilmesi için gerçek ve beklenen değerleri gösteren tanısal bir hata mesajıdır — boş bir `AssertionError()` bu bilgiyi tamamen kaybeder, bu (d). Tamsayı karşılaştırmasında `!=` düzgün çalışır (a), `AssertionError` çoğu runner'ın tanıdığı standart istisnadır (b), ve kontrol gerçek bir uyuşmazlıkta doğru şekilde başarısız olur (c).",{"id":144,"topic":9,"difficulty":118,"body":145,"options":146,"correct_key":91,"explanation":155},"019fb4ec-2b62-718b-bf72-65d9a74f35a3","JUnit 5'te bir `Extension`'ın (örn. `BeforeEachCallback` uygulayan bir sınıfın) rolü nedir?",[147,149,151,153],{"key":91,"text":148},"Test sınıfının kendisini değiştirmeden, her test metodundan önce kod çalıştırmak gibi özel davranışı test yaşam döngüsüne eklemek",{"key":94,"text":150},"Herhangi bir test metodunda `@Test` annotation'ı yazma gereğini ortadan kaldırmak, çünkü extension'lar bir sınıftaki her metodu otomatik olarak keşfedip çalıştırılabilir bir test case olarak kaydeder",{"key":97,"text":152},"Sadece test çıktısının konsol rengini değiştirmek için kullanılır",{"key":100,"text":154},"Test sınıflarını çalıştırmadan önce bytecode'a derlemek","JUnit 5'in extension modeli, extension arayüzlerini uygulayarak test sınıfının gövdesine dokunmadan yeniden kullanılabilir davranışı (her testten önce\u002Fsonra, tüm testlerden önce\u002Fsonra, parametre çözümleme vb.) test yaşam döngüsüne eklemenizi sağlar — bu (a). Extension'lar `@Test` gerekliliğini kaldırmaz (b), sadece konsol rengiyle sınırlı değildir (c), ve bytecode derlemesinde rolü yoktur (d).",{"id":157,"topic":9,"difficulty":87,"body":158,"options":159,"correct_key":97,"explanation":168},"019fb4ec-2b64-760b-bec3-2b9bc285c9e6","Bir test runner'ının \"discovery\" (keşif) aşaması tipik olarak ne yapar?",[160,162,164,166],{"key":91,"text":161},"Önceki test çalıştırmasının ne kadar sürdüğünü ölçer ve bu geçmiş süreye dayanarak bir sonraki çalıştırma için timeout'u otomatik ayarlar",{"key":94,"text":163},"Başarısız testlerin bulduğu bug'ları otomatik olarak düzeltir",{"key":97,"text":165},"Kod tabanını tarayarak framework'ün test-adlandırma kuralına uyan dosyaları, sınıfları veya fonksiyonları bulur",{"key":100,"text":167},"Test sonuçlarını bir bulut dashboard'ına yükler","Discovery, bir runner'ın ne çalıştıracağını bilmek için kod tabanını adlandırma kuralına (örn. `test_` ile başlayan dosyalar, `test` önekli fonksiyonlar, `@Test` işaretli sınıflar) uyan öğeler için taradığı aşamadır — bu (c). Zamanlama (a), bug'ları otomatik düzeltme (b) ve dashboard'a yükleme (d) discovery'nin dışında ayrı, opsiyonel konulardır.",{"fields":170,"seniorities":356,"interview_shapes":357,"locales":362,"oauth":364,"question_count":367,"coach_enabled":368,"jd_match_enabled":368},[171,196,216,233,257,270,289,308,330,337,343,350],{"key":172,"name_tr":173,"name_en":173,"sort":87,"specializations":174},"backend","Backend",[175,178,181,184,187,190,193],{"key":176,"name":177,"field":172},"general","Genel",{"key":179,"name":180,"field":172},"go","Go",{"key":182,"name":183,"field":172},"python","Python",{"key":185,"name":186,"field":172},"java","Java",{"key":188,"name":189,"field":172},"csharp","C#\u002F.NET",{"key":191,"name":192,"field":172},"nodejs","Node.js",{"key":194,"name":195,"field":172},"php","PHP",{"key":197,"name_tr":198,"name_en":198,"sort":118,"specializations":199},"frontend","Frontend",[200,201,204,207,210,213],{"key":176,"name":177,"field":197},{"key":202,"name":203,"field":197},"javascript","JavaScript",{"key":205,"name":206,"field":197},"typescript","TypeScript",{"key":208,"name":209,"field":197},"react","React",{"key":211,"name":212,"field":197},"vue","Vue",{"key":214,"name":215,"field":197},"angular","Angular",{"key":217,"name_tr":218,"name_en":218,"sort":219,"specializations":220},"fullstack","Fullstack",3,[221,222,223,224,225,226,227,228,229,230,231,232],{"key":176,"name":177,"field":217},{"key":179,"name":180,"field":172},{"key":182,"name":183,"field":172},{"key":185,"name":186,"field":172},{"key":188,"name":189,"field":172},{"key":191,"name":192,"field":172},{"key":194,"name":195,"field":172},{"key":202,"name":203,"field":197},{"key":205,"name":206,"field":197},{"key":208,"name":209,"field":197},{"key":211,"name":212,"field":197},{"key":214,"name":215,"field":197},{"key":234,"name_tr":235,"name_en":235,"sort":236,"specializations":237},"devops-cloud","DevOps \u002F Cloud",4,[238,239,242,245,248,251,254],{"key":176,"name":177,"field":234},{"key":240,"name":241,"field":234},"aws","AWS",{"key":243,"name":244,"field":234},"gcp","GCP",{"key":246,"name":247,"field":234},"azure","Azure",{"key":249,"name":250,"field":234},"kubernetes","Kubernetes",{"key":252,"name":253,"field":234},"terraform","Terraform",{"key":255,"name":256,"field":234},"linux","Linux",{"key":258,"name_tr":259,"name_en":259,"sort":260,"specializations":261},"ai-engineer","AI Engineer",5,[262,263,264,267],{"key":176,"name":177,"field":258},{"key":182,"name":183,"field":258},{"key":265,"name":266,"field":258},"llm-rag","LLM\u002FRAG",{"key":268,"name":269,"field":258},"mlops","MLOps",{"key":271,"name_tr":272,"name_en":273,"sort":274,"specializations":275},"database","Veritabanı","Database",6,[276,277,280,283,286],{"key":176,"name":177,"field":271},{"key":278,"name":279,"field":271},"postgresql","PostgreSQL",{"key":281,"name":282,"field":271},"mysql","MySQL",{"key":284,"name":285,"field":271},"mongodb","MongoDB",{"key":287,"name":288,"field":271},"redis","Redis",{"key":290,"name_tr":291,"name_en":292,"sort":293,"specializations":294},"mobile","Mobil","Mobile",7,[295,296,299,302,305],{"key":176,"name":177,"field":290},{"key":297,"name":298,"field":290},"ios-swift","iOS (Swift)",{"key":300,"name":301,"field":290},"android-kotlin","Android (Kotlin)",{"key":303,"name":304,"field":290},"flutter","Flutter",{"key":306,"name":307,"field":290},"react-native","React Native",{"key":309,"name_tr":310,"name_en":311,"sort":312,"specializations":313},"security","Güvenlik","Security",8,[314,315,318,321,324,327],{"key":176,"name":177,"field":309},{"key":316,"name":317,"field":309},"appsec","AppSec",{"key":319,"name":320,"field":309},"offensive-pentest","Offensive \u002F Pentest",{"key":322,"name":323,"field":309},"cloud-security","Cloud Security",{"key":325,"name":326,"field":309},"devsecops","DevSecOps",{"key":328,"name":329,"field":309},"blue-team-incident","Blue Team \u002F Incident",{"key":5,"name_tr":6,"name_en":331,"sort":332,"specializations":333},"QA \u002F Test Automation",9,[334,335,336],{"key":176,"name":177,"field":5},{"key":82,"name":83,"field":5},{"key":78,"name":79,"field":5},{"key":338,"name_tr":339,"name_en":339,"sort":340,"specializations":341},"data-engineer","Data Engineer",10,[342],{"key":176,"name":177,"field":338},{"key":344,"name_tr":345,"name_en":346,"sort":347,"specializations":348},"game-dev","Oyun Geliştirme","Game Development",11,[349],{"key":176,"name":177,"field":344},{"key":351,"name_tr":352,"name_en":352,"sort":353,"specializations":354},"ml-engineer","ML Engineer",12,[355],{"key":176,"name":177,"field":351},[14,15,16],{"junior":358,"mid":360,"senior":361},{"questions":359,"median_sec":3},20,{"questions":359,"median_sec":3},{"questions":359,"median_sec":3},[10,363],"en",[365,366],"google","github",22650,true]