Takip et

Angular’da Test Devrimi: Vitest, Sahte Zamanlayıcılar ve Testronaut

Angular uygulamalarınızı test etmek hiç bu kadar hızlı ve verimli olmamıştı! Vitest, sahte zamanlayıcılar ve Testronaut ile Angular test süreçlerinizi nasıl baştan aşağı değiştirebileceğinizi keşfedin. Performans, hız ve güvenilirliği artırarak geliştirici deneyiminizi zirveye taşıyın.

Modern web uygulamaları geliştirmek, özellikle Angular gibi kapsamlı bir framework ile çalışırken, sürekli değişen gereksinimler ve karmaşık etkileşimlerle dolu bir yolculuktur. Bu yolculuğun olmazsa olmaz bir parçası da testtir. Ancak, geliştiricilerin en sık karşılaştığı sorunlardan biri, test süitlerinin zamanla yavaşlamasıdır. Özellikle büyük ölçekli Angular projelerinde Karma, Jasmine veya Jest tabanlı testlerin başlangıç süreleri uzayabilir, test çalıştırma süreleri dakikaları bulabilir. Bu durum, hızlı geri bildirim döngüsünü engeller ve geliştirici üretkenliğini olumsuz etkiler. Yavaş testler, geliştirme motivasyonunu düşürür ve hataların geç fark edilmesine yol açabilir.

Peki, Angular test süreçleriniz neden yavaşlıyor? Temel nedenler arasında şunlar sayılabilir:

  1. Ağır Başlangıç Maliyetleri: Geleneksel test koşucuları (örneğin Karma), tarayıcı ortamını başlatmak, modülleri yüklemek ve derlemek için önemli bir zaman harcar. Bu, her test çalıştırmasında tekrarlanan bir maliyettir ve özellikle CI/CD boru hatlarında ciddi zaman kayıplarına neden olabilir.
  2. Modül Çözümleme ve Derleme Karmaşası: Angular’ın modüler yapısı ve TypeScript’in derleme süreci, test ortamında da kendini gösterir. Çok sayıda dosyanın işlenmesi ve bağımlılıkların çözümlenmesi, özellikle büyük bağımlılık ağaçları olan projelerde zaman alıcıdır.
  3. Gereksiz Tarayıcı İşlemleri: Karma, genellikle Chrome gibi gerçek bir tarayıcıda testleri çalıştırır. Bu, ek kaynak tüketimi ve daha yavaş çalıştırma süreleri anlamına gelir, özellikle sunucusuz veya hafif CI/CD ortamlarında ek yük oluşturur.
  4. Boilerplate Kod: Angular’ın TestBed gibi araçları güçlü olsa da, her bir bileşen testi için tekrarlayan bir kurulum (boilerplate) gerektirir. Bu, hem kod miktarını artırır hem de test yazma sürecini yavaşlatır, testlerin okunabilirliğini düşürür.

Bu zorlukların üstesinden gelmek, daha hızlı, daha verimli ve daha keyifli bir test deneyimi sağlamak için sektör yeni araçlara yöneliyor. İşte tam da bu noktada, Vitest, sahte zamanlayıcılar ve Testronaut gibi modern çözümler devreye giriyor. Bu araçlar, Angular test ekosisteminde gerçek bir devrim niteliğindedir. Geleneksel yöntemlerin aksine, bu yeni nesil araçlar, testlerinizi saniyeler içinde çalıştırmanıza, asenkron işlemleri etkili bir şekilde yönetmenize ve karmaşık bileşen testlerini basitleştirmenize olanak tanır. Artık yavaş test döngüleriyle mücadele etmek yerine, anında geri bildirim alarak çok daha üretken olabilirsiniz. Bu makalede, bu araçların her birini derinlemesine inceleyecek ve Angular projenize nasıl entegre edebileceğinizi adım adım göstereceğiz. Hızlı, güvenilir ve sürdürülebilir bir test altyapısı kurmak için hazırsanız, bu devrimsel yolculuğa başlayalım!

Vitest Nedir ve Angular Projelerinize Nasıl Entegre Edilir?

Angular projelerinizdeki test hızını artırmak ve geliştirici deneyimini önemli ölçüde iyileştirmek mi istiyorsunuz? O zaman Vitest ile tanışmanızın tam zamanı! Vitest, Vite tabanlı, ultra hızlı bir birim test çerçevesidir. Vite’ın ESM (ECMAScript Modülleri) tabanlı mimarisini ve anında modül hot-reloading (HMR) yeteneklerini kullanarak, testlerinizi inanılmaz bir hızda çalıştırır. Geleneksel test koşucularına kıyasla çok daha hafif ve performans odaklıdır. Bu modern yaklaşım, geliştiricilerin test döngüsünü minimize ederek daha hızlı iterasyon yapmasına olanak tanır.

Vitest’in Avantajları Nelerdir?

Vitest, geliştiriciler için bir dizi cazip avantaj sunar:

  • Süper Hızlı Çalıştırma Süreleri: Vite’ın yerel ESM desteği sayesinde, testleriniz derleme adımına gerek kalmadan doğrudan çalışır. Bu, özellikle küçük değişikliklerde anında geri bildirim almanızı sağlar, bu da geliştirme akışını kesintisiz hale getirir.
  • Geliştirici Deneyimi (DX): HMR desteği ile dosyaları kaydettiğiniz anda ilgili testler otomatik olarak yeniden çalıştırılır, bu da geliştirme akışını kesintisiz hale getirir. Interaktif watch modu, testlerinizin her an güncel kalmasını sağlar.
  • Daha Hafif ve Basit Kurulum: Jest veya Karma’ya göre daha az bağımlılığa sahiptir ve kurulumu genellikle daha basittir. Bu, proje boyutunu küçültür ve bağımlılık yönetimi karmaşasını azaltır.
  • Jest ile Uyumluluk: Jest ile uyumlu bir API sunduğu için, mevcut Jest testlerinizi kolayca Vitest’e taşıyabilirsiniz. Mocking, spy ve assertion (beklenti) API’leri oldukça tanıdıktır, bu da öğrenme eğrisini düşürür.
  • Geniş Entegrasyon: TypeScript, JSX/TSX ve çeşitli UI kütüphaneleriyle sorunsuz çalışır. Ayrıca, kod kapsamı (code coverage) raporlaması gibi gelişmiş özellikler de sunar.

Angular Projelerinize Vitest Nasıl Entegre Edilir? Adım Adım Rehber

