QA ve Test Otomasyonu Öğrenme Platformu

Selenium, Playwright, Java, Python, SQL, API testi ve DevOps araçlarını uygulamalı derslerle, quizlerle ve mülakat sorularıyla öğren.

⚡ Mülakat Isınma Turu

12 farklı konudan karışık gerçek mülakat soruları — cevabı görmeden önce bir saniye düşün.

Bu bölüm neye yarar, neye yaramaz? Burası sadece hızlı bir nabız ölçümü; asıl mülakat pratiği ve AI değerlendirmesi her dersin sonundaki mülakat sekmesinde.

Bir web formunu test ediyorsunuz ve testiniz bazen "NoSuchElementException" veriyor ama sayfayı elle açtığınızda her şey normal görünüyor. Nedeni ne olabilir?

Bu hatanın en yaygın sebebi timing (zamanlama) sorunudur. Sayfa görsel olarak hazır görünse bile DOM elementleri JavaScript tarafından sonradan ekleniyor olabilir. Çözüm: Thread.sleep() yerine WebDriverWait + ExpectedConditions.visibilityOfElementLocated() veya elementToBeClickable() kullanın. Java'da FluentWait ile polling interval da belirleyebilirsiniz. Ikinci olası sebep iframe: element bir iframe içindeyse önce driver.switchTo().frame() yapılmalıdır. Üçüncü sebep: farklı ağ hızları — CI/CD ortamında lokal makineden daha yavaş olabilir, timeout süresini artırın.

Selenium

Page Object Model (POM) Playwright'ta nasıl uygulanır?

Her sayfa için class, constructor'a Page: class LoginPage { constructor(page) { this.emailInput = page.locator("[data-qa='login-email']"); } async login(e, p) { await this.emailInput.fill(e); } }. Test'te: const lp = new LoginPage(page); await lp.login(). Java POM ile birebir aynıdır.

Playwright

Cypress'in mimarisi (aynı browser process içinde çalışması) Selenium/Playwright'tan nasıl farklı, avantaj/dezavantajları nedir?

Cypress, test kodunu doğrudan tarayıcının JavaScript run-loop'unda çalıştırır; Selenium ve Playwright ise ayrı bir process'ten tarayıcıyı "uzaktan" yönetir. Avantaj: network gecikmesi yok, DOM'a doğrudan erişim, time-travel debugging. Dezavantaj: sadece JavaScript/TypeScript, tek sekme sınırı, aynı origin kısıtlaması. Java/Selenium dünyasında alışık olduğun "tam izolasyon" Cypress'te yoktur.

Cypress

Maven'da BUILD FAILURE görüyorsun — ilk hangi adımı atarsın ve neden?

İlk iş terminal çıktısında "Tests run: X, Failures: Y, Errors: Z" satırını bulmak. Failures sayısı > 0 ise assertion hatası var demektir; yani test çalıştı ama beklenen değerle gerçek değer uyuşmadı. Errors > 0 ise test başlamadan önce bir setup problemi var (örn. driver başlatılamadı, dosya bulunamadı). Surefire-reports klasöründeki XML ya da TXT dosyaları her test için ayrı yığın izini içerir; asıl kök nedeni oradan okursun. CI ortamında bu klasörü artifact olarak sakla ki daha sonra analiz edebilelim.

Java

Python'da *args ve **kwargs ne işe yarar?

*args, belirsiz sayıda pozisyonel argüman alır — tuple olarak gelir. **kwargs, belirsiz sayıda keyword argüman alır — dict olarak gelir. def log(*args, **kwargs) hem log("msg1", "msg2") hem de log(level="INFO", test="login") çağrılarını kabul eder.

Python

Soru 36: COALESCE ve NULLIF fonksiyonları arasındaki fark nedir?

`COALESCE(val1, val2, ...)` verilen parametreler arasından NULL olmayan ilk değeri döndürür (varsayılan değer sağlamak için kullanılır). `NULLIF(val1, val2)` ise iki değer birbirine eşitse NULL, eşit değilse ilk değeri döndürür (bölme işlemlerinde sıfıra bölme hatasını önlemek için kullanılır).

SQL

var, let ve const arasındaki farklar nelerdir? Hangisini ne zaman tercih etmeliyiz?

