Güçlü uçtan uca test çerçevesi Cypress için kurulum, test yazma, hata ayıklama, CI/CD entegrasyonu ve en iyi uygulamaları kapsayan kapsamlı bir rehber.
Cypress: Web Uygulamaları İçin Kapsamlı Uçtan Uca Test Rehberi
Günümüzün hızla gelişen web geliştirme dünyasında, web uygulamalarının kalitesini ve güvenilirliğini sağlamak büyük önem taşımaktadır. Uçtan Uca (E2E) testler, bir uygulamanın tüm bileşenlerinin kullanıcı perspektifinden sorunsuz bir şekilde birlikte çalıştığını doğrulamada kritik bir rol oynar. Cypress, geliştirici dostu bir deneyim, güçlü özellikler ve mükemmel performans sunarak önde gelen bir E2E test çerçevesi olarak ortaya çıkmıştır. Bu kapsamlı rehber, Cypress'e başlamak ve web uygulamalarınızı etkili bir şekilde test etmek için bilmeniz gereken her şeyi size anlatacaktır.
Cypress Nedir?
Cypress, modern web için geliştirilmiş yeni nesil bir ön yüz test aracıdır. Testleri bir tarayıcıda çalıştıran geleneksel test çerçevelerinin aksine, Cypress doğrudan tarayıcı içinde çalışarak uygulamanızın davranışı üzerinde size benzersiz bir kontrol ve görünürlük sağlar. Hızlı, güvenilir ve kullanımı kolay olacak şekilde tasarlanmıştır, bu da onu dünya çapındaki geliştiriciler ve QA mühendisleri arasında popüler bir seçim haline getirir. Cypress, JavaScript ile yazılmıştır ve tarayıcı içinde çalışır, bu da onu çok performanslı kılar ve uygulamanın iç yapısına benzersiz erişim sunar.
Cypress Kullanmanın Temel Avantajları
- Geliştirici Dostu: Cypress, test yazmayı ve hata ayıklamayı kolaylaştıran temiz ve sezgisel bir API sağlar.
- Zaman Yolculuğu: Cypress, her test komutu sırasında uygulamanızın durumunun anlık görüntülerini alır, bu da zamanda geriye gidip herhangi bir noktada tam olarak ne olduğunu görmenizi sağlar.
- Gerçek Zamanlı Yenileme: Testlerinizde değişiklik yaptığınızda Cypress otomatik olarak yeniden yüklenir ve anında geri bildirim sağlar.
- Otomatik Bekleme: Cypress, eylemleri gerçekleştirmeden önce öğelerin görünür veya etkileşime girilebilir hale gelmesini otomatik olarak bekler, bu da açıkça bekleme komutları ekleme ihtiyacını ortadan kaldırır.
- Ağ Kontrolü: Cypress, ağ isteklerini ve yanıtlarını taklit etmenize (stub) olanak tanır, bu da farklı senaryoları simüle etmenizi ve uygulamanızın hata yönetimini test etmenizi sağlar.
- Hata Ayıklanabilirlik: Cypress, güçlü bir hata ayıklayıcı ve ayrıntılı hata mesajları da dahil olmak üzere mükemmel hata ayıklama araçları sunar.
- Çapraz Tarayıcı Testi: Cypress, Chrome, Firefox, Edge ve Electron dahil olmak üzere birden fazla tarayıcıyı destekler.
- Başsız (Headless) Test: CI/CD ortamlarında daha hızlı yürütme için testleri başsız modda çalıştırın.
- Dahili Doğrulamalar (Assertions): Cypress, uygulamanızın beklenen davranışını doğrulamak için zengin bir dahili doğrulama seti sunar.
Kurulum ve Ayarlar
Cypress'e başlamak oldukça basittir. İşte nasıl kurulacağı:
- Ön Koşullar: Sisteminizde Node.js ve npm'in (Node Package Manager) kurulu olduğundan emin olun. Bunları resmi Node.js web sitesinden indirebilirsiniz.
- Cypress'i Kurun: Terminalinizi veya komut istemcinizi açın, proje dizininize gidin ve aşağıdaki komutu çalıştırın:
- Cypress'i Açın: Kurulum tamamlandıktan sonra, aşağıdaki komutu çalıştırarak Cypress Test Runner'ı açabilirsiniz:
npm install cypress --save-dev
npx cypress open
Bu komut, testlerinizi çalıştırmak ve hata ayıklamak için grafiksel bir arayüz sağlayan Cypress Test Runner'ı başlatacaktır.
İlk Cypress Testinizi Yazma
Bir web sitesinin ana sayfasının doğru şekilde yüklendiğini doğrulamak için basit bir test oluşturalım. Projenizin `cypress/e2e` dizininde `example.cy.js` adında yeni bir dosya oluşturun.
// cypress/e2e/example.cy.js
describe('İlk Testim', () => {
it('Kitchen Sink sitesini ziyaret eder', () => {
cy.visit('https://example.cypress.io')
cy.contains('type').click()
cy.url().should('include', '/commands/actions')
cy.get('.action-email')
.type('fake@email.com')
.should('have.value', 'fake@email.com')
})
})
Bu testi inceleyelim:
- `describe()`: Birbiriyle ilişkili testlerin bir koleksiyonu olan bir test süitini tanımlar.
- `it()`: Test süiti içindeki tek bir test senaryosunu tanımlar.
- `cy.visit()`: Belirtilen URL'ye gider.
- `cy.contains()`: Belirtilen metni içeren bir öğeyi bulur.
- `.click()`: Seçilen öğeye tıklar.
- `cy.url()`: Sayfanın mevcut URL'sini alır.
- `.should()`: Uygulamanın durumu hakkında bir doğrulama yapar.
- `cy.get()`: Bir CSS seçici kullanarak bir öğeyi seçer.
- `.type()`: Seçilen öğeye metin yazar.
- `.should('have.value', 'fake@email.com')`: Öğenin değerinin 'fake@email.com' olduğunu doğrular.
Bu testi Cypress Test Runner'da çalıştırarak işleyişini görün. Tarayıcının Cypress Kitchen Sink web sitesine gittiğini, "type" bağlantısına tıkladığını ve URL'yi doğruladığını görmelisiniz.
Cypress Komutları
Cypress, uygulamanızla etkileşim kurmak için geniş bir komut yelpazesi sunar. İşte en sık kullanılan komutlardan bazıları:
- `cy.visit(url)`: Belirtilen URL'ye gider.
- `cy.get(selector)`: Bir CSS seçici kullanarak bir öğeyi seçer.
- `cy.contains(content)`: Belirtilen metni içeren bir öğeyi seçer.
- `cy.click()`: Seçilen öğeye tıklar.
- `cy.type(text)`: Seçilen öğeye metin yazar.
- `cy.clear()`: Bir input veya textarea öğesinin içeriğini temizler.
- `cy.submit()`: Bir formu gönderir.
- `cy.check()`: Bir onay kutusunu veya radyo düğmesini işaretler.
- `cy.uncheck()`: Bir onay kutusunun işaretini kaldırır.
- `cy.select(value)`: Bir açılır menüden bir seçenek seçer.
- `cy.scrollTo(position)`: Sayfayı belirtilen konuma kaydırır.
- `cy.trigger(event)`: Seçilen öğede bir DOM olayını tetikler.
- `cy.request(url, options)`: Belirtilen URL'ye bir HTTP isteği yapar.
- `cy.intercept(route, handler)`: Belirtilen yolla eşleşen HTTP isteklerini yakalar.
- `cy.wait(time)`: Belirtilen süre kadar bekler.
- `cy.reload()`: Mevcut sayfayı yeniden yükler.
- `cy.go(direction)`: Tarayıcı geçmişinde önceki veya sonraki sayfaya gider.
- `cy.url()`: Sayfanın mevcut URL'sini alır.
- `cy.title()`: Sayfanın başlığını alır.
- `cy.window()`: window nesnesini alır.
- `cy.document()`: document nesnesini alır.
- `cy.viewport(width, height)`: Görüntü alanı boyutunu ayarlar.
Bunlar, Cypress'te mevcut olan birçok komuttan sadece birkaçıdır. Komutların tam listesi ve seçenekleri için Cypress belgelerine bakın.
Cypress'te Doğrulamalar (Assertions)
Doğrulamalar, uygulamanızın beklenen davranışını doğrulamak için kullanılır. Cypress, öğelerin durumunu, URL'yi, başlığı ve daha fazlasını kontrol etmek için kullanabileceğiniz zengin bir dahili doğrulama seti sunar. Doğrulamalar, Cypress komutlarından sonra `.should()` yöntemi kullanılarak zincirleme olarak eklenir.
İşte bazı yaygın doğrulama örnekleri:
- `.should('be.visible')`: Bir öğenin görünür olduğunu doğrular.
- `.should('not.be.visible')`: Bir öğenin görünür olmadığını doğrular.
- `.should('be.enabled')`: Bir öğenin etkin olduğunu doğrular.
- `.should('be.disabled')`: Bir öğenin devre dışı olduğunu doğrular.
- `.should('have.text', 'beklenen metin')`: Bir öğenin belirtilen metne sahip olduğunu doğrular.
- `.should('contain', 'beklenen metin')`: Bir öğenin belirtilen metni içerdiğini doğrular.
- `.should('have.value', 'beklenen değer')`: Bir öğenin belirtilen değere sahip olduğunu doğrular.
- `.should('have.class', 'beklenen sınıf')`: Bir öğenin belirtilen sınıfa sahip olduğunu doğrular.
- `.should('have.attr', 'nitelik adı', 'beklenen değer')`: Bir öğenin belirtilen niteliğe ve değere sahip olduğunu doğrular.
- `.should('have.css', 'css özelliği', 'beklenen değer')`: Bir öğenin belirtilen CSS özelliğine ve değerine sahip olduğunu doğrular.
- `.should('have.length', beklenen uzunluk)`: Bir öğenin belirtilen uzunluğa sahip olduğunu doğrular (örneğin, bir listedeki öğe sayısı).
Ayrıca özel ihtiyaçlarınıza uygun özel doğrulamalar da oluşturabilirsiniz.
Cypress Testleri Yazmak İçin En İyi Uygulamalar
En iyi uygulamaları takip etmek, daha sürdürülebilir, güvenilir ve verimli Cypress testleri yazmanıza yardımcı olabilir. İşte bazı öneriler:
- Açık ve Öz Testler Yazın: Her test, belirli bir işlevselliğe veya senaryoya odaklanmalıdır. Anlaşılması ve bakımı zor olan aşırı karmaşık testler yazmaktan kaçının.
- Anlamlı Test Adları Kullanın: Testlerinize neyi test ettiklerini açıkça belirten açıklayıcı adlar verin.
- Değerleri Sabit Kodlamaktan Kaçının: Zamanla değişebilecek değerleri depolamak için değişkenler veya yapılandırma dosyaları kullanın.
- Özel Komutlar Kullanın: Yeniden kullanılabilir mantığı kapsüllemek ve testlerinizi daha okunaklı hale getirmek için özel komutlar oluşturun.
- Testleri İzole Edin: Her test diğer testlerden bağımsız olmalıdır. Önceki testlerden kalan uygulama durumuna güvenmekten kaçının.
- Testlerden Sonra Temizlik Yapın: Sonraki testlerin temiz bir başlangıç yapmasını sağlamak için her testten sonra uygulama durumunu sıfırlayın.
- Veri Niteliklerini Kullanın: Testlerinizde öğeleri seçmek için veri niteliklerini (örneğin, `data-testid`) kullanın. Veri niteliklerinin CSS sınıflarından veya ID'lerden daha az değişme olasılığı vardır, bu da testlerinizi UI'daki değişikliklere karşı daha dayanıklı hale getirir.
- Açık Beklemelerden Kaçının: Cypress, öğelerin görünür veya etkileşime girilebilir hale gelmesini otomatik olarak bekler. Kesinlikle gerekli olmadıkça `cy.wait()` gibi açık beklemeler kullanmaktan kaçının.
- Kullanıcı Akışlarını Test Edin: Bireysel bileşenler yerine kullanıcı akışlarını test etmeye odaklanın. Bu, uygulamanızın kullanıcı perspektifinden doğru çalıştığından emin olmanıza yardımcı olacaktır.
- Testleri Düzenli Olarak Çalıştırın: Cypress testlerini CI/CD ardışık düzeninize entegre edin ve geliştirme sürecinin başlarında hataları yakalamak için düzenli olarak çalıştırın.
İleri Düzey Cypress Teknikleri
Stub ve Mock İşlemleri
Cypress, ağ isteklerini ve yanıtlarını taklit etmenize (stub) olanak tanır, bu da farklı senaryoları simüle etmenizi ve uygulamanızın hata yönetimini test etmenizi sağlar. Bu, özellikle harici API'lere veya hizmetlere dayanan özellikleri test etmek için kullanışlıdır.
Bir ağ isteğini taklit etmek için `cy.intercept()` komutunu kullanabilirsiniz. Örneğin, aşağıdaki kod `/api/users` adresine yapılan bir GET isteğini taklit eder ve sahte bir yanıt döndürür:
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
]
}).as('getUsers')
Daha sonra `cy.wait('@getUsers')` kullanarak yakalanan isteği bekleyebilir ve uygulamanızın sahte yanıtı doğru şekilde işlediğini doğrulayabilirsiniz.
Local Storage ve Çerezlerle Çalışma
Cypress, yerel depolama (local storage) ve çerezlerle etkileşim için komutlar sağlar. Bu komutları testlerinizde yerel depolamayı ve çerezleri ayarlamak, almak ve temizlemek için kullanabilirsiniz.
Bir yerel depolama öğesi ayarlamak için, `cy.window()` komutunu kullanarak pencere nesnesine erişebilir ve ardından `localStorage.setItem()` yöntemini kullanabilirsiniz. Örneğin:
cy.window().then((win) => {
win.localStorage.setItem('myKey', 'myValue')
})
Bir yerel depolama öğesini almak için, `cy.window()` komutunu ve ardından `localStorage.getItem()` yöntemini kullanabilirsiniz. Örneğin:
cy.window().then((win) => {
const value = win.localStorage.getItem('myKey')
expect(value).to.equal('myValue')
})
Bir çerez ayarlamak için `cy.setCookie()` komutunu kullanabilirsiniz. Örneğin:
cy.setCookie('myCookie', 'myCookieValue')
Bir çerezi almak için `cy.getCookie()` komutunu kullanabilirsiniz. Örneğin:
cy.getCookie('myCookie').should('have.property', 'value', 'myCookieValue')
Dosya Yükleme İşlemleri
Cypress, testlerinizdeki dosya yüklemelerini basitleştiren `cypress-file-upload` adlı bir eklenti sunar. Eklentiyi kurmak için aşağıdaki komutu çalıştırın:
npm install -D cypress-file-upload
Ardından, `cypress/support/commands.js` dosyanıza aşağıdaki satırı ekleyin:
import 'cypress-file-upload';
Daha sonra bir dosyayı yüklemek için `cy.uploadFile()` komutunu kullanabilirsiniz. Örneğin:
cy.get('input[type="file"]').attachFile('example.txt')
IFrame'lerle Çalışma
IFrame'leri test etmek zor olabilir, ancak Cypress bunlarla etkileşim kurmanın bir yolunu sunar. Bir IFrame'in yüklenmesini beklemek için `cy.frameLoaded()` komutunu ve ardından IFrame'in document nesnesini almak için `cy.iframe()` komutunu kullanabilirsiniz.
cy.frameLoaded('#myIframe')
cy.iframe('#myIframe').find('button').click()
Cypress ve Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD)
Cypress'i CI/CD ardışık düzeninize entegre etmek, uygulamanızın kalitesini sağlamak için çok önemlidir. Cypress testlerini CI/CD ortamınızda başsız (headless) modda çalıştırabilirsiniz. İşte nasıl yapılacağı:
- Cypress'i Kurun: Cypress'in projenizde bir bağımlılık olarak kurulu olduğundan emin olun.
- CI/CD'yi Yapılandırın: CI/CD ardışık düzeninizi her yapımdan sonra Cypress testlerini çalıştıracak şekilde yapılandırın.
- Cypress'i Başsız Çalıştırın: Cypress testlerini başsız modda çalıştırmak için `cypress run` komutunu kullanın.
Örnek CI/CD yapılandırması (GitHub Actions kullanarak):
name: Cypress Testleri
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
- name: Bağımlılıkları yükle
run: npm install
- name: Cypress çalıştır
uses: cypress-io/github-action@v5
with:
start: npm start
wait-on: 'http://localhost:3000'
Bu yapılandırma, `main` dalına kod gönderildiğinde veya `main` dalına karşı bir pull request oluşturulduğunda Cypress testlerini çalıştıracaktır. `cypress-io/github-action` eylemi, Cypress testlerini GitHub Actions'ta çalıştırma sürecini basitleştirir.
Cypress Testlerinde Hata Ayıklama
Cypress, testlerinizdeki sorunları belirlemenize ve düzeltmenize yardımcı olacak mükemmel hata ayıklama araçları sunar. İşte Cypress testlerinde hata ayıklama için bazı ipuçları:
- Cypress Test Runner'ı Kullanın: Cypress Test Runner, testlerinizi çalıştırmak ve hata ayıklamak için görsel bir arayüz sağlar. Testlerinizde komut komut ilerleyebilir, uygulamanın durumunu inceleyebilir ve ayrıntılı hata mesajlarını görüntüleyebilirsiniz.
- `cy.pause()` Komutunu Kullanın: `cy.pause()` komutu, testinizin yürütülmesini duraklatır ve tarayıcının geliştirici araçlarında uygulamanın durumunu incelemenize olanak tanır.
- `cy.debug()` Komutunu Kullanın: `cy.debug()` komutu, seçilen öğeyi konsola yazdırarak özelliklerini ve niteliklerini incelemenizi sağlar.
- Tarayıcının Geliştirici Araçlarını Kullanın: Tarayıcının geliştirici araçları, DOM, ağ istekleri ve konsol günlükleri de dahil olmak üzere uygulamanız hakkında zengin bilgi sağlar.
- Hata Mesajlarını Dikkatle Okuyun: Cypress, hatanın nedenini belirlemenize yardımcı olabilecek ayrıntılı hata mesajları sunar. Hata mesajına ve yığın izine (stack trace) dikkat edin.
Cypress ve Diğer Test Çerçeveleri Karşılaştırması
Cypress güçlü bir uçtan uca test çerçevesi olsa da, diğer popüler seçeneklerle nasıl karşılaştırıldığını anlamak önemlidir. İşte kısa bir genel bakış:
- Selenium: Selenium, yaygın olarak kullanılan bir otomasyon test çerçevesidir. Esnek olmasına ve birden çok dili desteklemesine rağmen, kurulumu ve bakımı karmaşık olabilir. Cypress, özellikle JavaScript tabanlı uygulamalar için daha basit ve geliştirici dostu bir deneyim sunar.
- Puppeteer: Puppeteer, başsız Chrome veya Chromium'u kontrol etmek için üst düzey bir API sağlayan bir Node kütüphanesidir. Web kazıma (scraping) ve tarayıcı görevlerini otomatikleştirmek için mükemmeldir, ancak uçtan uca test için Cypress'e kıyasla daha fazla manuel yapılandırma gerektirebilir.
- Playwright: Playwright, Microsoft tarafından geliştirilen başka bir çapraz tarayıcı otomasyon çerçevesidir. Puppeteer ile benzerlikler paylaşır ancak daha geniş tarayıcı desteği sunar. Cypress ise benzersiz bir zaman yolculuğu hata ayıklayıcısına ve daha entegre bir test deneyimine sahiptir.
Çerçeve seçimi, projenizin özel ihtiyaçlarına ve gereksinimlerine bağlıdır. Cypress, hızlı, güvenilir ve geliştirici dostu uçtan uca test gerektiren modern web uygulamaları için mükemmel bir seçimdir.
Cypress'in Gerçek Dünya Uygulama Örnekleri
Cypress'in farklı türdeki web uygulamalarını test etmek için nasıl kullanılabileceğine dair birkaç gerçek dünya örneğini inceleyelim:
Bir E-ticaret Uygulamasını Test Etme
Cypress'i bir e-ticaret uygulamasındaki çeşitli kullanıcı akışlarını test etmek için kullanabilirsiniz, örneğin:
- Ürünleri arama
- Sepete ürün ekleme
- Ödeme yapma ve sipariş verme
- Hesap ayarlarını yönetme
İşte bir kullanıcının sepetine başarılı bir şekilde ürün ekleyebildiğini doğrulayan bir Cypress testi örneği:
it('Sepete bir ürün ekler', () => {
cy.visit('/products')
cy.get('.product-card').first().find('button').click()
cy.get('.cart-count').should('have.text', '1')
})
Bir Sosyal Medya Uygulamasını Test Etme
Cypress'i bir sosyal medya uygulamasındaki kullanıcı etkileşimlerini test etmek için kullanabilirsiniz, örneğin:
- Yeni bir gönderi oluşturma
- Bir gönderiyi beğenme
- Bir gönderiye yorum yapma
- Diğer kullanıcıları takip etme
İşte bir kullanıcının başarılı bir şekilde yeni bir gönderi oluşturabildiğini doğrulayan bir Cypress testi örneği:
it('Yeni bir gönderi oluşturur', () => {
cy.visit('/profile')
cy.get('#new-post-textarea').type('Merhaba, dünya!')
cy.get('#submit-post-button').click()
cy.get('.post').first().should('contain', 'Merhaba, dünya!')
})
Bir Bankacılık Uygulamasını Test Etme
Bankacılık uygulamaları için Cypress, aşağıdaki gibi kritik işlevleri test etmek için kullanılabilir:
- Güvenli bir şekilde oturum açma
- Hesap bakiyelerini kontrol etme
- Para transferi yapma
- Alıcıları yönetme
Bir para transferini doğrulamak için bir test (güvenlik için uygun stub işlemleriyle) şöyle görünebilir:
it('Başarıyla para transferi yapar', () => {
cy.visit('/transfer')
cy.get('#recipient-account').type('1234567890')
cy.get('#amount').type('100')
cy.intercept('POST', '/api/transfer', { statusCode: 200, body: { success: true } }).as('transfer')
cy.get('#transfer-button').click()
cy.wait('@transfer')
cy.get('.success-message').should('be.visible')
})
Sonuç
Cypress, web uygulamalarınızın kalitesini ve güvenilirliğini sağlamanıza yardımcı olabilecek güçlü ve çok yönlü bir uçtan uca test çerçevesidir. Geliştirici dostu API'si, güçlü özellikleri ve mükemmel performansı, onu dünya çapındaki geliştiriciler ve QA mühendisleri arasında popüler bir seçim haline getirir. Bu kılavuzda belirtilen en iyi uygulamaları takip ederek, geliştirme sürecinin başlarında hataları yakalamanıza ve kullanıcılarınıza yüksek kaliteli yazılımlar sunmanıza yardımcı olacak etkili Cypress testleri yazabilirsiniz.
Web uygulamaları gelişmeye devam ettikçe, uçtan uca testlerin önemi daha da artacaktır. Cypress'i benimsemek ve geliştirme iş akışınıza entegre etmek, daha sağlam, güvenilir ve kullanıcı dostu web deneyimleri oluşturmanız için sizi güçlendirecektir.