Angular CLI, varsayılan olarak Karma ve Jasmine ile gelir. Vitest’i entegre etmek için birkaç manuel adım izlememiz gerekecek. İşte bu dönüşümü gerçekleştirmek için yapmanız gerekenler:

Adım 1: Gerekli Paketleri Kurun

İlk olarak, Angular projenizin kök dizininde Vitest ve ilgili paketleri yüklemelisiniz. Bu paketler, test ortamını kurmak ve Angular ile Vitest arasında köprü kurmak için gereklidir:


npm install -D vitest @vitest/coverage-v8 @angular/compiler-cli @angular/platform-browser @angular/platform-browser-dynamic happy-dom @testing-library/angular @testing-library/jest-dom

Burada happy-dom, bir DOM ortamı sağlar (tarayıcı yerine, Node.js ortamında testlerin çalıştırılmasına olanak tanır). @testing-library/angular ise Angular bileşenlerini daha erişilebilir ve kullanıcı odaklı bir şekilde test etmenize yardımcı olur.

Adım 2: Vitest Yapılandırma Dosyasını Oluşturun

Projenizin kök dizininde vitest.config.ts adında bir dosya oluşturun ve içine aşağıdaki içeriği ekleyin. Bu dosya, Vitest'in nasıl davranacağını ve testlerinizi nerede bulacağını belirler:


import { defineConfig } from 'vitest/config';
import { resolve } from 'path';

export default defineConfig({
  test: {
    globals: true, // global API'leri etkinleştirir (describe, it, expect vb.)
    environment: 'happy-dom', // DOM ortamı sağlar, tarayıcıya gerek kalmaz
    setupFiles: [resolve(__dirname, 'src/test-setup.ts')], // Test kurulum dosyamız
    include: ['src/**/*.spec.ts'], // Test dosyalarını belirler
    exclude: ['node_modules', 'dist', '.idea', '.git', '.cache'],
    coverage: {
      provider: 'v8', // Kod kapsamı raporu sağlayıcısı
      reporter: ['html', 'lcov', 'text'], // Rapor formatları
      exclude: [ // Kapsam dışı bırakılacak dosyalar
        'src/main.ts',
        'src/polyfills.ts',
        'src/environments/**',
        'src/**/*.module.ts',
        'src/**/*.routes.ts',
        'src/**/*.config.ts',
        'src/**/*.interface.ts',
        'src/app/core/constants/**',
      ],
    },
  },
});

Adım 3: Test Kurulum Dosyasını Hazırlayın

src/test-setup.ts dosyasını oluşturun. Bu dosya, testlerin çalıştırılmasından önce Angular test ortamını başlatmak ve gerekli polyfill'leri yüklemek için kullanılır. Bu, Angular'ın Zone.js bağımlılıklarını ve test yatağını düzgün bir şekilde başlatmasını sağlar:


import 'zone.js'; // Angular için gerekli
import 'zone.js/testing'; // Angular testleri için gerekli
import { getTestBed } from '@angular/core/testing';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
import '@testing-library/jest-dom/extend-expect'; // @testing-library için expect genişleticiler

// Angular test ortamını başlat
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting(),
  { teardown: { destroyAfterEach: true }} // Her testten sonra bileşenleri temizle
);

Adım 4: tsconfig.spec.json Güncellemesi

tsconfig.spec.json dosyanızı güncelleyerek Vitest'in global tür tanımlamalarını ekleyin. Bu, TypeScript'in Vitest'in global fonksiyonlarını tanımasını sağlar ve derleme hatalarını önler:


{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/spec",
    "types": [
      "vitest/globals", // Vitest'in global API'leri için
      "node", // Node.js ortamı için (eğer Node API'leri kullanılıyorsa)
      "jest", // @testing-library/jest-dom için gerekli
      "vitest/import" // Yeni Vitest import yöntemi için
    ]
  },
  "include": [
    "src/**/*.spec.ts",
    "src/**/*.d.ts",
    "vitest.config.ts"
  ]
}

vitest/globals ve jest (@testing-library/jest-dom için) türlerini eklemek, test dosyalarınızda hata almadan describe, it, expect gibi global fonksiyonları kullanmanızı sağlar.

Adım 5: package.json Dosyasına Script Ekleyin

package.json dosyanıza Vitest'i çalıştırmak için bir script ekleyin. Bu, Vitest'i komut satırından kolayca tetiklemenizi sağlar:


{
  "scripts": {
    "test": "vitest",
    "test:watch": "vitest --watch",
    "test:coverage": "vitest run --coverage"
  }
}

Artık npm run test komutu ile Vitest'i çalıştırabilir, npm run test:watch ile dosya değişikliklerini izleyebilir ve npm run test:coverage ile kapsam raporu oluşturabilirsiniz!

Adım 6: Örnek Bir Vitest Testi Yazın

Mevcut bir .spec.ts dosyanızı Vitest ile çalışacak şekilde güncelleyin veya yeni bir dosya oluşturun. Örneğin, app.component.spec.ts dosyanız şöyle görünebilir:


import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';

describe('AppComponent', () => {
  let fixture: ComponentFixture;
  let app: AppComponent;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [AppComponent], // Standalone componentler için
    }).compileComponents();

    fixture = TestBed.createComponent(AppComponent);
    app = fixture.componentInstance;
  });

  it('should create the app', () => {
    expect(app).toBeTruthy();
  });

  it(should have the 'angular-vitest' title, () => {
    expect(app.title).toEqual('angular-vitest');
  });

  it('should render title', () => {
    fixture.detectChanges();
    const compiled = fixture.nativeElement as HTMLElement;
    expect(compiled.querySelector('h1')?.textContent).toContain('Hello, angular-vitest');
  });
});

Bu testler, Vitest tarafından Jest uyumlu API'leri sayesinde sorunsuz bir şekilde çalıştırılacaktır. Gördüğünüz gibi, Vitest entegrasyonu, mevcut Angular testlerinizin çoğunu minimal değişikliklerle çalıştırmanıza olanak tanır, aynı zamanda size benzersiz bir hız ve verimlilik sunar. Bu entegrasyon sayesinde, geliştirme süreçlerinizde testlere olan yaklaşımınız kökten değişecektir.