`var` fonksiyon kapsamlıdır (function scope) ve yukarı çekildiğinde (hoisting) `undefined` değeri alır. `let` ve `const` ise blok kapsamlıdır (block scope) ve tanımlanmadan önce erişilmeye çalışıldığında hata verir. `const` tanımlandıktan sonra yeniden atanamaz (read-only), `let` ise yeniden atanabilir. Modern JavaScript'te `var` kullanımı sızıntılara yol açtığı için önerilmez; varsayılan olarak `const`, değeri değişecekse `let` kullanılmalıdır.

JavaScript

TypeScript'te tuple ne zaman kullanılmalı?

Sabit sayıda eleman ve her pozisyonun tipi farklı olduğunda. Örneğin: [string, number, boolean] — name, age, active gibi. Genellikle fonksiyon dönüş değerleri için kullanılır: function useState<T>(init: T): [T, (v: T) => void]. Nesne daha okunabilirse, tuple yerine obje tercih et.

TypeScript

500 Selenium testi için Docker kullanarak paralel test çalıştırma kurulumunu nasıl tasarlarsın?

Docker Compose'da Selenium Grid kullan: selenium-hub + birden fazla selenium/node-chrome container. Her Chrome node 4-6 paralel session yönetir. 500 test için: 3 Chrome node × 5 session = 15 paralel test = sıralı 2 saat yerine ~10 dakika. CI sunucu kapasitesine göre Chrome node'larını ölçeklendir: docker compose scale chrome=5. pytest-xdist ile --dist=loadscope kullan. Her node temiz bir browser session alır. Sonuçları kalıcı tutmak için reports dizinini mount et. Testler başlamadan önce node'ların hazır olduğundan emin olmak için healthcheck ekle.

Docker

Jenkins nedir ve yazılım geliştirmede neden kullanılır?

Jenkins, Java ile yazılmış açık kaynaklı bir CI/CD otomasyon sunucusudur. Her developer kod push'ladığında Jenkins otomatik olarak build eder, test eder ve opsiyonel olarak deploy eder. Hataları commit'ten dakikalar içinde yakalar, manuel işi azaltır ve her değişiklikte tutarlı kalite sağlar. QA'da Jenkins, test suite'lerimizin yaşadığı ve çalıştığı yerdir — her commit Selenium, pytest veya Playwright testlerimizi otomatik olarak tetikler.

Jenkins

PR açmadan önce kendi branch’ini main ile güncellemek için hangi akışı tercih edersin?

Önce `git fetch origin` çalıştırır, sonra ekip standardına göre `git merge origin/main` veya `git rebase origin/main` kullanırım. Paylaşılmış branch’te rebase yapacaksam çok dikkat ederim çünkü commit hash’leri değişir. Java’da dependency update öncesi testleri çalıştırmak gibi, branch güncellemeden sonra test suite’i tekrar koştururum.

Git & GitHub

Postman'da data-driven API testi nasıl uygulanır?

Data-driven test, her satırın ayrı bir test iterasyonu olduğu harici CSV veya JSON dosyası kullanır. CSV oluştur: email,password,expectedStatus\nayse@test.com,dogru_sifre,200\nyanlish@test.com,kotu_sifre,401. Test scriptlerinde: pm.iterationData.get("expectedStatus"). Collection Runner ile (GUI) CSV dosyasını yükle. Newman CLI ile: newman run collection.json --iteration-data data.csv. 100 ayrı istek olmadan 100 giriş senaryosunu test eder — sınır değer testi ve denklik bölümleme için zorunlu.

Postman

Yeni katıldığın takımda bug'lar bazen Jira'ya, bazen Slack'e yazılıyor. Takım lideri sana "sen ne önerirsin" diyor. Ne cevap verirsin ve önerini neye dayandırırsın?

Tek kayıt yerinin Jira olması gerektiğini, Slack'in ise yalnızca haber verme kanalı olarak kalmasını öneririm. Gerekçem üç somut kayıptır: Slack'te yazılan bug aranamaz (üç ay sonra aynı hata döndüğünde hiçbir bağlam bulunmaz), ölçülemez (kaç bug hangi modülden çıktı sorusu cevapsız kalır) ve bağlanamaz (commit ile kayıt arasında iz kalmaz). Öneriyi dayatma olarak değil, bir ay sonra ölçülebilir bir sonuçla getiririm: Slack'te kalan bug'ların ne kadarının kaybolduğunu göstermek, kuralın kendisinden daha ikna edicidir. Geçiş için de düşük sürtünmeli bir yol öneririm — Slack'ten tek tıkla issue oluşturan bir entegrasyon, insanları alışkanlıklarını değiştirmeye zorlamadan kaydı yerine taşır.

/jira