1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

vitestを導入してみた

Last updated at Posted at 2024-04-08

前回までのおさらい

vitest

Vitest は、Vite を利用した次世代のテスト フレームワーク

npm install -D vitest

vitestの設定を行う

ここから先は、この記事を下記URLを参考に進めました

vitest の設定

vitest の 設定は vite.config.ts で行います。
設定を共有するにはまず、冒頭に/// を追加してファイルに型情報を与えます。
これによってtestをキーとしたVitestの設定を記述することができるようになります。

vite.config.ts
+ /// <reference types="vitest" />
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
...

動作確認として関数テストを実行する

動作確認として簡単な関数テストを実行してみます。
src フォルダ内に add.ts と add.test.ts を作成します。

add.ts
export const add = (a: number, b: number): number => a + b
add.test.ts
import { describe, expect, it } from "vitest"
import { add } from "./add"

describe("add", () => {
  it("1 + 2 = 3", () => {
    const result = add(1, 2)

    expect(result).toBe(3)
  })
})

以下のコマンドでテストを実行します。

npx vitest

テスト成功です

image.png

よくみると、{ PASS Waiting for file changes...} 監視しているみたい・・・

vitest開発環境およびCI 環境 (存在する場合) ではwatch mode デフォルトでスマートに開始されます。
または runを使用して、目的のモードを明示的に指定できます。

watch モードなしで実行するには下記のコマンドでテストを実行します。

npx vitest run

npm run testでテスト実行できるようにする

npm run testでテスト実行できるように package.json に追記します。
watch モードなしで実行する 'testrun' も追記しておきました。

package.json
"scripts": {
   "dev": "vite",
   ・・・
+    "test": "vitest",
+    "testrun": "vitest run"
 }

vitest API をグローバルAPI として使用できるようにする

デフォルトでは import { describe, expect, it } from "vitest"
明示的に import しないと vitest の APIが使えません。

jest のように import しなくても使用できるようにするには、
vite.config.ts と tsconfig.json を以下のように変更します。

vite.config.ts
// vite.config.ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
 test: {
+    globals: true,
 },
})
tsconfig.json
{
  "compilerOptions": {
+    "types": ["vitest/globals"]
  }
}

以上の設定で vitest の API をグローバルAPI が完了!!
add.test.ts ファイルの import を削除してもコンパイルエラーにならず、npm run testでテスト実行できるようになります。

add.test.ts
- // import { describe, expect, it } from "vitest"
import { add } from "./add"

describe("add", () => {
  it("1 + 2 = 3", () => {
    const result = add(1, 2)

    expect(result).toBe(3)
  })
})

片方のコードをコメンコメンアウトで動作確認するとうまくいかなかった

React コンポーネントのテスト

つづいて React コンポーネントのテストを実行してみます。
コンポーネントのテストを行うには、いくつか追加のライブラリのインストールが必要です.

コンポーネントとそのテストコード

MyComponent.tsx
import React from 'react'

const title = 'Hello Test'

export function MyComponent() {
  return <div>{title}</div>
}
MyComponent.test.tsx
import '@testing-library/jest-dom'
import { render, screen } from '@testing-library/react'
import { MyComponent } from './MyComponent'

test('「Hello Test」が描画されている', () => {
  render(<MyComponent />)
  screen.debug()
  //「MyComponent」をレンダリングして、その出力内容から「Hello Test」があるかをテスト
  expect(screen.getByText('Hello Test')).toBeInTheDocument()
})

上記のテストを実行するために、以下のライブラリをインストールする必要

jsdom

  • jsdom とは DOM を JavaScript で実装したもの
  • Jest では jsdom が内包されていますが、vitest では別途インストールする必要
  • jsdomはテストやスクレイピングを目的としている
npm i -D jsdom
vite.config.ts
  test: {
    globals: true,
+    environment: 'jsdom',
  },

@testing-library/react

  • Reactコンポーネントをテストするためのライブラリ
  • テストコードの render メソッドや screen メソッドなどを提供してくれる

npm i -D @testing-library/react

@testing-library/jest-dom

  • DOM 要素のマッチャーを拡張するユーティリティライブラリ
  • toBeInTheDocument は @testing-library/jest-dom ライブラリのメソッドなので追加する必要がある
  • v6.0.0以降であれば @types/testing-library__jest-dom をインストールする必要はない
  • テストコードの toBeInTheDocument メソッドなどを提供してくれる

npm i -D @testing-library/jest-dom

動作確認

npm run tes でテスト実行し、コンポーネントのテストが成功することを確認

image.png

毎回import '...'を書かなくてもいいようにする

現状のままだと、テストファイルに毎回import '@testing-library/jest-dom'を書く必要があります。
この import を書かなくてもいいように設定します。

MyComponent.test.tsx
- import '@testing-library/jest-dom'
import { render, screen } from '@testing-library/react'
import { MyComponent } from './MyComponent'
...

設定ファイルを ルート直下に作成します。
ファイル名は何でもいいですが vitest.setup.ts という名前にしました。
vitest.setup.ts に下記コードを書きます。
EsLint が怒ってきますが後で設定するので今は無視しておきます。

vitest.setup.ts
import '@testing-library/jest-dom'

vite.config.ts の setupFiles プロパティに先ほど作成した設定ファイルを指定します。
setupFiles プロパティは、各テストファイルが実行される直前に実行したいスクリプトファイルを指定するプロパティです。

vite.config.ts
・・・
export default defineConfig({
  ・・・
  test: {
    globals: true,
    environment: 'happy-dom',
+    setupFiles: ['./vitest.setup.ts']
  }
})

tsconfig.jsonに下記コードを追加しないと動かなかった

tsconfig.json
{
  "compilerOptions": {
    ...
    /* vitest */
    "types": ["vitest/globals"]
  },
+  "include": ["src","./vitest.setup.ts"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

以上でテストファイルにimport '@testing-library/jest-dom'を書かなくてもよくなります。

参考

次回予告

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?