İpuçları: Eğer mevcut testlerinizde Zone.js ile ilgili hatalar alırsanız, vitest.config.ts dosyanızdaki setupFiles yolunun doğru olduğundan ve src/test-setup.ts dosyanızın tüm gerekli zone.js import'larını içerdiğinden emin olun. Ayrıca, Angular'ın standalone componentleri artık yaygınlaştığı için, imports: [AppComponent] yerine eski modül yapısını kullanıyorsanız declarations ve imports dizilerini uygun şekilde düzenlemeyi unutmayın. Bu detaylar, sorunsuz bir geçiş için kritik öneme sahiptir.

Sahte Zamanlayıcılar (Fake Timers) ile Asenkron Kodları Yönetmek Neden Önemli?

Web uygulamalarında asenkron işlemler kaçınılmazdır. Bir kullanıcı arayüzü gecikmeli olarak veri yükleyebilir, animasyonlar zamanlayıcılar aracılığıyla tetiklenebilir veya belirli bir süre sonra bir bildirim görüntülenebilir. JavaScript'te setTimeout, setInterval, requestAnimationFrame gibi yerleşik zamanlayıcı fonksiyonları, bu tür senaryoları yönetmek için kullanılır. Ancak, bu fonksiyonların birim testlerinde kullanılması, test sürecini yavaşlatabilir ve testlerin deterministik olmasını zorlaştırabilir. Gerçek zamanın test ortamına sızması, öngörülemeyen sonuçlara ve "flaky" (bazen geçen, bazen kalan) testlere yol açabilir.

Sorun: Gerçek Zamanın Testlere Etkisi

Varsayılan olarak, testlerinizdeki zamanlayıcılar gerçek zamanı kullanır. Bu ne anlama geliyor? Eğer kodunuzda 5 saniyelik bir gecikme varsa, testinizin de bu 5 saniyeyi beklemesi gerekir. Birkaç test için bu sorun olmayabilir, ancak yüzlerce veya binlerce testiniz olduğunda, bu gecikmeler test süitinizin toplam çalışma süresini katlayarak artırır. Ayrıca, gerçek zamanlayıcılar testlerin sırasını veya ortamın o anki durumunu etkileyebileceği için testleri kırılgan hale getirebilir. Bu durum, CI/CD süreçlerini yavaşlatır ve geliştirici geri bildirim döngüsünü uzatır.


// Örnek bir Angular servisindeki gecikmeli işlem
@Injectable({ providedIn: 'root' })
export class NotificationService {
  showSuccess(message: string, duration: number = 3000) {
    setTimeout(() => {
      console.log(Bildirim gösterildi: ${message});
    }, duration);
  }
}

// Bu servisi test ederken 3 saniye beklemek zorunda kalmak istemeyiz!
// Gerçek zamanlayıcılar, testlerin yavaşlamasına ve hatta başarısız olmasına neden olabilir.

Çözüm: Vitest'in Sahte Zamanlayıcıları (Fake Timers)

Vitest, bu sorunu çözmek için güçlü sahte zamanlayıcı (fake timers) yetenekleri sunar. vi.useFakeTimers() metodu ile Vitest'e, tüm yerleşik zamanlayıcı fonksiyonlarını ele geçirmesini ve bunları kontrol edilebilir sahte versiyonlarla değiştirmesini söylersiniz. Artık gerçek zaman akışı yerine, siz zamanı istediğiniz gibi ileri sarabilirsiniz. Bu, asenkron testlerinizi hızlandırır ve onları tamamen deterministik hale getirir.

Sahte Zamanlayıcılar Nasıl Çalışır?

vi.useFakeTimers() çağrıldıktan sonra, Vitest zamanlayıcıları kendi kontrolü altına alır. Artık zamanı ilerletmek için şu yöntemleri kullanabilirsiniz:

  • vi.advanceTimersByTime(ms: number): Belirtilen milisaniye kadar zamanı ileri sarar. Bu, özellikle belirli bir gecikmenin dolmasını beklemek için kullanışlıdır.
  • vi.runAllTimers(): Beklemedeki tüm zamanlayıcıları anında çalıştırır. Eğer birçok zamanlayıcınız varsa ve hepsinin bitmesini istiyorsanız idealdir.
  • vi.runOnlyPendingTimers(): Sadece o an beklemede olan zamanlayıcıları çalıştırır. Yeni zamanlayıcılar tetiklenirse, onlar için tekrar çağırmanız gerekir.
  • vi.setSystemTime(date: Date | number): Sistemin anlık zamanını belirlediğiniz bir değere ayarlar. Bu, özellikle tarih ve saat bağımlı testler için faydalıdır.

Test tamamlandıktan sonra, vi.useRealTimers() çağırarak gerçek zamanlayıcılara geri dönmek önemlidir, böylece diğer testler veya test ortamı etkilenmez. Bu temizlik adımı, test süitinizin kararlılığı için kritik öneme sahiptir.

Vaka Analizi: Debounce Mekanizmasının Test Edilmesi

Bir arama kutusuna yazarken, her tuş vuruşunda API'ye istek göndermek yerine, kullanıcının duraklamasını bekleyen bir debounce mekanizması yaygın bir senaryodur. Bu mekanizmayı sahte zamanlayıcılarla test etmek harika bir örnektir ve gerçek dünya uygulamalarında sıklıkla karşımıza çıkar:


// search.service.ts
import { Injectable } from '@angular/core';
import { Subject, timer } from 'rxjs';
import { debounce, switchMap } from 'rxjs/operators';

@Injectable({ providedIn: 'root' })
export class SearchService {
  private searchTerm = new Subject();

  constructor() {
    this.searchTerm.pipe(
      debounce(() => timer(300)), // 300ms gecikme
      switchMap(term => this.performSearch(term))
    ).subscribe(result => console.log('Arama sonucu:', result));
  }

  search(term: string) {
    this.searchTerm.next(term);
  }

  private performSearch(term: string): Promise {
    // Gerçek API çağrısını taklit edelim
    return new Promise(resolve => {
      setTimeout(() => {
        resolve([Result for ${term} 1, Result for ${term} 2]);
      }, 50); // API'den yanıt gelme süresi
    });
  }
}

// search.service.spec.ts (Vitest ve Fake Timers ile)
import { SearchService } from './search.service';
import { TestBed } from '@angular/core/testing';

