Ana içeriğe atla

Mala Anlatır Gibi React — 11: Test Kütüphanesi / Vitest

Mala Anlatır Gibi React — 11: Test Kütüphanesi / Vitest

Bir program yazmak kadar, onun testini yazmakta önemlidir. Hele ki büyük projelerde kontrol etmenin zorlaşmasıyla beraber test kütüphanesi size yardımcı olacaktır.

Kütüphaneyi, şöyle hemen kurabilir ve kullanabilirsiniz:

npm install -D vitest

İlk olarak, package.json’a script eklememiz gerek:

"scripts": {
"test": "vitest",
}

Dosyaların adlarını şöyle yapmanız gerekiyor:

.test.

example.test.js

example.test.jsx

Vitest (Görsel, I.)

Hadi gelelim içeriğine:

Bir tane toplama işlemi oluşturalım:

import { expect } from 'vitest'

test('toplama işlemi doğru', () => {
expect(1 + 1).toBe(2)
})

it() ve test(): Bir test etme bloğu oluştururuz. it ve test fonksiyonları aynıdır.

describe(): Testleri gruplandırmak için kullanılır.

expect(): Sonucu yakalar.

Değer kontrol fonksiyonları:

.toBe(değer): Değerin aynı olup olmadığını kontrol eder.

.toContain(değer): Yazının içinde yazılan değerin varlığını kontrol eder.

.toEqual(obj, arr): Dizi ve nesnelerde kullanılır.

.toThrow(func): Fonksiyonun hata fırlatıp fırlatmadığını kontrol eder.

.toHaveProperty(değer): Bir nesne içerisinde belirli bir özelliğin var olup olmadığını kontrol eder.

.toBeNull(): Değerin Null olup olmadığını kontrol eder.

.toBeUndefined(): Değerin undefined olup olmadığını kontrol eder.

.toBeDefined(): Değerin tanımlı olup olmadığını kontrol eder.

.toBeTruthy(): Değer true dönüp dönmediğini kontrol eder.

.toBeFalsy(): Değer false dönüp dönmediğini kontrol eder.

.toBeGreaterThan(değer): Değer gelen değerden büyük mü kontrol eder.

.toBeLessThan(değer): Değer gelen değerden küçük mü kontrol eder.

.toBeGreaterThanOrEqual(değer).toBeLessThanOrEqual(değer): Sayısal büyüklük veya küçüklük karşılaştırmalarında eşitlik durumunu da kontrol eder.

.toMatch(): RegEx girmenizi sağlar.

.toStrictEqual(değer): Nesne içerisindeki tüm değerleri kontrol eder.

Test hayat döngüsü:

.beforeEach(func): Her testten önce çalışır.

.afterEach(func): Her testten sonra çalışır.

.beforeAll(func): Tüm testlerden önce çalışır.

.afterAll(func): Tüm testlerden önce çalışır.

React fonksiyonları:

Bu durumda ise devreye @testing-library/react kütüphanesi giriyor. npm i -D ile yine paketi kurabilirsiniz.

render() fonksiyonu kullanımı:

import { render } from '@testing-library/react'
test('App bileşeni doğru render ediliyor', () => {
const { getByText } = render(<App />)
expect(getByText('Merhaba Dünya!')).toBeInTheDocument()
})

.getByRole() ile screen() fonksiyonu kullanımı:

import App from './App'

test('Butonun metni doğru mu?', () => {
render(<App />)
const button = screen.getByRole('button', { name: 'Gönder' })
expect(button).toBeInTheDocument()
})

fireEvent(): DOM üzerinde olay (event) tetikler, örneğin bir butona tıklama veya bir input’a yazı yazma:

import { render, screen, fireEvent } from '@testing-library/react'
import Counter from './Counter';

test('Butona tıklayınca sayaç artıyor', () => {
render(<Counter />)
const button = screen.getByText('Artır')
fireEvent.click(button)
expect(screen.getByText('Sayaç: 1')).toBeInTheDocument()
})

userEvent(): Kullanıcı etkileşimlerini (daha gerçekçi şekilde) simüle eder. fireEvent'in daha gelişmiş bir alternatifi gibi düşünebilirsin.

