#19 TypeScriptで学ぶテスト(単体テスト)の基本

型があるから安心、と思っていても、実際の処理内容(計算結果や条件分岐)が正しいかどうかは型だけでは保証できません。この記事では、TypeScriptで書いたコードを自動でチェックする「テスト」の基本を解説します。

なぜテストを書くのか

TypeScriptの型チェックは「引数の型が合っているか」までは保証してくれますが、「計算結果が正しいか」は別の話です。テストを用意しておけば、修正のたびにコマンド一つで動作確認ができ、安心してコードを直せるようになります。

一番簡単なテストの考え方

テストの基本は「入力を渡して、期待した出力が返ってくるか確認する」ことです。

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

if (add(2, 3) !== 5) {
  throw new Error("add(2, 3)が5になりません");
}

Jestを使ったテストの書き方

TypeScriptではts-jestを組み合わせたJestがよく使われます。npm install --save-dev jest ts-jest @types/jestで導入できます。

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

test("2と3を足すと5になる", () => {
  expect(add(2, 3)).toBe(5);
});

設定ファイルでts-jestを有効にしておけば、型チェックを保ったままテストコードも書けます。ターミナルでnpx jestを実行すると結果が一覧表示されます。

異常系もテストしておく

正しい入力だけでなく、境界値(0やマイナスの値など)を渡した時の挙動もテストしておくと安心です。

test("0同士を足すと0になる", () => {
  expect(add(0, 0)).toBe(0);
});

例外の発生もテストする

特定の条件で例外が発生することを確認したい場合はtoThrowが使えます。

test("0で割ると例外が発生する", () => {
  expect(() => divide(10, 0)).toThrow();
});

例外を投げる処理は、そのまま渡すのではなく() => ...という関数の形で包んで渡す必要がある点に注意しましょう。

TypeScriptならではの注意点

型があることで「間違った型を渡すテスト」自体がコンパイルエラーになり書けない、という場面があります。意図的に不正な型を渡すテストをしたい場合は、as anyなどで型チェックを一時的に回避する必要がありますが、多用すると型の恩恵が薄れるため最小限にとどめましょう。

まとめ

テストは「正しく動くことを保証する仕組み」で、型チェックとは役割が異なります。toBe・toThrowを組み合わせることで、より安心してコードを修正できるようになります。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

TypeScriptをもっと学びたい方には「プロを目指す人のためのTypeScript入門」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本