[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:en: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 Automation","","sd-test-framework-design","Sd Test Framework Design","en",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,"In the simplest sense, what is a test framework responsible for that a plain scripting language on its own is not?",[90,93,96,99],{"key":91,"text":92},"a","Writing the production code that the tests will exercise",{"key":94,"text":95},"b","Discovering test cases, running them in a consistent way, and reporting pass\u002Ffail results",{"key":97,"text":98},"c","Deploying the application to a production server after tests pass, including provisioning new servers and rotating deployment credentials",{"key":100,"text":101},"d","Replacing the need for developers to write any assertions at all","A test framework's core job is discovery (finding test functions\u002Fclasses), execution (running them consistently with setup\u002Fteardown), and reporting (collecting and presenting pass\u002Ffail results) — that is (b). Frameworks do not write production code (a), do not handle deployment (c), and still require developers to write assertions themselves (d).",{"id":104,"topic":9,"difficulty":87,"body":105,"options":106,"correct_key":91,"explanation":115},"019fb4ec-2b57-72c2-8f1d-9d60f59bff89","What is the primary purpose of an assertion library within a test framework?",[107,109,111,113],{"key":91,"text":108},"To compare an actual value against an expected value and raise a clear failure when they do not match",{"key":94,"text":110},"To automatically retry a test until it passes",{"key":97,"text":112},"To generate random test data for every test run",{"key":100,"text":114},"To manage database connections used by integration tests, including opening connection pools and rotating credentials between test runs","An assertion library's job is to compare actual vs. expected values and, on mismatch, raise a failure with a clear message describing what went wrong — that is (a). Retrying tests (b), generating random data (c), and managing DB connections (d) are unrelated concerns handled by other parts of a test stack.",{"id":117,"topic":9,"difficulty":118,"body":119,"options":120,"correct_key":97,"explanation":129},"019fb4ec-2b59-7c0d-b4a1-eccb27ab53ce",2,"In pytest, a function decorated with `@pytest.fixture` named `db_connection` is requested by a test simply by adding `db_connection` as a parameter name to the test function. What mechanism makes this work?",[121,123,125,127],{"key":91,"text":122},"pytest scans the test file's imports and matches them alphabetically to fixture names",{"key":94,"text":124},"The test must call `db_connection()` manually inside its body for the fixture to run",{"key":97,"text":126},"pytest inspects the test function's parameter names and injects the matching fixture's return\u002Fyield value",{"key":100,"text":128},"Fixtures are only available if explicitly listed in a `conftest.py` `__all__` variable","pytest's fixture system works by dependency injection based on parameter names: it inspects a test function's signature, finds parameters that match registered fixture names, and injects each fixture's return (or yielded) value automatically — that is (c). There is no import-based matching (a), no manual call is required since pytest calls the fixture (b), and fixtures do not require an `__all__` listing in `conftest.py` (d).",{"id":131,"topic":9,"difficulty":118,"body":132,"options":133,"correct_key":100,"explanation":142},"019fb4ec-2b5b-7b44-9260-35ab919a8577","A team writes their own assertion helper `assertEqual(actual, expected)` that just does `if actual != expected: raise AssertionError()` with no message. Why is this a poor design for an assertion library?",[134,136,138,140],{"key":91,"text":135},"Because `!=` cannot compare two integers in any programming language, since comparison operators are only defined for strings and floating-point values",{"key":94,"text":137},"Because raising `AssertionError` is not supported by any test runner",{"key":97,"text":139},"Because it silently passes when the values are actually different",{"key":100,"text":141},"Because a failure gives no information about what the actual and expected values were, making debugging harder","A core value of a good assertion library is a diagnostic failure message that shows the actual and expected values so a developer can debug without adding print statements — an empty `AssertionError()` loses that information entirely, which is (d). Integer comparison with `!=` works fine (a), `AssertionError` is the standard exception most runners recognize (b), and the check correctly fails on a real mismatch (c).",{"id":144,"topic":9,"difficulty":118,"body":145,"options":146,"correct_key":91,"explanation":155},"019fb4ec-2b62-718b-bf72-65d9a74f35a3","In JUnit 5, what is the role of an `Extension` (e.g. a class implementing `BeforeEachCallback`)?",[147,149,151,153],{"key":91,"text":148},"It plugs custom behavior into the test lifecycle, such as running code before each test method, without modifying the test class itself",{"key":94,"text":150},"It replaces the need to write `@Test` annotations on any test method, because extensions automatically discover and register every method in a class as a runnable test case",{"key":97,"text":152},"It is only used to change the console color of test output",{"key":100,"text":154},"It compiles the test classes into bytecode before execution","JUnit 5's extension model lets you plug reusable behavior into the test lifecycle (before\u002Fafter each test, before\u002Fafter all, parameter resolution, etc.) by implementing extension interfaces, without touching the test class body itself — that is (a). Extensions do not remove the need for `@Test` (b), are not limited to console coloring (c), and play no role in bytecode compilation (d).",{"id":157,"topic":9,"difficulty":87,"body":158,"options":159,"correct_key":97,"explanation":168},"019fb4ec-2b64-760b-bec3-2b9bc285c9e6","What does a test runner's \"discovery\" phase typically do?",[160,162,164,166],{"key":91,"text":161},"It measures how long the previous test run took to execute, and automatically adjusts the timeout for the next run based on that historical duration",{"key":94,"text":163},"It fixes bugs found by failing tests automatically",{"key":97,"text":165},"It scans the codebase to find files, classes, or functions that match the framework's test-naming convention",{"key":100,"text":167},"It uploads test results to a cloud dashboard","Discovery is the phase where a runner walks the codebase looking for items matching its naming convention (e.g. files starting with `test_`, functions prefixed `test`, classes annotated `@Test`) so it knows what to execute — that is (c). Timing (a), auto-fixing bugs (b), and uploading to a dashboard (d) are separate, optional concerns outside discovery.",{"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":331,"name_en":6,"sort":332,"specializations":333},"QA \u002F Test Otomasyonu",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},[363,10],"tr",[365,366],"google","github",22650,true]