ViraStack
  • Akademi
  • Hakkında
  • Destek
Genel BakışKaynaklarKatkı
ViraStack

Frontend ekosistemi: ücretsiz rehberler, proje şablonları, AI kuralları ve form bileşenleri.

Ürünler

  • ViraStack Start
  • ViraStack AI
  • ViraStack Mask
  • ViraStack Password
  • ViraStack Guide

Keşfet

  • Akademi
  • Hakkında
  • Marka
  • Destek

© 2026 ViraStack.

Açık kaynak · MIT

Playwright

06 / 10

Auth ve fixture

Hazır fixture'lar, test.extend ile kendi fixture'ınızı yazmak, Page Object'leri fixture olarak vermek, setup projesi ve storageState ile bir kez giriş yapmak, birden fazla rol, oturumsuz testler, veriyi değiştiren testleri izole etmek ve test kilitleri.

Fixture Nedir?

İlk testten beri async ({ page }) => … yazıyorsunuz. page bir fixture'dır: test başlamadan hazırlanan, test bitince temizlenen bir araç. Test yalnızca adını yazar; Playwright hazırlar.1

Hazır gelen fixture'lar:1

FixtureNe verir
pageBu teste özel, temiz bir sekme
contextpage'in ait olduğu tarayıcı bağlamı (cookie'ler, izinler)
browserTestler arasında paylaşılan tarayıcı
browserNamechromium, firefox ya da webkit
requestTarayıcısız HTTP istekleri için APIRequestContext

Fixture'lar beforeEach'ten iyidir çünkü yalnızca isteyen teste kurulur, hazırlık ve temizlik aynı yerde durur ve birbirine bağımlı olabilir.1

Kendi Fixture'ınız

test.extend yeni bir test fonksiyonu üretir. Her fixture bir fonksiyondur: hazırlar, use ile teste verir, use dönünce temizler.1

// tests/fixtures.ts
import { test as base } from "@playwright/test";
import { LoginPage } from "./pages/login-page";
import { OrdersPage } from "./pages/orders-page";

type Pages = {
  loginPage: LoginPage;
  ordersPage: OrdersPage;
};

export const test = base.extend<Pages>({
  loginPage: async ({ page }, use) => {
    await use(new LoginPage(page));
  },
  ordersPage: async ({ page }, use) => {
    await use(new OrdersPage(page));
  },
});

export { expect } from "@playwright/test";

Testler test'i artık bu dosyadan alır ve Page Object'ler parametrede hazır gelir (bkz. Page Object):

import { test, expect } from "./fixtures";

test("hatalı parola", async ({ loginPage }) => {
  await loginPage.goto();
  await loginPage.login("yonetici@example.com", "yanlis");
  await expect(loginPage.error).toHaveText("E-posta veya parola hatalı.");
});

Uyarı

Next.js projelerinin ESLint ayarı fixture'lardaki use(...) çağrısını React'in use hook'u sanıp react-hooks/rules-of-hooks hatası verir. Test klasörü için kuralı kapatın:

// eslint.config.mjs
{
  files: ["tests/**"],
  rules: { "react-hooks/rules-of-hooks": "off" },
},

use'dan sonraki kod temizliktir. Test başarısız olsa da çalışır. Sipariş oluşturan ve silen bir API'si olan uygulamada:

tempOrder: async ({ request }, use) => {
  const response = await request.post("/api/orders", { data: { customer: "Test" } });
  const order = await response.json();
  await use(order);
  await request.delete(`/api/orders/${order.id}`);
},

Bir fixture'ı bütün işçi süreci için bir kez kurmak isterseniz { scope: "worker" } verin. Örneğin her işçiye ayrı bir test hesabı açmak için. Testin kendisi hiç istemese de çalışması gereken fixture'lar için { auto: true } vardır.1

Her Testte Giriş Yapmamak

Oturum gerektiren her test giriş formunu doldurursa test paketi yavaşlar ve giriş sayfasındaki bir hata tüm testleri düşürür. Playwright'ın önerdiği yol: bir setup projesinde bir kez giriş yapmak, tarayıcı durumunu (cookie'ler ve localStorage) bir dosyaya kaydetmek ve diğer testleri bu durumla başlatmak.2

// tests/auth.setup.ts
import { expect, test as setup } from "./fixtures";

setup("yönetici olarak oturum aç", async ({ page, loginPage }) => {
  await loginPage.goto();
  await loginPage.login("yonetici@example.com");
  await expect(page).toHaveURL("/orders");
  await page.context().storageState({ path: "playwright/.auth/admin.json" });
});

toHaveURL önemlidir. Giriş sonrasında cookie yönlendirmeyle birlikte yazılır; adres değişmeden kaydederseniz boş bir durum saklarsınız.2

// playwright.config.ts
projects: [
  { name: "setup", testMatch: /.*\.setup\.ts/ },
  {
    name: "chromium",
    use: { ...devices["Desktop Chrome"], storageState: "playwright/.auth/admin.json" },
    dependencies: ["setup"],
  },
],

dependencies: ["setup"] setup projesinin her zaman önce çalışmasını sağlar. chromium projesindeki her test oturum açmış başlar.23

Hata

playwright/.auth/ içindeki dosyalar gerçek oturum cookie'leri taşır. Dokümanın uyarısı açıktır: bu dosyaları özel ya da açık hiçbir depoya göndermeyin. Klasörü .gitignore'a ekleyin; npm init playwright bunu sizin için yapar.2

Birden Fazla Rol

Uygulamanızda yönetici ve izleyici gibi roller varsa setup her biri için ayrı dosya yazar:2

