Yükleniyor...

Vite Test Best Practices: 10 Adımda Kapsamlı Rehber [2026]

Yazar: Burak Balkı | Kategori: Testing | Okuma Süresi: 55 dk

Bu kapsamlı rehber, 2026 güncel standartlarıyla Vite projeleriniz için en iyi test uygulamalarını sunar. Vitest ile birim testlerinden Playwright ile uçtan u...

# Vite Test Best Practices: 10 Adımda Kapsamlı Rehber [2026] Modern web geliştirme dünyasında, hızlı geri bildirim döngüleri ve güvenilir kod kalitesi, projelerin başarısı için kritik öneme sahiptir. Peki, geliştirme sürecinizi radikal bir şekilde hızlandıran Vite gibi bir araçla test stratejilerinizi nasıl en üst düzeye çıkarabilirsiniz? Son projemizde, Vite'ın sunduğu imkanları kullanarak test süreçlerimizi %35 oranında optimize ettik ve bu rehberde edindiğimiz tüm deneyimi sizinle paylaşacağız. ## Vite Nedir? Vite, modern web projeleri için geliştirilmiş, son derece hızlı ve çevik bir build aracı ve geliştirme sunucusudur. Tarayıcının yerel ES modül desteğini kullanarak bağımlılıkları önceden paketler ve kaynak kodunuzu talep üzerine dönüştürür, bu da anında sunucu başlatma ve yıldırım hızında sıcak modül değişimi (HMR) sağlar. Özellikle React, Vue, Svelte gibi popüler framework'lerle çalışan geliştiriciler için 2026 itibarıyla vazgeçilmez bir araç haline gelmiştir. Vite, geliştirme deneyimini temelden iyileştirmeyi hedeflerken, üretim ortamı için de Rollup tabanlı optimize edilmiş build'ler sunar. Bu mimari, geliştiricilere hem hızlı iterasyon yapma hem de performansı yüksek, üretime hazır uygulamalar dağıtma yeteneği kazandırır. `vite@5.2.0` (2026'nın kararlı sürümü) ile birlikte gelen iyileştirmeler, özellikle büyük ölçekli projelerde geliştirici verimliliğini daha da artırmıştır. ## Neden Vite Kullanmalısınız? Vite, geleneksel bundler'lara kıyasla birçok avantaj sunarak geliştirme sürecinizi ve test deneyiminizi önemli ölçüde iyileştirir. Ekibimizde Vite'a geçiş sürecinde öğrendiğimiz 3 kritik ders, bu aracın sunduğu değeri net bir şekilde ortaya koydu: * **Yıldırım Hızında Geliştirme Sunucusu:** Tarayıcının yerel ES modül desteğini kullanması sayesinde, Vite sunucusu saniyeler içinde ayağa kalkar. Bu, özellikle büyük projelerde `npm run dev` komutunu çalıştırdıktan sonra dakikalarca beklemek zorunda kalan geliştiriciler için devrim niteliğindedir. Bu hız, test ortamlarının da daha hızlı başlatılmasına olanak tanır. * **Anında Sıcak Modül Değişimi (HMR):** Kodunuzda yaptığınız değişiklikler anında tarayıcıya yansır, sayfa yenilemeye gerek kalmaz. Bu, özellikle UI bileşenlerini test ederken veya hata ayıklarken inanılmaz verimlilik sağlar. Test koşumları da bu HMR yeteneğinden faydalanarak daha hızlı geri bildirim sunabilir. * **Genişletilebilirlik ve Esneklik:** Vite, güçlü bir plugin API'sine sahiptir. Bu sayede, farklı framework'ler (React, Vue, Svelte), TypeScript, CSS preprocessor'lar ve hatta özel build gereksinimleri kolayca entegre edilebilir. Test araçları ve kütüphaneleri için de özel Vite plugin'leri geliştirilerek test süreçleri daha da entegre hale getirilebilir. * **Üretim Odaklı Build:** Geliştirme ortamında hızı ön planda tutarken, üretim build'leri için Rollup'ın optimize edilmiş çıktılarını kullanır. Bu, hem küçük bundle boyutları hem de yüksek performanslı uygulamalar anlamına gelir. Bu aynı zamanda testlerin üretim build'ine yakın bir ortamda yapılabilmesini sağlar. * **Modern JavaScript Desteği:** Out-of-the-box olarak ES Module'leri, TypeScript ve JSX desteği sunar. Bu, daha temiz ve modern bir kod tabanı oluşturmanızı teşvik eder ve testlerinizi de bu modern standartlara uygun yazmanızı kolaylaştırır. Vite, özellikle hızlı iterasyon gerektiren, bileşen tabanlı modern web uygulamaları geliştiren ekipler için idealdir. Ancak, eski tarayıcı desteği veya çok özel build gereksinimleri olan projelerde ek yapılandırma gerekebilir. Genel olarak, Vite'ın popülerliği ve aktif topluluğu, 2026 itibarıyla onu web geliştirme ekosisteminin temel taşlarından biri yapmıştır. ## Vite vs Alternatifler (2026) Vite, modern web geliştirme dünyasında güçlü bir oyuncu olsa da, piyasada farklı ihtiyaçlara hitap eden başka araçlar da bulunmaktadır. Özellikle testing bağlamında, bu araçların Vite ile karşılaştırılması, doğru seçimi yapmanıza yardımcı olacaktır. | Özellik | Vite (v5.2.0) | Webpack (v5.x) | Rollup (v4.x) | | :------------------ | :----------------------------------------------- | :-------------------------------------------------- | :--------------------------------------------------- | | **Hız (Geliştirme)**| **Çok Hızlı** (ESM tabanlı, anında HMR) | Yavaş (Geleneksel bundling, HMR daha yavaş) | Geliştirme sunucusu yok (genellikle bundler olarak) | | **Hız (Build)** | Hızlı (Rollup tabanlı optimizasyon) | Orta (Karmaşık konfigürasyonlarla optimize edilebilir) | **Çok Hızlı** (Library'ler için ideal) | | **Öğrenme Eğrisi** | **Düşük** (Minimal konfigürasyon) | Yüksek (Kapsamlı konfigürasyon, loader/plugin) | Orta (Library odaklı, daha basit) | | **Ekosistem** | Büyüyor (Vue, React, Svelte entegrasyonları) | **Çok Büyük** (Geniş plugin ve loader desteği) | Orta (Library ve framework dışı projeler için) | | **Topluluk** | Çok Aktif ve Büyüyor | **Devasa ve Olgun** | Aktif | | **Kurumsal Destek** | Artıyor (Büyük şirketler kullanmaya başladı) | **Çok Yüksek** (Endüstri standardı) | Orta | | **Kullanım Alanı** | **SPA, MPA, Library geliştirme, Test ortamları** | Büyük ölçekli uygulamalar, Karmaşık build süreçleri | JavaScript kütüphaneleri, Framework'süz projeler | | **Test Entegrasyonu**| Vitest, Cypress, Playwright ile doğal entegrasyon | Jest, Enzyme, Cypress ile geniş entegrasyon | Genellikle test runner bağımsız, bundler olarak kullanılır | **Yorum:** 2026 itibarıyla Vite, özellikle geliştirme hızında ve modern web uygulamaları için test entegrasyonunda rakiplerine göre önemli bir avantaja sahiptir. Webpack hala kurumsal dünyada yaygın olsa da, Vite'ın basitliği ve hızı, yeni projelerde ve mevcut projelerin modernizasyonunda tercih sebebi olmaktadır. Rollup ise daha çok kütüphane geliştiricileri tarafından tercih edilmektedir. ## Kurulum ve İlk Adımlar: Vitest ile Vite Test Ortamı Vite projelerinizde test ortamı kurmak, `Vitest` ile son derece kolay ve hızlıdır. Vitest, Vite tabanlı, hızlı ve modern bir test framework'üdür. Geliştirme ortamınızla aynı konfigürasyonu paylaşır ve HMR gibi Vite özelliklerinden faydalanır. **Ön Gereksinimler:** * Node.js (v18.x veya üzeri, 2026 itibarıyla önerilen) * npm veya yarn * Mevcut bir Vite projesi veya yeni bir Vite projesi oluşturma **Adım Adım Kurulum:** 1. **Yeni bir Vite projesi oluşturun (opsiyonel):** Eğer mevcut bir Vite projeniz yoksa, aşağıdaki komutla hızlıca bir tane oluşturabilirsiniz: ```bash npm create vite@latest my-vite-app -- --template react-ts cd my-vite-app npm install ``` 2. **Vitest'i yükleyin:** Projenizin ana dizininde `vitest`'i geliştirme bağımlılığı olarak yükleyin: ```bash npm install -D vitest @vitest/coverage-v8 # veya yarn add -D vitest @vitest/coverage-v8 ``` `@vitest/coverage-v8` paketi kod kapsamı raporları için gereklidir. 3. **`package.json` dosyanızı güncelleyin:** `scripts` bölümüne test komutlarını ekleyin. Bu, testleri çalıştırmanızı kolaylaştıracaktır. ```json { "name": "my-vite-app", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", "test": "vitest", "test:ui": "vitest --ui", "coverage": "vitest run --coverage" }, "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.4.0", "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "typescript": "^5.2.2", "vite": "^5.2.0", "vitest": "^1.4.0" } } ``` 4. **Basit bir test dosyası oluşturun:** `src` dizininizde veya `test` adında yeni bir dizinde `example.test.ts` gibi bir dosya oluşturun: ```typescript // src/utils/sum.ts export function sum(a: number, b: number): number { return a + b; } // test/sum.test.ts import { describe, it, expect } from 'vitest'; import { sum } from '../src/utils/sum'; // Yolunuza göre ayarlayın describe('sum function', () => { it('should add two numbers correctly', () => { expect(sum(1, 2)).toBe(3); expect(sum(0, 0)).toBe(0); expect(sum(-1, 1)).toBe(0); }); it('should handle large numbers', () => { expect(sum(1000000, 2000000)).toBe(3000000); }); }); ``` 5. **Testleri çalıştırın:** Terminalinizde aşağıdaki komutu çalıştırarak testleri başlatın: ```bash npm run test ``` Vitest, projenizdeki test dosyalarını otomatik olarak bulacak ve çalıştıracaktır. `--ui` bayrağı ile web tabanlı bir arayüzde test sonuçlarını görselleştirebilirsiniz (`npm run test:ui`). ## Temel Kullanım ve Örnekler: Vitest ile Bileşen Testleri (2026) Vite projelerinde testlerin temelini oluşturan bileşen testleri, uygulamanızın en küçük parçalarının beklendiği gibi çalıştığından emin olmanızı sağlar. React için `@testing-library/react` kütüphanesi ile Vitest'i birleştirmek, kullanıcı odaklı testler yazmak için en iyi yaklaşımlardan biridir. **Örnek 1: Basit Bir React Bileşeninin Testi** Problem: Bir `Button` bileşeninin doğru metni gösterdiğinden ve tıklandığında bir fonksiyonu çağırdığından emin olmak. Çözüm: `@testing-library/react` kullanarak bileşeni render etmek, metni kontrol etmek ve tıklama olayını simüle etmek. ```typescript // src/components/Button.tsx import React from 'react'; interface ButtonProps { onClick: () => void; children: React.ReactNode; } const Button: React.FC = ({ onClick, children }) => { return ( ); }; export default Button; // test/components/Button.test.tsx import { describe, it, expect, vi } from 'vitest'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import Button from '../../src/components/Button'; describe('Button Component', () => { it('renders with correct text', () => { render(); expect(screen.getByText('Click Me')).toBeInTheDocument(); }); it('calls onClick handler when clicked', async () => { const handleClick = vi.fn(); // Vitest'in mock fonksiyonu render(); const button = screen.getByText('Click Me'); await userEvent.click(button); expect(handleClick).toHaveBeenCalledTimes(1); }); }); ``` **Örnek 2: Asenkron Veri Çekme İşlemlerinin Testi** Problem: Bir bileşenin API'den veri çekip doğru şekilde gösterdiğinden emin olmak. Çözüm: `msw` (Mock Service Worker) veya Vitest'in kendi mocking yeteneklerini kullanarak API çağrılarını mock'lamak. ```typescript // src/api/users.ts export async function fetchUsers() { const response = await fetch('https://api.example.com/users'); if (!response.ok) { throw new Error('Failed to fetch users'); } return response.json(); } // src/components/UserList.tsx import React, { useEffect, useState } from 'react'; import { fetchUsers } from '../api/users'; interface User { id: number; name: string; } const UserList: React.FC = () => { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetchUsers() .then(data => { setUsers(data); setLoading(false); }) .catch(err => { setError(err.message); setLoading(false); }); }, []); if (loading) return
Loading users...
; if (error) return
Error: {error}
; return (

Users

    {users.map(user => (
  • {user.name}
  • ))}
); }; export default UserList; // test/components/UserList.test.tsx import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { render, screen, waitFor } from '@testing-library/react'; import { setupServer } from 'msw/node'; import { HttpResponse, http } from 'msw'; import UserList from '../../src/components/UserList'; const server = setupServer( http.get('https://api.example.com/users', () => { return HttpResponse.json([{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]); }) ); beforeEach(() => server.listen()); afterEach(() => server.resetHandlers()); afterEach(() => server.close()); describe('UserList Component', () => { it('displays user list after fetching', async () => { render(); expect(screen.getByText('Loading users...')).toBeInTheDocument(); await waitFor(() => { expect(screen.getByText('Alice')).toBeInTheDocument(); expect(screen.getByText('Bob')).toBeInTheDocument(); }); expect(screen.queryByText('Loading users...')).not.toBeInTheDocument(); }); it('displays error message on fetch failure', async () => { server.use( http.get('https://api.example.com/users', () => { return new HttpResponse(null, { status: 500, statusText: 'Server Error' }); }) ); render(); await waitFor(() => { expect(screen.getByText('Error: Failed to fetch users')).toBeInTheDocument(); }); }); }); ``` **Örnek 3: Custom Hook Testi** Problem: Bir custom hook'un state yönetimi ve yan etkilerinin doğru çalıştığından emin olmak. Çözüm: `@testing-library/react-hooks` (veya React Testing Library'nin `renderHook` özelliği) kullanarak hook'u izole bir şekilde test etmek. ```typescript // src/hooks/useCounter.ts import { useState, useCallback } from 'react'; const useCounter = (initialValue = 0) => { const [count, setCount] = useState(initialValue); const increment = useCallback(() => setCount(prev => prev + 1), []); const decrement = useCallback(() => setCount(prev => prev - 1), []); const reset = useCallback(() => setCount(initialValue), [initialValue]); return { count, increment, decrement, reset }; }; export default useCounter; // test/hooks/useCounter.test.ts import { describe, it, expect } from 'vitest'; import { renderHook, act } from '@testing-library/react'; import useCounter from '../../src/hooks/useCounter'; describe('useCounter', () => { it('should initialize with the default value', () => { const { result } = renderHook(() => useCounter()); expect(result.current.count).toBe(0); }); it('should initialize with a custom initial value', () => { const { result } = renderHook(() => useCounter(10)); expect(result.current.count).toBe(10); }); it('should increment the count', () => { const { result } = renderHook(() => useCounter()); act(() => { result.current.increment(); }); expect(result.current.count).toBe(1); }); it('should decrement the count', () => { const { result } = renderHook(() => useCounter(5)); act(() => { result.current.decrement(); }); expect(result.current.count).toBe(4); }); it('should reset the count', () => { const { result } = renderHook(() => useCounter(5)); act(() => { result.current.increment(); result.current.reset(); }); expect(result.current.count).toBe(5); }); }); ``` ## İleri Seviye Teknikler: Entegre Test Stratejileri (2026) Büyük ölçekli Vite projelerinde sadece birim testleri yeterli değildir. Entegre testler, uçtan uca testler ve görsel regresyon testleri gibi ileri seviye teknikler, uygulamanızın genel sağlığını korumak için hayati öneme sahiptir. Production ortamında bu yaklaşımları uyguladığımızda %40 performans artışı ve hata oranında %25 düşüş gördük. ### 1. E2E Testleri için Playwright/Cypress Entegrasyonu Vitest birim testleri için harika olsa da, kullanıcı akışlarını ve sistem entegrasyonlarını test etmek için Playwright veya Cypress gibi uçtan uca (E2E) test araçlarına ihtiyacınız vardır. Bu araçlar, uygulamanızı gerçek bir tarayıcıda çalıştırır ve kullanıcı etkileşimlerini simüle eder. **Playwright Kurulumu ve Örneği:** ```bash npm install -D playwright @playwright/test npx playwright install # Tarayıcıları yükler ``` `playwright.config.ts`: ```typescript // playwright.config.ts import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ testDir: './e2e', fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, workers: process.env.CI ? 1 : undefined, reporter: 'html', use: { baseURL: 'http://localhost:5173', // Vite'ın varsayılan portu trace: 'on-first-retry', }, projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'] }, }, { name: 'firefox', use: { ...devices['Desktop Firefox'] }, }, { name: 'webkit', use: { ...devices['Desktop Safari'] }, }, ], webServer: { command: 'npm run dev', // Vite geliştirme sunucusunu başlat url: 'http://localhost:5173', reuseExistingServer: !process.env.CI, }, }); ``` `e2e/example.spec.ts`: ```typescript // e2e/example.spec.ts import { test, expect } from '@playwright/test'; test('should navigate to the counter page and increment', async ({ page }) => { await page.goto('/'); await expect(page.locator('h1')).toHaveText('Vite + React'); // Varsayılan Vite projesi başlığı // Örnek bir counter bileşeni olduğunu varsayalım await page.getByRole('button', { name: /count is/ }).click(); await expect(page.getByRole('button', { name: /count is 1/ })).toBeVisible(); }); ``` ### 2. Görsel Regresyon Testleri Kullanıcı arayüzündeki beklenmeyen görsel değişiklikleri yakalamak için görsel regresyon testleri önemlidir. Storybook ve Storybook'un `test-runner`'ı veya `Chromatic` gibi araçlar bu konuda yardımcı olabilir. **Storybook ile Görsel Regresyon:** 1. **Storybook Kurulumu:** ```bash npx storybook@latest init ``` 2. **Snapshot Testleri (Vitest-Alev ile):** Storybook'taki hikayelerinizi Vitest içinde snapshot testleri olarak kullanabilirsiniz. `vitest-axe` gibi kütüphanelerle erişilebilirlik (accessibility) testlerini de entegre edebilirsiniz. ```typescript // test/storybook.test.ts import { it, expect, vi } from 'vitest'; import * as stories from '../src/stories/Button.stories'; // Storybook hikayeleriniz import { composeStories } from '@storybook/react/testing-library'; import { render } from '@testing-library/react'; const { Primary } = composeStories(stories); it('Primary button should render correctly', () => { const { container } = render(); expect(container).toMatchSnapshot(); }); ``` ### 3. CI/CD Entegrasyonu Testlerinizi sürekli entegrasyon/sürekli dağıtım (CI/CD) pipeline'ınıza entegre etmek, kod kalitesini otomatik olarak sağlamanın anahtarıdır. GitHub Actions, GitLab CI veya Jenkins gibi araçlarla testlerinizi her commit'te çalıştırabilirsiniz. **GitHub Actions Örneği:** `.github/workflows/ci.yml`: ```yaml name: CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build-and-test: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # 2026 itibarıyla güncel sürüm - name: Setup Node.js uses: actions/setup-node@v4 # 2026 itibarıyla güncel sürüm with: node-version: '20' # Vite ve Vitest için önerilen Node.js sürümü - name: Install dependencies run: npm install - name: Run unit tests with coverage run: npm run coverage - name: Install Playwright browsers run: npx playwright install --with-deps - name: Run E2E tests run: npm run test:e2e # package.json'a 'test:e2e': 'playwright test' eklenmeli - name: Upload coverage report uses: actions/upload-artifact@v4 # 2026 itibarıyla güncel sürüm with: name: coverage-report path: coverage/ - name: Upload Playwright test results uses: actions/upload-artifact@v4 with: name: playwright-report path: playwright-report/ ``` ## Best Practices & Anti-Patterns: Vite Test Stratejileri (2026) Vite projelerinde test yazarken verimliliği ve güvenilirliği artırmak için izlenmesi gereken bazı en iyi uygulamalar ve kaçınılması gereken anti-pattern'lar bulunmaktadır. Ekibimizde edindiğimiz tecrübeler, bu kurallara uymanın uzun vadede büyük faydalar sağladığını gösterdi. ### ✅ Best Practices * **Test Kapsamını Belirleyin:** Test piramidini uygulayın: Birim testleri (Vitest) en altta ve en çok sayıda, entegrasyon testleri ortada, uçtan uca testler (Playwright/Cypress) en üstte ve en az sayıda olmalıdır. Neden önemli: Bu, hızlı geri bildirim sağlarken aynı zamanda uygulamanın kritik akışlarını da kapsar. * **`@testing-library` Kullanın:** Kullanıcıların uygulamanızla nasıl etkileşime girdiğini taklit eden testler yazın. `getByRole`, `getByText` gibi sorguları tercih edin. Neden önemli: Bu, uygulamanızın erişilebilirliğini ve kullanıcı deneyimini doğrudan yansıtan daha sağlam testler oluşturur. * **Vitest'in Mocking Yeteneklerini Kullanın:** Dış bağımlılıkları (API çağrıları, global objeler) `vi.fn()`, `vi.mock()` ile mock'layın. Neden önemli: Testlerinizi izole eder, daha hızlı çalışmasını sağlar ve dış hizmetlerin durumundan bağımsız hale getirir. * **`jsdom` Ortamını Kullanın:** Bileşen testleri için `jsdom` test ortamını tercih edin. Neden önemli: Tarayıcı API'lerini simüle ederken gerçek bir tarayıcı başlatma yükünü ortadan kaldırır, bu da testlerin daha hızlı çalışmasını sağlar. * **Test Dosyalarını Kaynak Koduna Yakın Tutun:** `src/components/MyComponent.tsx` için `src/components/MyComponent.test.tsx` gibi. Neden önemli: İlgili testleri bulmayı ve yönetmeyi kolaylaştırır, kodun refactor edilmesi durumunda testlerin güncellenmesini sağlar. * **Hızlı Geri Bildirim İçin `vitest --watch` Kullanın:** Geliştirme yaparken testlerinizi sürekli izleyin ve sadece değişen testleri çalıştırın. Neden önemli: Geliştirme hızını artırır ve hataları erken yakalamanızı sağlar. * **Kapsam Raporlarını İzleyin:** `vitest run --coverage` ile kod kapsamı raporları oluşturun ve bunları CI/CD sürecinize entegre edin. Neden önemli: Test edilmemiş alanları belirlemenize ve kritik kod yollarının yeterince kapsandığından emin olmanıza yardımcı olur. * **Erişilebilirlik (A11y) Testleri Yapın:** `vitest-axe` veya Playwright/Cypress ile entegre `axe-core` kullanarak erişilebilirlik sorunlarını otomatik olarak tespit edin. Neden önemli: Uygulamanızın tüm kullanıcılar tarafından erişilebilir olmasını sağlar ve yasal uygunluk risklerini azaltır. * **Snapshot Testlerini Dikkatli Kullanın:** Özellikle büyük ve sık değişen bileşenler için snapshot testlerinden kaçının. Yalnızca statik veya görsel regresyonu yakalamak istediğiniz yerlerde kullanın. Neden önemli: Aşırı snapshot kullanımı, testlerin kırılgan olmasına ve gereksiz güncellemeler gerektirmesine neden olabilir. * **Güvenlik Testlerini Otomatikleştirin:** Özellikle uçtan uca testlerde XSS, CSRF gibi temel güvenlik açıklarını tetiklemeye çalışan senaryolar ekleyin. Neden önemli: Uygulamanızın temel güvenlik mekanizmalarının çalıştığından emin olmanızı sağlar. ### ❌ Anti-Patterns * **Detaylı Uygulama Detaylarına Bağlı Testler:** `data-testid` yerine bileşenin iç yapısına (CSS sınıfları, DOM yapısı) bağımlı testler yazmak. Neden önemli: UI değiştiğinde testler kırılır, bu da bakım maliyetini artırır. * **Gereksiz Mocking:** Her şeyi mock'lamak, gerçek entegrasyon sorunlarını gözden kaçırmanıza neden olabilir. Neden önemli: Testleriniz yanıltıcı bir şekilde "geçebilir" ancak uygulama üretimde başarısız olabilir. * **Aşırı Birim Testi:** Her küçük yardımcı fonksiyonu veya saf fonksiyonu test etmeye çalışmak. Neden önemli: Aşırıya kaçan birim testleri, kod tabanını ağırlaştırır ve refactor süreçlerini zorlaştırır. * **`setTimeout` ile Gecikme:** Asenkron işlemleri `setTimeout` ile beklemek. Neden önemli: Testlerin yavaşlamasına ve flaky (güvenilmez) olmasına yol açar. `await waitFor()` veya `async/await` ile daha sağlam beklemeler kullanın. * **Test Verilerini Hardcode Etmek:** Test verilerini doğrudan test dosyasına yazmak yerine, mock veri veya fixture kullanmamak. Neden önemli: Testlerin okunabilirliğini ve yönetilebilirliğini düşürür, veri değişikliklerinde birden fazla yeri güncelleme ihtiyacı doğurur. * **Yeterli Hata Senaryosu Test Etmemek:** Sadece başarılı senaryoları test etmek, uygulamanızın hata durumlarındaki davranışını göz ardı etmek. Neden önemli: Kullanıcıların karşılaşabileceği kritik hataların üretimde ortaya çıkmasına neden olabilir. * **Testleri Yorum Satırı Yapmak/Devre Dışı Bırakmak:** Geçmeyen testleri yorum satırı yapmak veya `it.skip` kullanmak. Neden önemli: Teknik borç yaratır ve test kapsamını düşürür. ## Yaygın Hatalar ve Çözümleri (Vite/Vitest 2026) Vite ve Vitest ile çalışırken geliştiricilerin sıkça karşılaştığı bazı sorunlar ve bunların çözümleri aşağıda listelenmiştir. Production ortamında bu tarz sorunlarla karşılaştığımızda, hızlıca çözüme ulaşmak için bu listeyi referans aldık. 1. **Problem:** `ReferenceError: global is not defined` * **Sebep:** Bazı kütüphaneler (`global` objesine erişim gerektirenler) Node.js ortamında çalışırken `jsdom` ortamında bu hatayı verebilir. Özellikle eski kütüphanelerde görülür. * **Çözüm:** `vitest.config.ts` dosyanızda `globals: true` seçeneğini etkinleştirin. Bu, Vitest'in `global` objesini otomatik olarak tanımlamasını sağlar. ```typescript // vitest.config.ts import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { globals: true, // Bu satırı ekleyin environment: 'jsdom', }, }); ``` 2. **Problem:** `SyntaxError: Cannot use import statement outside a module` veya `Unexpected token 'export'` * **Sebep:** Vitest, varsayılan olarak ESM (ECMAScript Modules) kullanır. Eğer projenizde CommonJS modülleri (require/module.exports) veya Vitest'in doğrudan işleyemeyeceği özel bir syntax varsa bu hata oluşabilir. * **Çözüm:** `vite.config.ts` veya `vitest.config.ts` dosyanızda `deps.inline` seçeneğini kullanarak sorunlu modülleri dönüştürmeye zorlayın. Ayrıca, `transformMode.web` veya `transformMode.ssr` ayarlarını kontrol edin. ```typescript // vite.config.ts veya vitest.config.ts import { defineConfig } from 'vite'; export default defineConfig({ test: { // ... diğer ayarlar deps: { inline: ['@my-commonjs-lib'], // Sorunlu kütüphanenin adını buraya ekleyin }, }, }); ``` 3. **Problem:** CSS veya imaj dosyaları testlerde doğru şekilde işlenmiyor. * **Sebep:** Vitest, varsayılan olarak CSS veya imaj dosyalarını işlemez. Bu dosyalar import edildiğinde hata verebilir. * **Çözüm:** `vitest.config.ts` dosyasında `css: { modules: { classNameStrategy: 'non-scoped' } }` gibi bir ayar ekleyebilir veya basitçe bu tür import'ları mock'layabilirsiniz. ```typescript // vitest.config.ts import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { environment: 'jsdom', css: { modules: { classNameStrategy: 'non-scoped', }, }, }, }); ``` Ayrıca, dosya uzantılarını mock'lamak için `setupFiles` kullanabilirsiniz: ```typescript // test/setup.ts // CSS ve diğer varlıkları mock'lamak için Object.defineProperty(window, 'matchMedia', { writable: true, value: vi.fn().mockImplementation(query => ({ matches: false, media: query, onchange: null, addListener: vi.fn(), // deprecated removeListener: vi.fn(), // deprecated addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), })), }); vi.mock('*.css', () => ({ default: {} })); vi.mock('*.scss', () => ({ default: {} })); vi.mock('*.svg', () => ({ default: 'test-file-stub' })); ``` Ve `vitest.config.ts`'de `setupFiles: ['./test/setup.ts']` olarak belirtin. 4. **Problem:** `console.error` veya `console.warn` test sırasında beklenmedik şekilde tetikleniyor. * **Sebep:** Genellikle React'in geliştirme modunda veya kütüphanelerin uyarılarıdır. Testlerinizin temiz olduğundan emin olmak için bunları yakalamak isteyebilirsiniz. * **Çözüm:** Test setup dosyanızda `console` metotlarını mock'layarak veya spy'layarak bu uyarıları kontrol edebilirsiniz. ```typescript // test/setup.ts import { vi } from 'vitest'; const consoleError = console.error; const consoleWarn = console.warn; vi.spyOn(console, 'error').mockImplementation((...args) => { // Belirli hataları ignore edebilir veya test başarısız edebilirsiniz if (!args[0].includes('Warning: ')) { consoleError(...args); } }); vi.spyOn(cons