Skip to content

Unit Test

Web Components のユニットテストを行うために、VitestWeb Test Runner の両方のテスト手法を採用しています。
各テストツールは、用途に応じて適切に選択できます。

Vitest を使ったユニットテスト

Vitest は、Vite と統合された高速なテストランナーです。
Vite の開発サーバー上で実行されるため、DOM の操作や Shadow DOM のテストがシームレスに行えます。

サンプルコード

sample-component.ts

typescript
export class SampleComponent extends HTMLElement {
  static get observedAttributes() {
    return ['message'];
  }

  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.shadowRoot!.innerHTML = `<p>Hello, World!</p>`;
  }

  attributeChangedCallback(name: string, oldValue: string, newValue: string) {
    if (name === 'message') {
      this.shadowRoot!.querySelector('p')!.textContent = newValue;
    }
  }
}

customElements.define('sample-component', SampleComponent);

sample-component.test.ts

typescript
import { describe, it, expect, beforeEach } from 'vitest';
import type { SampleComponent } from './sample-component';

describe('SampleComponent', () => {
  let element: SampleComponent;

  beforeEach(() => {
    document.body.innerHTML = `<sample-component></sample-component>`;
    element = document.querySelector('sample-component') as SampleComponent;
  });

  it('初期状態で "Hello, World!" と表示されること', () => {
    const p = element.shadowRoot!.querySelector('p');
    expect(p?.textContent).toBe('Hello, World!');
  });

  it('属性が変更された場合、内容が更新されること', () => {
    element.setAttribute('message', 'Hello, Vitest!');
    const p = element.shadowRoot!.querySelector('p');
    expect(p?.textContent).toBe('Hello, Vitest!');
  });
});

Web Test Runner を使ったユニットテスト

Web Test Runner は、ブラウザネイティブな動作をテストするためのツールです。
実際のブラウザ上で動作するため、リアルな DOM 操作や CSS の動作確認が可能です。

サンプルコード

sample-component.ts

typescript
export class SampleComponent extends HTMLElement {
  static get observedAttributes() {
    return ['message'];
  }

  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.shadowRoot!.innerHTML = `<p>Hello, World!</p>`;
  }

  attributeChangedCallback(name: string, oldValue: string, newValue: string) {
    if (name === 'message') {
      this.shadowRoot!.querySelector('p')!.textContent = newValue;
    }
  }
}

customElements.define('sample-component', SampleComponent);

sample-component.test.ts

typescript
import { fixture, expect, html } from '@open-wc/testing';
import './sample-component';

describe('SampleComponent', () => {
  it('初期状態で "Hello, World!" と表示されること', async () => {
    const el = await fixture(html`<sample-component></sample-component>`);
    const p = el.shadowRoot!.querySelector('p');
    expect(p?.textContent).to.equal('Hello, World!');
  });

  it('属性が変更された場合、内容が更新されること', async () => {
    const el = await fixture(html`<sample-component message="Hello, Web Test Runner!"></sample-component>`);
    const p = el.shadowRoot!.querySelector('p');
    expect(p?.textContent).to.equal('Hello, Web Test Runner!');
  });
});

選定基準

テストフレームワーク特徴用途
VitestVite に統合された超高速テストランナー。Shadow DOM の操作が容易。ロジックテスト、軽量なユニットテスト
Web Test Runner実ブラウザで実行し、レンダリング結果も確認可能。UI の確認、スタイルの検証

参考リポジトリ

Released under the CC-BY-4.0 license.