import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import LoginPage from './LoginPage';

test('Kullanıcı giriş yapabiliyor', async () => {
render(<LoginPage />)
const usernameInput = screen.getByLabelText('Kullanıcı Adı')
const passwordInput = screen.getByLabelText('Şifre')
const loginButton = screen.getByRole('button', { name: 'Giriş Yap' })

await userEvent.type(usernameInput, 'burakbehlul')
await userEvent.type(passwordInput, 'burak123')
await userEvent.click(loginButton)

expect(screen.getByText('Hoş geldiniz, burakbehlul!')).toBeInTheDocument()
})

waitFor(): Bir async işlemin tamamlanmasını bekler. Örneğin, bir API çağrısı sonrası DOM’da değişiklik olmasını test etmek için kullanılır:

import { render, screen, waitFor } from '@testing-library/react'
import FetchComponent from './FetchComponent'

test('API çağrısı sonrası veri doğru görünüyor', async () => {
render(<FetchComponent />)
await waitFor(() => expect(screen.getByText('Veri yüklendi')).toBeInTheDocument())
})

toBeInTheDocument(): Elemanın DOM’da bulunup bulunmadığını kontrol eder:

expect(screen.getByText('Merhaba Dünya!')).toBeInTheDocument()

toHaveClass(): Bir elemanın belirli bir CSS sınıfını taşıyıp taşımadığını kontrol eder:

const button = screen.getByRole('button')
expect(button).toHaveClass('primary-button')

toHaveAttribute(): Bir elemanın belirli bir HTML attribute’a sahip olup olmadığını kontrol eder:

const input = screen.getByLabelText('Email')
expect(input).toHaveAttribute('type', 'email')

findBy ve queryBy:

  • findBy: Bir async element aramak için kullanılır.
  • queryBy: Bir elementin DOM'da olmadığını test etmek için kullanılır.
const element = await screen.findByText('Yükleniyor...')
expect(screen.queryByText('Hata')).not.toBeInTheDocument()

Yapılandırma

vite.config.js’e gelin ve dosyaya şunu yazın:

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react'

export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom',
globals: true,
setupFiles: './vitest.setup.ts'
}
})

vitest.setup.js:

import '@testing-library/jest-dom'

Örnekler:

State Kontrolü: Bir butona tıklayınca state değişimini kontrol edebilirsin:

test('Butona tıklayınca state değişiyor', () => {
render(<Counter />)
const button = screen.getByRole('button', { name: 'Artır' })
fireEvent.click(button)
expect(screen.getByText('Sayaç: 1')).toBeInTheDocument()
})

Props Kontrolü: Bir bileşene gönderilen props’ların doğru çalışıp çalışmadığını kontrol edebilirsin:

test('Bileşen doğru props ile render ediliyor', () => {
render(<Greeting name="Ümit" />)
expect(screen.getByText('Merhaba, Ümit!')).toBeInTheDocument()
})

API Çağrısı ve Loader: Bir API çağrısı sırasında loader’ın görünmesini test edebilirsin:

test('Loader doğru çalışıyor', async () => {
render(<FetchComponent />)
expect(screen.getByText('Yükleniyor...')).toBeInTheDocument()
await waitFor(() => expect(screen.getByText('Veri yüklendi')).toBeInTheDocument())
})

Gerekli olacak tüm kullanımları size sundum. Olası kod yazımları da sundum.

Vitest kütüphanesi böyleydi. Diğer iki kütüphane: Jest ve Cypress ile ilgili de yazılar gelebilir. Genelde jest çok kullanılan bir kütüphane fakat Vitest onun yerini alacak gibi.

Herkese iyi kodlamalar!

Yorumlar

Bu blogdaki popüler yayınlar

Yıldırım Beyazıd ve Emir Timurlenk Savaşı