describe('SearchService', () => {
  let service: SearchService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(SearchService);
    vi.useFakeTimers(); // Sahte zamanlayıcıları etkinleştir
  });

  afterEach(() => {
    vi.useRealTimers(); // Gerçek zamanlayıcılara geri dön
  });

  it('should debounce search calls', async () => {
    const spy = vi.spyOn(service as any, 'performSearch'); // private metoda erişim için
    
    service.search('apple');
    service.search('banana');
    service.search('cherry');

    // 200ms ileri sar, debounce süresi dolmadığı için çağrı yapılmamalı
    vi.advanceTimersByTime(200);
    expect(spy).not.toHaveBeenCalled();

    // 100ms daha ileri sar (toplam 300ms), debounce süresi doldu, şimdi çağrı yapılmalı
    vi.advanceTimersByTime(100);
    expect(spy).toHaveBeenCalledWith('cherry'); // Sadece son çağrı işlenmeli

    // performSearch içindeki 50ms'lik gecikmeyi de ilerlet
    await vi.advanceTimersByTime(50); 
    // Console log'u kontrol etmek için (eğer spy log'u da kapsıyorsa)
    // Bu noktada API cevabının işlendiğini varsayabiliriz.
  });

  it('should call search immediately if enough time passes between calls', async () => {
    const spy = vi.spyOn(service as any, 'performSearch');

    service.search('first');
    vi.advanceTimersByTime(300); // İlk çağrı için debounce süresi dolsun
    expect(spy).toHaveBeenCalledWith('first');

    // API çağrısının da tamamlanması için
    await vi.advanceTimersByTime(50);
    
    spy.mockClear(); // Spy'ı temizle
    service.search('second');
    vi.advanceTimersByTime(300); // İkinci çağrı için debounce süresi dolsun
    expect(spy).toHaveBeenCalledWith('second');
    await vi.advanceTimersByTime(50);
  });
});

Bu örnekte, vi.useFakeTimers() sayesinde, gerçek zamanın beklemesine gerek kalmadan saniyeler içinde debounce mekanizmasını test edebiliyoruz. vi.advanceTimersByTime() ile zamanı kontrollü bir şekilde ilerleterek, debouncing'in doğru çalışıp çalışmadığını deterministik bir şekilde doğrulayabiliriz. Bu, asenkron testleri çok daha yönetilebilir ve güvenilir hale getirir. Sahte zamanlayıcılar, sadece debounce değil, aynı zamanda animasyonlar, gecikmeli göstergeler veya herhangi bir zaman bağımlı kod bloğu için de hayati öneme sahiptir, böylece testleriniz daha hızlı ve daha öngörülebilir olur.

Testronaut: Angular Component Testlerini Nasıl Kolaylaştırıyor?

Angular, güçlü ve modüler bileşenler (components) oluşturmak için harika bir çerçevedir. Ancak, bu bileşenleri test etmek, özellikle de Karma ve Jasmine'in varsayılan TestBed yaklaşımıyla, bazen tekrarlayan (boilerplate) ve okunması zor kodlara yol açabilir. Her bir bileşen testi için TestBed.configureTestingModule, TestBed.createComponent gibi adımları tekrarlamak, geliştirici deneyimini (DX) olumsuz etkiler ve test yazma hızını yavaşlatır. Bu durum, geliştiricilerin test yazmaktan kaçınmasına veya sadece yüzeysel testler yazmasına neden olabilir.

Sorun: Angular TestBed'in Boilerplate Karmaşası

Angular'ın TestBed'i, bir bileşen için test modülü oluşturmanızı ve bağımlılıklarını yönetmenizi sağlar. Güçlü bir araç olsa da, özellikle basit bileşenler için bile, tekrarlayan kod yazma yükü getirir:

  • Her describe bloğunda veya beforeEach içinde TestBed'i yapılandırmanız gerekir. Bu, her test dosyasının benzer bir başlangıç şablonuyla başlamasına neden olur.
  • Gerekli imports, declarations, providers listelerini manuel olarak belirtmek zorunludur. Bu listeler büyüdükçe yönetimi zorlaşır ve hata yapma olasılığı artar.
  • Bileşenin bir örneğini almak için TestBed.createComponent kullanmak ve ardından fixture.detectChanges() çağırmak yaygın bir tekrardır. Bu, test kodunun uzunluğunu artırır.
  • Çocuk bileşenleri veya direktifleri mocklamak (sahte nesnelerle değiştirmek) ekstra çaba gerektirebilir ve test kurulumunu daha karmaşık hale getirir.

Bu adımlar, test kodunun amacını gölgede bırakabilir ve odak noktanızı test ettiğiniz bileşenden uzaklaştırarak, testin neyi doğruladığını anlamayı zorlaştırabilir.

Çözüm: Testronaut ile Testleri Basitleştirmek