// tests/auth.setup.ts
const accounts = [
  { email: "yonetici@example.com", file: "playwright/.auth/admin.json" },
  { email: "izleyici@example.com", file: "playwright/.auth/viewer.json" },
];

for (const { email, file } of accounts) {
  setup(`${email} ile oturum aç`, async ({ page, loginPage }) => {
    await loginPage.goto();
    await loginPage.login(email);
    await expect(page).toHaveURL("/orders");
    await page.context().storageState({ path: file });
  });
}

Varsayılan rol yapılandırmada kalır; başka bir rol isteyen dosya test.use ile değiştirir:

// tests/viewer.spec.ts
import { expect, test } from "./fixtures";

test.use({ storageState: "playwright/.auth/viewer.json" });

test("izleyici iptal düğmesini görmez", async ({ ordersPage }) => {
  await ordersPage.goto();
  await expect(ordersPage.table.getByRole("button", { name: "İptal et" })).toHaveCount(0);
});

Arayüzde butonun gizlenmesi yetki kontrolü değildir. Aynı testte sunucunun da reddettiğini doğrulayın. page.request sayfanın cookie'lerini kullanır:

test("izleyici API ile de iptal edemez", async ({ page }) => {
  const response = await page.request.post("/api/orders/SP-1001/cancel");
  expect(response.status()).toBe(403);
});

Oturumsuz Testler

Giriş sayfasını test eden dosya oturumla başlamamalı. Boş bir durum verin:2

test.use({ storageState: { cookies: [], origins: [] } });

Bunu sık kullanacaksanız fixtures.ts'ten signedOut adıyla export edin.

Veriyi Değiştiren Testler

Setup projesi bütün testlere aynı hesabı verir. Doküman bu yolu, testlerin aynı anda aynı hesapla çalışıp birbirini etkilemediği durumlar için önerir.2 Bir test siparişi iptal ederken başka bir test aynı anda "hazırlanan siparişleri" sayıyorsa, sonuç hangisinin önce bittiğine bağlıdır.

Martin Fowler bunu izolasyon eksikliği diye anlatır: her test bilinen bir başlangıç durumundan başlamalı ve hangi sırayla çalışırsa çalışsın geçmelidir.4 Seçenekler:

  1. Veriyi değiştiren test kendi oturumunu açar. Bu rehberin projesinde demo sunucu her oturuma siparişlerin ayrı bir kopyasını verir; iptal testi kendi girişini yapar ve diğer testler etkilenmez.

  2. Her işçiye ayrı hesap. Worker-scoped bir fixture workerInfo.workerIndex ile her işçiye kendi hesabını açar.2

  3. Test kendi verisini oluşturur. Testten önce API ile yeni bir sipariş oluşturup onu iptal edin; başkasının verisine dokunmayın.

// tests/cancel-order.spec.ts
import { expect, signedOut, test } from "./fixtures";

test.use({ storageState: signedOut });

test("yönetici hazırlanan siparişi iptal eder", async ({ loginPage, ordersPage }) => {
  await loginPage.goto();
  await loginPage.login("yonetici@example.com");

  await ordersPage.cancel("SP-1001");
  await expect(ordersPage.row("SP-1001")).toContainText("İptal edildi");
});

Test Kilitleri

Bazı kaynaklar gerçekten paylaşılır: tek bir dış servis, hesabın genel bir ayarı. Playwright 1.63 ile testlere adlandırılmış bir kilit verebilirsiniz. Aynı kilidi taşıyan testler dosya, işçi ve proje fark etmeksizin asla aynı anda çalışmaz; diğer testler paralel devam eder.5

test("bildirim ayarını kapatır", { lock: "account-settings" }, async ({ page }) => {
  // ...
});

Kilit, izolasyonun yerine geçmez. Önce testi bağımsız yapmayı deneyin; paylaşılan kaynak gerçekten tekse kilit kullanın.

Kendin Dene

  • Page Object'lerinizi test.extend ile fixture'a çevirin. Testlerden new satırlarını silin.

  • Setup projesi ekleyip yönetici oturumunu kaydedin. playwright/.auth/admin.json dosyasını açıp içinde ne olduğuna bakın.

  • İkinci bir rol ekleyin ve o rolde yalnızca arayüzü değil API'yi de test edin.

  • Veriyi değiştiren bir testi paylaşılan oturumla bırakıp --repeat-each=5 ile çalıştırın. Başka bir test düşüyor mu?

Detaylı Öğrenmek İçin

  • Resmi doküman: Playwright, "Fixtures"; worker kapsamı, otomatik fixture, seçenek fixture'ları ve sıralama.1

  • Resmi doküman: Playwright, "Authentication"; paylaşılan hesap, işçi başına hesap, API ile giriş ve birden fazla rol.2

  • Yazı: Martin Fowler, "Eradicating Non-Determinism in Tests"; testler arasında izolasyon.4

Kaynaklar

  • 1DokümanPlaywright: Fixtures

    Hazır fixture'lar, `test.extend`, temizlik, worker kapsamı ve otomatik fixture.

  • 2DokümanPlaywright: Authentication

    Setup projesi, `storageState`, güvenlik uyarısı, roller ve oturumsuz testler.

  • 3DokümanPlaywright: Projects

    Proje bağımlılıkları ve setup projesi.

  • 4MakaleMartin Fowler

    : — 14 Nisan 2011. İzolasyon eksikliği ve testin kendi başlangıç durumunu kurması.

  • 5DokümanPlaywright: Parallelism

    İşçi süreçleri ve test kilitleri.

Bu sayfayı düzenle

Son güncelleme tarihi: 22 Ekim 2026

Önceki adım05. Page ObjectSonraki adım07. API mock