YILDIRIM BEYAZID VE EMİR TİMUR LENK SAVAŞI Ankara Savaşı (28 Temmuz 1402) Cengiz Han'ın vârisi olma iddiası ile çıkan Emir Timur. Beyazı'dın egemen olmasını kabul etmiyor. Onu küçümsüyor. Timur'un tahtını ele geçirmek için isyan başlatan   ve Timur Hindistan seferinden gelince bizzat kendisi tarafından kovulan Diyarbakır Beyi İlhan Ahmet Celâyir, Osmanlı'ya sığınmıştı. Epey Timur ve Beyazıd'ın arası gergindi. Fakat Timur kendi ırkından, dininden olan Osmanlı’ya saldırmak istemiyordu.   Timur’a tabî olan Mutahharten’ın ailesini Bursa’ya esir olarak gönderen Beyazid ile Timur’un arası açılmıştı.   “ Timur, kendisini sadece dünya üzerinde ulaşabileceği yere kadar hırsını doyurmak için Allah tarafından gönderilen “Allah’ın kulu” olarak değil, Türk halkının da gerçek ve tek temsilcisi olarak görüyordu. Yörüklerin bol paçalı şalvarları içinde, başında yüksek keçe başlığı ile tam bir Türk gibi giyinirdi.. Sarayı’nda sadece Türkçe konuşulur ve Türkçe yazı yazılır...

Filistin’in iki yüzü: PKK ve ASALA

  Filistin’in iki yüzü: PKK ve ASALA Diyeceksiniz ki: “ Ama insanlar ölüyor, yazık değil mi! Ne acımasızsın! ” falan filan.. Hayır efendim, hayır! Elbette çocukların ölmesine üzülüyorum, bende bir insanım lâkin FKÖ’nün eğittiği PKK’nın kaç Türk çocuğunun canını aldığını ez mi geçiceğiz? Burada Suriye’nin PKK’ya verdiği desteği yazmayacağım çünkü zâten blogu’mda “ Sosyalist Bedevî: Esad ailesi, atalarının izinde ” diye bir yazı yazıp detaylıca anlatmıştım. Ayrıca FKÖ’nün kurucularından ve Filistin devlet başkanı Mahmut Abbas hakkında da burada bahsetmeyeceğiz. Çünkü daha önce bahsetmiştik, bakınız: “ Solcu bir Bedevî: Mahmud Abbas ” Gelgelelim, Filistin ve PKK ilişkilerine, şöyle anlatayım: PKK, Suriye-Filistin-Lübnan kampların’da eğitim görmüştü. PKK, Suriye Hükûmeti tarafından Bekaa Vadisi’ne yerleştirilmişti. Burada yetişmişler burada militanlaşmışlardı. Bizzat büyük Türkiye dostu (!) Yaser Arafat tarafından desteklenmişlerdi. (1) İsrail’e karşı operasyonlar da kullanılmışla...

Kürtler ve Medler

KÜRTLER VE MEDLER Kürt Tarihçilerin çoğu kendini Medlere dayandırır. Kürt dilinin gelişmesinde Medlerin rol oynadığını söylerler. (Minorsky - Kürtler, İslam Ansiklopedisi, VI. cilt, s. 1089-1114) Ve Medlerin torunlarıdır. (Amir Hassanpour - Kürdistanda Milliyetçilik ve Dil; s. 120.) » Kürtlerin tek kurduğu ulusal devlet olarak Medler İmparatorluğunu kabul ederler. (Wadie Jwaideh - Kürt Miliyetçiliğinin Tarihi , Kökenleri ve Gelişimi, s. 17.) » Ve bazı Kürt Tarihçilerde şöyle savunur: “bütün tarih boyunca Medleri Kürtlerden ayrı gösterecek bir hadise bulamazsınız.." (Zinnar Silopi - Doza Kurdistan; s. 9.) » Medler proto-Kürt’tür. (Philip Kreyenbroek & Christine Allison - Kürt Kimliği ve Kültürü, s. 25.) » “Dolaylı değil doğrudan Kürtlerin Medlerle bağlantıları vardır.” (Ali Hüseyin Kerim - Balkan Yarımadasında Kürtler, s. 49.) Medlerin İmparatorluğunu yıkan, Perslerdi. (William Aegleton - Mehabad Kürt Cumhuriyeti; s. 18.) Ve şunu söylemektedirler: Medler yıkıldık...