İşte tam bu noktada Testronaut devreye giriyor! Testronaut, Angular bileşen testlerini basitleştirmek ve boilerplate kodu azaltmak için tasarlanmış hafif bir yardımcı kütüphanedir (yaygın uygulamalarından biri @ngneat/spectator'dur). Akıcı (fluent) bir API sunarak, test kurulumunu daha okunaklı ve daha az tekrarlayan hale getirir. Amacı, geliştiricilerin doğrudan bileşenin davranışını test etmeye odaklanmasını sağlamaktır, böylece daha hızlı ve daha etkili testler yazabilirler.

Testronaut Nasıl Çalışır ve Avantajları Nelerdir?

Testronaut, TestBed etrafında bir soyutlama katmanı sağlar ve yaygın test senaryoları için kolaylaştırılmış yöntemler sunar. Temel avantajları şunlardır:

  • Boilerplate Azaltma: Tekrar eden TestBed kurulum kodunu büyük ölçüde azaltır. Bu, test dosyalarınızın daha kısa ve daha özlü olmasını sağlar.
  • Okunabilirlik: Testlerinizi daha "işe odaklı" ve daha az "kuruluma odaklı" hale getirir. Ne test edildiğini anlamak çok daha kolaylaşır.
  • Kolay Mocking: Bağımlılıkları mocklamak için daha sezgisel bir yol sunar. Örneğin, servisleri otomatik olarak mock'layabilir veya belirli değerler döndürecek şekilde yapılandırabilirsiniz.
  • Esneklik: Hâlâ TestBed'in tüm gücüne erişmenizi sağlarken, yaygın senaryoları basitleştirir. İhtiyaç duyduğunuzda alt seviye TestBed API'lerini kullanmaya devam edebilirsiniz.
  • Geliştirici Deneyimi: Daha az yazarak daha çok iş yapmanızı ve testlerinizi daha hızlı yazmanızı sağlar. Bu da geliştiricilerin test yazmaktan keyif almasını sağlar.

Örnek: Testronaut ile Basit Bir Bileşeni Test Etmek

Diyelim ki, kullanıcıdan bir isim alan ve bir "Merhaba" mesajı gösteren basit bir GreetingComponent'imiz var:


// greeting.component.ts
import { Component, Input } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms'; // [(ngModel)] için gerekli

@Component({
  selector: 'app-greeting',
  standalone: true,
  imports: [CommonModule, FormsModule], // FormsModule'i ekledik
  template: 

{{ message }}

, styles: [] }) export class GreetingComponent { @Input() initialName: string = 'World'; name: string = ''; message: string = ''; ngOnInit() { this.name = this.initialName; this.updateMessage(); } updateMessage() { this.message = Merhaba, ${this.name}!; } } // greeting.component.spec.ts (Testronaut (Spectator) ile) import { GreetingComponent } from './greeting.component'; import { Spectator, createComponentFactory } from '@ngneat/spectator'; describe('GreetingComponent with Spectator (Testronaut)', () => { let spectator: Spectator; const createComponent = createComponentFactory({ component: GreetingComponent, imports: [GreetingComponent], // Standalone bileşenleri test ederken kendisini import etmeliyiz // Declarations, providers, mocks ve autoSpy gibi diğer seçenekler de burada kullanılabilir. }); beforeEach(() => { spectator = createComponent({ props: { initialName: 'Spectator User' } }); }); it('should create the component', () => { expect(spectator.component).toBeTruthy(); }); it('should display the initial greeting message', () => { expect(spectator.query('h2')).toHaveText('Merhaba, Spectator User!'); }); it('should update the greeting message when input changes', () => { // data-testid kullanarak daha sağlam bir seçici const input = spectator.query('[data-testid="name-input"]') as HTMLInputElement; spectator.typeInElement('Alice', input); // Input'a değer yaz spectator.detectChanges(); // Değişiklikleri algıla expect(spectator.query('h2')).toHaveText('Merhaba, Alice!'); }); });

Bu örnekte, @ngneat/spectator (Angular için Testronaut'ın en yaygın uygulamalarından biri) kullanılarak bir bileşen testi yazıldı. createComponentFactory fonksiyonu, TestBed'in karmaşasını soyutlayarak, bileşenleri oluşturmayı ve test etmeyi çok daha kolay hale getirir. Spectator nesnesi, bileşenin örneğine, elementine ve çeşitli yardımcı fonksiyonlara (query, typeInElement, detectChanges gibi) tek bir yerden erişim sağlar. Bu sayede, test kodunuz daha az tekrarlayan, daha okunaklı ve daha odaklanmış hale gelir. Testronaut benzeri kütüphaneler, özellikle karmaşık bileşenler veya büyük projeler için geliştirici verimliliğini inanılmaz derecede artırır. Test yazma süresini kısaltır ve daha güvenilir testler oluşturmanıza yardımcı olur. Karmaşık bağımlılıkları veya interaktif elementleri olan bileşenlerin testini basitleştirerek, Angular testlerini gerçekten devrim niteliğinde bir seviyeye taşıyor ve geliştiricilere zaman kazandırıyor.

Gerçek Dünya Senaryosu: Gelişmiş Bir Angular Uygulamasının Testini Hızlandırmak

Modern web uygulamaları, sadece basit bileşenlerden ibaret değildir; genellikle karmaşık veri akışları, asenkron işlemler ve etkileşimli kullanıcı arayüzleri içerirler. Bir veri tablosu veya grid bileşeni, bu karmaşıklığın iyi bir örneğidir. Bu tür bir bileşen, genellikle şu özelliklere sahiptir:

  • Veri Çekme (Data Fetching): Bir API'den asenkron olarak veri yükler ve bu süreç genellikle gecikmeler içerir.
  • Sayfalandırma (Pagination): Büyük veri setlerini küçük parçalara ayırır, bu da her sayfa geçişinde yeni veri çekimi anlamına gelebilir.
  • Debounce Edilmiş Arama: Kullanıcının arama kutusuna yazdıkça, belirli bir gecikmeyle API'ye istek gönderir. Bu, sunucu yükünü azaltır ancak testlerde zamanlama sorunlarına yol açabilir.
  • Yükleme Durumu (Loading State): Veri yüklenirken bir "yükleniyor" göstergesi sunar. Bu görsel geri bildirim, kullanıcı deneyimi için kritik olsa da test edilmesi zahmetli olabilir.
  • Sıralama (Sorting): Tablo sütunlarını artan veya azalan sırada sıralar, bu da veri manipülasyonu ve UI güncellemeleri gerektirir.

Bu özelliklerin her biri, geleneksel test yaklaşımlarıyla test edildiğinde önemli zorluklar ve yavaşlamalar yaratabilir. İşte bu noktada Vitest, sahte zamanlayıcılar ve Testronaut'ın birleşimi, test sürecini nasıl kökten değiştirebileceğimize dair güçlü bir vaka analizi sunar. Bu üçlünün entegrasyonu, hem performans hem de geliştirici deneyimi açısından kayda değer iyileştirmeler sağlar.

Vaka Analizi: Akıllı Veri Tablosu Bileşenini Test Etmek

Bir SmartDataTableComponent'imiz olduğunu varsayalım. Bu bileşen, bir DataService'ten veri çeker, bir arama girişi için debounce kullanır ve bir yükleme göstergesi ile kullanıcılara geri bildirim sağlar. Ayrıca, sayfalandırma ve sıralama özelliklerine de sahiptir.

1. Vitest ile Temel Entegrasyon ve Hız

Öncelikle, SmartDataTableComponent'in temel birim testlerini Vitest ile yazmak, test süitinin genel hızını artırır. Modül çözme ve test çalıştırma süreleri, Vitest'in Vite tabanlı mimarisi sayesinde önemli ölçüde kısalır. Vitest'in HMR yeteneği sayesinde, bileşende veya serviste yaptığınız küçük bir değişiklik, saniyeler içinde ilgili testlerin yeniden çalışmasını tetikler, bu da "test yaz-kod yaz" döngüsünü çok daha akıcı hale getirir. Bu hız, geliştiricilerin anında geri bildirim almasını ve hata ayıklama süreçlerini kısaltmasını sağlar.


// smart-data-table.component.spec.ts (Vitest ile başlangıç)
import { SmartDataTableComponent } from './smart-data-table.component';
// Diğer importlar ve TestBed kurulumu...
describe('SmartDataTableComponent', () => {
  // Vitest'in hızlı ortamında çalışacak basic testler
  it('should initialize with no data when service returns empty', () => {
    // ... Test logic here, ensuring the component's initial state is correct.
    // For example, checking if the table is empty.
  });

  it('should display loading indicator when data is being fetched', () => {
    // Mock the service to return a delayed observable
    // Then check if the loading indicator is visible
  });
});

2. Sahte Zamanlayıcılar ile Debounce ve Yükleme Durumlarını Yönetmek

SmartDataTableComponent'teki debounce edilmiş arama özelliği ve yükleme göstergesi, sahte zamanlayıcıların gücünü gösterir. Gerçek API çağrısını mock'larken, debounce gecikmesini manuel olarak ileri sarabiliriz:


// smart-data-table.component.spec.ts (Fake Timers ile debounce ve loading testi)
import { Spectator, createComponentFactory } from '@ngneat/spectator';
import { SmartDataTableComponent } from './smart-data-table.component';
import { DataService } from '../services/data.service';
import { of, delay } from 'rxjs'; // delay operatorü için

// Mock DataService
class MockDataService {
  getDataFromApi = vi.fn((term: string, page: number, sort: string) => 
    of([{ id: 1, name: Item ${term} ${page} ${sort} }]).pipe(delay(50)) // 50ms API gecikmesi
  );
}

describe('SmartDataTableComponent with debounce search', () => {
  let spectator: Spectator;
  let dataService: MockDataService;

  const createComponent = createComponentFactory({
    component: SmartDataTableComponent,
    imports: [], // Eğer standalone değilse, modül importları
    providers: [
      { provide: DataService, useClass: MockDataService } // DataService'i mock'la
    ],
    // autoSpy: true,
  });

  beforeEach(() => {
    vi.useFakeTimers(); // Sahte zamanlayıcıları etkinleştir
    spectator = createComponent();
    dataService = spectator.inject(DataService) as unknown as MockDataService;
  });

  afterEach(() => {
    vi.useRealTimers(); // Gerçek zamanlayıcılara geri dön
  });

  it('should debounce search input and call service after delay', async () => {
    const searchInput = spectator.query('.search-input') as HTMLInputElement;
    const getDataSpy = dataService.getDataFromApi;

    spectator.typeInElement('angular', searchInput); // İlk yazım
    vi.advanceTimersByTime(100); // Kısmi gecikme
    expect(getDataSpy).not.toHaveBeenCalled(); // Debounce süresi dolmadığı için çağrı yapılmamalı

    spectator.typeInElement('vitest', searchInput); // Başka yazım
    vi.advanceTimersByTime(100); // Kısmi gecikme
    expect(getDataSpy).not.toHaveBeenCalled(); // Hala çağrı yapılmamalı

    vi.advanceTimersByTime(201); // Debounce süresi (örn. 300ms) doldu, şimdi çağrı yapılmalı
    expect(getDataSpy).toHaveBeenCalledWith('vitest', 1, 'name'); // Sadece son değerle çağrılmalı (varsayılan sayfa/sıralama)

    // Yükleme göstergesi testi:
    spectator.detectChanges(); // UI güncellemelerini tetikle
    expect(spectator.query('.loading-indicator')).toBeTruthy(); // API çağrısı sırasında yükleniyor olmalı

    // API çağrısının tamamlanması ve yükleme durumunun bitmesi için:
    await vi.runAllTimersAsync(); // Tüm bekleyen async operasyonları ve zamanlayıcıları ilerlet
    spectator.detectChanges(); // UI güncellemelerini tetikle
    expect(spectator.query('.loading-indicator')).toBeFalsy(); // Yükleme bitmiş olmalı
  });
});

Bu örnekte, vi.useFakeTimers() ve vi.advanceTimersByTime() sayesinde, arama debouncing'ini ve yükleme durumunu gerçek zamanı beklemeden, milisaniyeler içinde test edebiliyoruz. vi.runAllTimersAsync(), asenkron Promise'leri ve zamanlayıcıları aynı anda çözmek için oldukça güçlü bir araçtır, bu da testlerinizin daha deterministik olmasını sağlar ve test süitinizin hızını korur.

3. Testronaut (Spectator) ile Bileşen Testlerini Temiz Tutmak

SmartDataTableComponent gibi karmaşık bir bileşen, muhtemelen çok sayıda bağımlılığa (DataService, Router, HttpClient vb.) ve karmaşık bir şablona sahip olacaktır. Testronaut (Spectator), bu bileşenin test kurulumunu büyük ölçüde basitleştirir:

  • createComponentFactory, TestBed yapılandırmasını daha deklaratif ve okunabilir hale getirir. Bu, test kurulum kodunun daha anlaşılır olmasını sağlar.
  • providers dizisinde sahte servisler (mock services) sağlamak, gerçek bağımlılıkların karmaşıklığından kaçınmanızı ve testlerinizi izole etmenizi sağlar.
  • autoSpy: true özelliği, tüm servislerinizi otomatik olarak Jest-stili spy'larla sarar, böylece metot çağrılarını kolayca izleyebilir ve doğru parametrelerle çağrılıp çağrılmadıklarını doğrulayabilirsiniz.
  • spectator.query() ve spectator.typeInElement() gibi yardımcı fonksiyonlar, DOM ile etkileşimi basitleştirir ve testleri daha kullanıcı odaklı hale getirir.

// smart-data-table.component.spec.ts (Testronaut/Spectator ile)
import { Spectator, createComponentFactory } from '@ngneat/spectator';
import { SmartDataTableComponent } from './smart-data-table.component';
import { DataService } from '../services/data.service'; // Gerçek servis
import { of } from 'rxjs';

class MockDataService {
  getDataFromApi = vi.fn((term: string, page: number, sort: string) => 
    of([{ id: 1, name: Mock Item ${term} Page ${page} Sort ${sort} }])
  );
}

describe('SmartDataTableComponent with Spectator', () => {
  let spectator: Spectator;
  let dataService: MockDataService;

  const createComponent = createComponentFactory({
    component: SmartDataTableComponent,
    imports: [], // Eğer standalone değilse, modül importları
    providers: [
      { provide: DataService, useClass: MockDataService }
    ],
    // autoSpy: true, // Tüm servisleri otomatik spy'lamak için etkinleştirilebilir
  });

  beforeEach(() => {
    spectator = createComponent();
    dataService = spectator.inject(DataService) as unknown as MockDataService;
  });

  it('should display fetched data after initialization', async () => {
    // dataService'in belirli bir değer döndürmesini sağla
    dataService.getDataFromApi.mockReturnValue(of([{ id: 1, name: 'Item A' }]));
    
    spectator.detectChanges(); // ngOnInit'i ve veri yükleme sürecini tetikle
    await spectator.fixture.whenStable(); // Asenkron işlemlerin bitmesini bekle

    expect(spectator.query('tbody tr')).toHaveLength(1); // Bir satır olmalı
    expect(spectator.query('tbody tr td:first-child')).toHaveText('Item A');
    expect(dataService.getDataFromApi).toHaveBeenCalledWith('', 1, 'name'); // Başlangıçta default değerlerle çağrılmalı
  });

  it('should change page and refetch data', async () => {
    dataService.getDataFromApi.mockReturnValue(of([{ id: 2, name: 'Item B' }]));
    
    // Sayfa değiştirme etkileşimini taklit et
    // Örneğin, bir sayfalandırma bileşeninde sayfa 2'ye tıklandığını varsayalım
    // spectator.click('.pagination-next-button');
    // Bu senaryoda doğrudan bileşenin metodunu çağırabiliriz
    spectator.component.changePage(2);
    spectator.detectChanges();
    await spectator.fixture.whenStable();

    expect(dataService.getDataFromApi).toHaveBeenCalledWith('', 2, 'name');
    expect(spectator.query('tbody tr td:first-child')).toHaveText('Item B');
  });
});

Bu entegre yaklaşım, karmaşık bir bileşenin testini hem hızlı hem de bakımı kolay hale getirir. Vitest, hızlı çalıştırma süreleriyle genel performansı artırırken; sahte zamanlayıcılar, asenkron etkileşimleri kontrol altına alır; Testronaut ise test kurulumu ve DOM etkileşimindeki boilerplate'i azaltarak geliştiricilerin daha verimli testler yazmasını sağlar. Sonuç olarak, bu üçlünün birleşimi, Angular test süreçlerinizde gerçek bir devrim yaratır, size daha fazla güven ve daha az bekleme süresi sunar, böylece daha kaliteli yazılımları daha hızlı teslim edebilirsiniz.

Uzman İpucu: Karmaşık form elemanlarını veya bileşenlerini test ederken, @testing-library/angular ile birlikte Testronaut kullanmak, kullanıcı odaklı testler yazmanızı sağlar. Örneğin, spectator.query('input[aria-label="Arama"]') gibi kırılgan CSS seçicileri yerine spectator.getByLabelText('Arama') veya spectator.getByRole('button', { name: 'Kaydet' }) gibi semantik sorguları kullanmak, erişilebilirlik açısından daha güçlü ve kırılgan olmayan testler yazmanıza olanak tanır. Bu teknikle testlerinizin güvenilirliğini ve anlaşılırlığını %40 artırabilirsiniz, çünkü kullanıcıların etkileşim şeklini taklit edersiniz.

Mobil Uyumlu Test Raporlaması için Medya Sorguları Nasıl Kullanılır?

Modern geliştirme süreçlerinde, test sonuçlarının ve raporlarının farklı cihazlarda (masaüstü, tablet, mobil) okunabilir olması da önemlidir. Direkt olarak test koşucularının HTML raporlarının mobil uyumlu olması, ekiplerin CI/CD boru hatlarından gelen sonuçları hareket halindeyken bile kolayca incelemesini sağlar. Bu, geliştirici verimliliğini artıran dolaylı bir faktördür ve sürekli entegrasyon/sürekli dağıtım süreçlerinin etkinliğini artırır.

Kapsam raporları veya test özetleri gibi HTML çıktıları ürettiğinizde, bu çıktıların mobil cihazlarda iyi görünmesini sağlamak için CSS medya sorgularını kullanabilirsiniz. Bu, tabloların dar ekranlarda bile düzenli ve okunabilir kalmasını sağlar. İşte basit bir örnek, tipik bir test raporu tablosunun nasıl mobil uyumlu hale getirilebileceğini göstermektedir:






    
    
    Vitest Test Raporu
    


    

Vitest Test Raporu

Toplam Test Sayısı: 15

Başarılı: 14   Başarısız: 1

Test Adı Durum Süre (ms) Kapsam (%)
AppComponent should create the app BAŞARILI 12 100%
SearchService should debounce search calls BAŞARILI 25 95%
SmartDataTableComponent should handle pagination error BAŞARISIZ 40 80%
AuthService should store user token BAŞARILI 8 100%
UserService should return authenticated user data BAŞARILI 18 98%

Yukarıdaki HTML ve CSS kod bloğu, tipik bir test raporu tablosunun nasıl mobil uyumlu hale getirilebileceğini göstermektedir. @media (max-width: 768px) sorgusu ile belirli bir ekran genişliğinin altında tablonun davranışını değiştiriyoruz. Her bir satır bir blok eleman haline gelir ve her hücre, :before pseudo-elementi kullanılarak kendi başlığını gösterir. Bu sayede, dar ekranlarda bile test sonuçları kaydırılabilir veya okunabilir bir formatta sunulmuş olur. Ayrıca etiketi, mobil cihazların sayfayı doğru ölçeklendirmesini sağlar.

Bu, doğrudan Vitest veya Testronaut'ın bir özelliği olmasa da, bu tür araçların ürettiği HTML raporlarının veya dokümantasyonun erişilebilirliğini artırmak için genel bir web geliştirme best practice'idir. Test süreçlerinizin her aşamasında, geliştirici ve ekip deneyimini iyileştirmek, modern ve "devrim niteliğinde" bir test kültürü oluşturmanın önemli bir parçasıdır. Mobil uyumlu raporlar, özellikle uzak ekiplerin veya yöneticilerin test sonuçlarını hızlıca gözden geçirmesi için büyük kolaylık sağlar.

Sonuç: Angular Testlerinin Geleceği Daha Hızlı ve Daha Akıllı

Angular geliştirme dünyasında test süreçleri, eskiden olduğu gibi yavaş, zahmetli ve tekrarlayan olmak zorunda değil. "Angular's Testing Revolution: Vitest, Fake Timers & Testronaut" başlığı altında incelediğimiz araçlar ve teknikler, modern Angular projelerinde test yazma ve çalıştırma şeklimizi baştan aşağı değiştiriyor. Geleneksel yaklaşımların getirdiği yükleri ortadan kaldırarak, geliştiricilere daha hızlı geri bildirim, daha yüksek verimlilik ve daha keyifli bir geliştirme deneyimi sunuyor. Bu araçlar, sadece test süreçlerini optimize etmekle kalmıyor, aynı zamanda genel yazılım kalitesini de artırıyor.

Vitest'in ultra hızlı test çalıştırma süreleri, ESM tabanlı mimarisi ve anında HMR yetenekleri, test süitlerinin saniyeler içinde tamamlanmasını sağlayarak geliştirme döngülerini hızlandırıyor. Artık küçük bir değişiklik yaptığınızda dakikalarca testlerin bitmesini beklemek zorunda kalmıyorsunuz. Bu, geliştiricilerin kodlarına olan güvenini artırırken, hata ayıklama süreçlerini de önemli ölçüde kısaltır ve "test-driven development" (TDD) gibi yaklaşımların daha uygulanabilir hale gelmesini sağlar.

Sahte zamanlayıcılar (fake timers), asenkron kodları test etmenin karşı konulmaz zorluklarına zarif bir çözüm sunuyor. setTimeout, setInterval gibi zaman bağımlı fonksiyonların kontrolünü ele alarak, testlerinizi gerçek zamanı beklemek zorunda kalmadan deterministik ve hızlı bir şekilde çalıştırmanıza olanak tanıyor. Debounce edilmiş aramalar, animasyonlar veya gecikmeli bildirimler gibi senaryoları test etmek artık bir kabus olmaktan çıkıyor ve çok daha güvenilir hale geliyor.

Testronaut (@ngneat/spectator gibi kütüphaneler aracılığıyla), Angular bileşen testlerinin getirdiği boilerplate yükünü ortadan kaldırarak geliştirici deneyimini zirveye taşıyor. Daha az kodla daha anlamlı testler yazmak, bileşenlerinizin davranışına odaklanmanızı sağlıyor. Bu, test yazma hızınızı artırırken, testlerinizin okunabilirliğini ve bakımını da kolaylaştırıyor, böylece ekipler daha sürdürülebilir bir test altyapısı oluşturabiliyor.

Bu üçlünün birleşimi, sadece testlerinizi hızlandırmakla kalmıyor, aynı zamanda daha güvenilir, daha anlaşılır ve daha sürdürülebilir bir test altyapısı kurmanıza yardımcı oluyor. Angular topluluğu, daha iyi ve daha hızlı test süreçleri arayışında sürekli olarak yenilikler yapıyor ve bu araçlar, bu yeniliklerin en parlak örneklerinden bazılarıdır. Sonuç olarak, bu entegrasyonlar, modern Angular geliştirme ekosisteminde vazgeçilmez bir yer edinmeye başlamıştır.

Eğer Angular test süreçlerinizde verimlilik arıyor ve geliştirici deneyiminizi iyileştirmek istiyorsanız, Vitest, sahte zamanlayıcılar ve Testronaut'ı projenize entegre etmeyi kesinlikle düşünmelisiniz. Geleceğin Angular testleri, şimdiden parmaklarınızın ucunda ve projelerinize değer katmayı bekliyor!

Sıkça Sorulan Sorular (SSS)

Vitest, Jest'in yerini tamamen alabilir mi?
Evet, Vitest, Jest ile büyük ölçüde uyumlu bir API sunar ve çoğu Jest testini doğrudan çalıştırabilir. Daha hızlı çalıştırma süreleri ve daha hafif bir kurulum sunarak birçok senaryoda Jest'in yerini alabilir. Ancak, Jest'in bazı özel ekosistem araçları veya eklentileri (örneğin, özel Jest transformatörleri veya snapshot testleri için ileri düzey özelleştirmeler) varsa, Vitest'e geçiş yapmadan önce uyumluluğu kontrol etmek önemlidir. Genel olarak, çoğu Angular projesi için güçlü bir alternatiftir.
Sahte zamanlayıcılar sadece setTimeout ve setInterval için mi geçerli?
Hayır, Vitest'in sahte zamanlayıcıları setTimeout, setInterval, setImmediate, clearTimeout, clearInterval, clearImmediate, requestAnimationFrame, cancelAnimationFrame, Date gibi yerleşik zamanlayıcı ve tarih API'lerini de kapsar. Bu, zamanla ilgili hemen hemen tüm asenkron işlemleri kontrol etmenizi ve testlerinizin tamamen deterministik olmasını sağlamanızı mümkün kılar. Bu sayede, UI animasyonları veya gecikmeli veri yükleme gibi karmaşık senaryoları bile kolayca test edebilirsiniz.
Testronaut'ı (Spectator) kullanmak TestBed'i tamamen devre dışı mı bırakır?
Hayır, Testronaut/Spectator, Angular'ın TestBed'i etrafında akıllı bir soyutlama katmanı sağlar. Temelde, TestBed'i sizin için daha az boilerplate ile yapılandırır ve kullanımını kolaylaştırır. Yani, TestBed hala arka planda çalışır, ancak sizin doğrudan onunla uğraşmanızı gerektiren kod miktarını azaltır. Bu sayede hem TestBed'in gücünden faydalanmaya devam eder hem de daha temiz ve okunaklı testler yazarsınız.
Bu araçları mevcut bir Angular projesine entegre etmek ne kadar zor?
Makaledeki adımları takip ederek, Vitest ve Testronaut'ı mevcut bir Angular projesine entegre etmek oldukça yönetilebilirdir. Ancak, projenizin büyüklüğüne, karmaşıklığına ve mevcut test altyapısına bağlı olarak bazı ince ayarlar gerekebilir. Özellikle tsconfig.spec.json ve vitest.config.ts dosyalarının doğru şekilde yapılandırılması önemlidir. Genel olarak, iyi belgelenmiş ve adım adım ilerleyen bir süreçtir.
Vitest kullanmak Angular CLI'ın varsayılan test komutunu değiştirir mi?
Evet, package.json dosyasındaki "test": "vitest" script'i ile Angular CLI'ın varsayılan ng test komutu yerine doğrudan Vitest'i çağırırsınız. Bu, testlerinizi Vitest ortamında çalıştıracağınız anlamına gelir ve Karma/Jasmine gibi varsayılan koşucuları kullanmayacağınızı gösterir. Angular CLI'ın test komutunu değiştirmek yerine, farklı bir script adı (örneğin "vitest:run": "vitest") kullanarak her iki test koşucusunu da projenizde tutmanız da mümkündür.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.