🚀

ユニットテストまとめ

2023/12/09に公開

はじめに

ユニットテストについて知識の整理を行おうと思う。

  • 本ページに書かれていること
    • ユニットテストについて
      • ホワイトボックス・ブラックボックステストについて
    • Jestについて
      • 環境構築
      • 使い方

ユニットテストテストとは

プログラムを構成する最小単位となる「※モジュール」の機能が正しく動作しているかを確認するテストのことをユニットテスト(単体テスト ※UTともいう)という。イメージとしては、関数等の機能が小さい部分が正しく動作するのかプログラムを使用して確認をするこです。
ユニットテストにはホワイトボックス・ブラックボックステストの2種類のテスト技法が存在する。

ホワイトボックステスト

プログラムが全て実行されることを確認するテストのこと。
ホワイトボックステストには以下の種類が存在する。

  • C0(命令網羅)
    • 命令文が少なくとも1回は実行される
  • C1(分岐網羅)
    • 判定条件における真偽が少なくとも1回は実行される
  • C2(条件網羅)
    • 条件文における真偽が少なくとも1回は実行される
  • DC(判定条件/条件網羅)
    • 全ての条件式の真偽と、全ての分岐が少なくとも一回実行される

他にも種類は存在する。

ブラックボックステスト

入出力に基づいて実行されるテストのこと。入出力の全ての方法を試すことは難しいので、境界値分析と同値分析といった手法を使って必要なテストパターンを減らすことができる。
  
境界値分析
仕様条件の境界となる値とその隣の値に対してテストする技法のこと。
(例:条件分岐の値がMax10なら、10と11を試してみる)

同値クラス分割
出力が同等になると想定される入力値のグループを識別し、各グループに対するテストケースを作成する技法のこと。
システムが正常に作動する値を「有効同値クラス」、エラーを検知する値を「無効同値クラス」といい、それぞれのクラスの代表値を用いてシステムが正常に作動するかをテストする。

ホワイト・ブラックどちらのテストを実施する?

基本的にはブラックボックスで作成し、網羅されなかったコードをホワイトボックスで補うなど、ホワイト・ブラック両方の視点でテストするのが良いいとされている。
実際の実務では、ホワイト・ブラック両方のテストを取り入れているが、テストコードにかけられる時間も無限ではないので、ホワイトボックステストでDC、ブラックボックステストの境界値分析を意識するといいと思う。

Jestについて

ユニットテストを行う際はライブラリを使用して行うと思いますが、今回はJestについて記載していこうと思います。
Jestとは、BabelTypeScriptNodeReactAngularVue など、様々なフレームワークを利用したプロジェクトで動作するJavaScript テスティングフレームワークのこと。
シンプルでシンプルにテストコードを書くことができる。

Jestの環境構築

実際にJestを使ってみる。
ライブラリのインストールを実施。

  • JavaScritpのみの場合
npm install --save-dev jest
  • TypeScritpを使用している場合
npm install --save-dev jest ts-jest @types/jest

ライブラリの説明

  • ts-jestは
    • JestをTypeScriptに対応させるためのもの。
  • ts-jest
    • ypeScriptで書いたテストコードを、コンパイルの手間なしにそのまま実行できるようになる。
  • @types/jest
    • JestのAPIの型定義ファイル。TypeScriptの型情報を付与されるので、テストコードの型チェックが行えるようになる。

Jestの設定ファイル
下記のコマンドで、設定ファイルを作成可能

npx jest init

Packege.jsonへの設定

// packe.josnファイルにテスト実行コマンドを追加する
"scripts": {
    "test": "jest" 
},

使い方

上記設定を行えば、最低限Jestを使用することができる。
下記に簡単なテストコードを記載する。

■テスト用関数

export function sum(a: number, b: number) {
  return a + b;
}

■テストコード(テストファイルの名称は.test.tsにするとテストファイルだと認識する)

import { sum } from "../sum";

test("sum関数のテスト", () => {
  expect(sum(1, 2)).toBe(3);
});

■実行コマンド

npm test

上記に記載したテストの書き方は簡単なものだったので、他の書き方を記載していく。

// テストのタイトルを記載する
describe(("題目の名前"),()=>{

    // 詳細なテスト内容を記載する
  it("テストの名前",()=>{
    
		// テスト用データの作成
		// テスト結果データの作成
		// Mockの作成
		// テスト実行
		// テスト結果の確認

  })
})

Mockの書き方
JavaScriptのみ場合、公式サイトの書き方を参考にすればMockは作成することができるが、TypeScriptを使用している場合、少し大変かも..

// クラスは架空の物を使用

// クラスのメソッドを持ったオブジェクトを使用し、強制的にクラス型を付与
const mockFactory = {
	method: jest.fn(),
} as unknown as TypeClass;

// クラスのメソッドを持ったオブジェクトをMockにし、実行時のデータ返却を定義する
const mock = (
	mockFactory.method as unknown as jest.Mock).mockReturnValue(mockData);

Jestを使う際に気をつけるべき点

  • テストパターンを洗い出す
  • テスト対象のクラスをMock化
    • Mock化するのには、「Mock,spyOn」の二通りが存在する‘
  • カバレッジ率100%を無理に目指さない

参考サイト

Discussion