Skip to content

Jasmin & Karma 簡介

單元測試的重要性和原則

單元測試是測試程序中最小單元(如函數、方法)的過程。其重要性在於:

  1. 確保代碼質量:及早發現問題和缺陷。
  2. 促進設計:使代碼更加模塊化。
  3. 便於維護:當代碼變更時,單元測試能快速指出問題。

單元測試應遵循的原則包括:

  • 自動化:自動執行,減少手動檢查。
  • 獨立性:每個測試應獨立於其他測試。
  • 可重複性:在任何環境中都能得到相同結果。

Jasmine 測試框架介紹

Jasmine 是一種行為驅動開發(Behavior-Driven Development, BDD)的測試框架,廣泛用於 JavaScript 應用程序。它不依賴任何其他 JavaScript 框架,且不需要 DOM。

基本的 Jasmine 測試語法

describe 和 it

describe("A suite", () => {
    it("contains spec with an expectation", () => {
        expect(true).toBe(true);
    });
});
  • describe 字串描述測試組。
  • it 字串描述具體測試案例。

expect

expect 是 Jasmine 中斷言(Assertion)的功能,用於指定期望的輸出。

設置和撕除

beforeEach 和 afterEach

describe("A suite", () => {
    beforeEach(() => {
        // 在每個 spec 前執行
    });

    afterEach(() => {
        // 在每個 spec 後執行
    });

    it("example test", () => {
        // 測試內容
    });
});

Mocks 和 Spies

  • Mocks:創建一個假的實例,模擬真實實例的行為。
  • Spies:追踪函數的調用情況,如是否被調用、調用次數等。

異步測試

處理非同步操作,Jasmine 提供了 done 函數。

it("async test", (done) => {
    setTimeout(() => {
        expect(true).toBe(true);
        done();
    }, 1000);
});

Karma 測試運行器配置和使用

Karma 是一個專為測試設計的工具,能夠在多種真實瀏覽器中運行測試代碼。它與 Jasmine 測試框架結合使用,尤其在 Angular 項目中非常流行。

Karma 配置

Karma 的配置通常在一個名為 karma.conf.js 的檔案中。以下是一個基本的配置範例:

module.exports = function(config) {
    config.set({
        basePath: '',
        frameworks: ['jasmine', '@angular-devkit/build-angular'],
        browsers: ['Chrome'],
        singleRun: false,
        reporters: ['progress'],
        // 其他配置...
    });
};

這個配置指定了使用的框架(Jasmine 和 Angular),測試運行的瀏覽器(Chrome),以及其他一些運行選項。

啟動 Karma

要啟動 Karma 測試,可以在命令行中運行以下命令:

ng test

這個命令會啟動 Karma,並根據 karma.conf.js 的配置在瀏覽器中運行測試。

Angular 中的測試實例

在 Angular 中,測試組件(Components)和服務(Services)是最常見的實踐。

測試組件

測試 Angular 組件時,通常需要檢查以下幾點:

  • 組件是否正確創建。
  • 組件模板是否正確渲染。
  • 組件的方法是否正確執行。

範例:

describe('AppComponent', () => {
    beforeEach(async () => {
        await TestBed.configureTestingModule({
            declarations: [AppComponent]
        }).compileComponents();
    });

    it('should create the app', () => {
        const fixture = TestBed.createComponent(AppComponent);
        const app = fixture.componentInstance;
        expect(app).toBeTruthy();
    });

    // 其他測試...
});

測試服務

測試服務通常涉及以下方面:

  • 服務方法的正確性。
  • 與 HTTP 請求相關的行為(如果有)。

範例:

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

    beforeEach(() => {
        TestBed.configureTestingModule({});
        service = TestBed.inject(MyService);
    });

    it('should be created', () => {
        expect(service).toBeTruthy();
    });

    // 其他測試...
});

這些測試示例提供了在 Angular 中使用 Karma 和 Jasmine 進行組件和服務測試的基礎方法。通过這些測試,可以確保 Angular 應用的穩定性和可靠性。