Node.jsを使う

この文書はNode.jsを使うための入門ガイドです。Node.jsを使って開発を進めていくための最初の一歩になればと思います。

ヒント: Node.jsとは

公式サイト: Node.js

Node.jsは、オープンソースでクロスプラットフォームなJavaScript実行環境です。Webアプリケーションを中心に幅広い開発に使われています。

Node.jsのインストール

Node.jsはさまざまな方法でインストールできます。Windowsをお使いの方は「Node.js を Linux 用 Windows サブシステム (WSL2) にインストールする」を推奨します。

別の方法: 公式サイトからダウンロード

主要なプラットフォームのインストーラーは、Node.jsの公式サイト - https://nodejs.org/en/download からダウンロードできます。 こちらから自分の環境に合わせたインストーラーをダウンロードし、それを実行します。 インストーラーを実行するとNode.jsがインストールされます。

ヒント: 「LTS」と「最新版」

バージョンの説明を読むと「LTS (推奨版)」とあります。この「LTS」は何かというと、「Long Term Support」を表しており、「長期間安定的にサポートされます」ということを意味します。

現在、Node.jsは毎年LTSリリースを行っています。このLTSリリースは、バージョン番号が偶数番号 (たとえば、22、24など) のものが採用されます。LTSリリースのバージョンは、重要なバグ修正を基本的に30ヶ月間行われることを保証されています。

一方、それらのLTSリリースとは別に、Node.jsは6ヶ月ごとに最新版がリリースされます。この最新版はLTSリリースとは異なり、次のバージョンのリリース後にサポートされなくなります。特別な理由が無ければLTSリリースのバージョンをインストールするのがよいでしょう。

参照: Node.js Releases

ターミナルの使用

コマンドを実行するにはターミナルを使用します。

Windows の場合:

Microsoft Storeから、Windows Terminalをインストールします。 インストール後、[スタートメニュー] > [Windows Terminal] を選択して起動します。

macOS の場合:

[アプリケーション] > [ユーティリティ] 内にある [ターミナル] を選択して起動します。

Node.jsの使用

ターミナルで次のコマンドを実行して、Node.jsがインストールされていることを確認します。

node -v

インストールしたNode.jsのバージョンが表示されていれば、Node.jsを使用する準備は完了です。

$ node -v
v22.11.0

package.jsonファイル

Node.jsを使ったプロジェクトは、基本的に package.json というファイルが配置されます。 package.json には、次のようなプロジェクトに必要な付帯情報が含まれます。

  • 名前とバージョン
  • 外部モジュールや依存関係
  • テストやビルドするためのコマンドなど

プロジェクトの作成

Node.jsを使った開発をはじめるにあたって、最初にプロジェクトのためのディレクトリを作成します。

mkdir my-project
cd my-project

そして、その中に package.json を配置します。

npm init -y

これで一通りの準備が整いました。

ESLintの導入

公式サイト: ESLint

ESLintは、JavaScriptの静的コード解析を行うためのツールです。

ESLintは、JavaScriptのコードの品質に関わる次のような項目を検査できます。

  • デッドコードの検知 (no-unused-vars, no-unreachable, etc.)
  • コードの複雑さ (max-lines, max-depth, complexity, etc.)

導入方法

プロジェクトにESLintを導入するには、ターミナルで以下のコマンドを実行します。

npm init @eslint/config

実行結果:

$ npm init @eslint/config
Need to install the following packages:
  @eslint/create-config
Ok to proceed? (y) <Enterキーを入力>
...

いくつか質問が続くので、それぞれ矢印キーとEnterキーを入力して回答します。質問とその回答例を下記に示しますが、実際には自分の環境に合わせて適切な回答を選択し設定しましょう。

質問回答例
How would you like to use ESLint? (ESLintをどのように使いたいですか?)To check syntax and find problems (シンタックス検査と問題点の検出)
What type of modules does your project use? (プロジェクトでは、どのような種類のモジュールを使用していますか?)JavaScript modules (import/export) (ECMAScript modules)
Which framework does your project use? (プロジェクトでは、どのフレームワークを使用していますか?)None of these (いずれもなし)
Does your project use TypeScript? (あなたのプロジェクトではTypeScriptを使用していますか?)No (いいえ)
Where does your code run? (コードはどこで実行しますか?)Node (Node.js)
Would you like to install them now? (今すぐインストールしますか?)Yes (はい)
Which package manager do you want to use? (どのパッケージマネージャを使用しますか?)npm

なお、回答後に作られる設定ファイルを直接編集することで設定を変更することもできます。

実行方法

導入したESLintは、npx eslint コマンドを使用することで実行できます。

npx eslint <ファイル名またはディレクトリ名>

たとえば、次のJavaScriptのファイルを作成し、ESLintによって検査してみましょう。

// hello.js
const message = "Hello, World!";
console.log(message);
$ npx eslint hello.js

実行後、何も表示されなければ検査完了です。 検査に合格したことを意味します。

実際にコードの品質に問題があった場合についても確認してみましょう。 上のコードを次のように変更してみます。

// hello.js
const message = "Hello, World!";
console.log(invalid);

console.log() の引数に定義されていない無効な値 invalid を渡してみます。

$ npx eslint hello.js

hello.js
  1:7   error  'message' is assigned a value but never used  no-unused-vars
  2:13  error  'invalid' is not defined                      no-undef

✖ 2 problems (2 errors, 0 warnings)

実行するとエラーメッセージが表示されます。 これは、ESLintがコードを検査した結果、2件の問題 (problems) を検知したことを意味します。

このようにして、ESLintはコードの品質に関する問題を検知することができます。

エラーの説明

  1:7   error  'message' is assigned a value but never used  no-unused-vars

このメッセージは 対象のファイルの1行目、7列目に問題の可能性のあるコードが検出されたことを意味します。 no-unused-vars ルールが有効になっている場合、このメッセージが表示されます。 「'message' is assigned a value but never used (message に値が割り当てられているが、使われていません)」と書かれており、message がデッドコードとなっている可能性を知らせてくれています。

もし仮にここでコードに必要な変数を宣言しているならば、その変数は必要な場所で正しく使用されていない可能性があります。 あるいはもし仮に本当に不要な変数の宣言であるならば、この宣言は削除しても構いません。

  2:13  error  'invalid' is not defined                      no-undef

続いてのメッセージは、対象のファイルの2行目、13列目に問題の可能性のあるコードが検出されたことを意味します。 no-undef ルールが有効になっている場合、このメッセージが表示されます。 「'invalid' is not defined (invalid が定義されていない)」と書かれており、invalid が宣言されていない変数であることを知らせてくれています。 JavaScriptで変数を使用する場合、あらかじめ宣言する必要があるので必要に応じて宣言するか、あるいはもし誤った変数を参照しているならば、正しい変数に変更しましょう。

この他にもESLintにはさまざまなルールがあります。詳細はESLintのルール一覧をご覧ください。

複数のファイルの検査

引数にディレクトリを指定することで、そのディレクトリ内のコードを検査します。 もしカレントディレクトリ内のコードを検査したい場合は、. を引数に指定します。

npx eslint .

Prettierの導入

公式サイト: Prettier

Prettierは、ソースコードを整形するためのツールです。

Prettierは、JavaScriptをはじめとした、さまざまなコードの整形に対応しています。

  • JavaScript
  • JSX
  • Angular
  • Vue
  • Flow
  • TypeScript
  • CSS, Less, and SCSS
  • HTML
  • Ember/Handlebars
  • JSON
  • GraphQL
  • Markdown, including GFM and MDX
  • YAML

次のコマンドでPrettierをインストールします。

npm i -D prettier

インストール後、次のコマンドでファイルの整形を行います。

npx prettier --write <ファイル名またはディレクトリ名>

実行例:

npx prettier --write hello.js

もしカレントディレクトリ以下にある複数のファイルを整形したい場合は、. を引数に指定します。

npx prettier --write .

このようにして、Prettierはコードの整形を行うことができます。

ESLintとの競合を避ける

ESLintでコードの整形を行うことがあり、その設定によってはPrettierで整形を行うことができない場合があります。 それを避けるには、ESLintの設定としてeslint-config-prettierをインストールし、これを使用します。

npm i -D eslint-config-prettier
// eslint.config.js
import js from "@eslint/js";
import prettier from "eslint-config-prettier";

export default [js.configs.recommended, prettier];

こうすることによって、Prettierで整形を行うことができない問題を回避することができます。必要に応じて行いましょう。

VSCodeのインストール

VSCode (Visual Studio Code)は、ソースコードを編集するためのエディタです。

VSCodeは、JavaScriptをはじめとするさまざまなプログラミング言語のシンタックスハイライトや自動補完、またデバッガなどの便利な機能を備えています。

VSCodeは公式サイトからダウンロードしてインストールできます。

公式サイト: Visual Studio Code

自分の環境に合わせたインストーラーをダウンロードし、それを実行します。 インストーラーを実行するとVSCodeがインストールされます。

設定

設定を変更するには、メニューから設定を開きます。

  • Windows/Linuxの場合 - File (ファイル) > User Settings (ユーザー設定) > Settings (設定)
  • macOSの場合 - Code > User Settings (ユーザー設定) > Settings (設定)

便利な設定

  • Editor: Format On Save (保存時に自動整形) … editor.formatOnSave
    • 有効化することで、ファイルを保存する時に自動的にコードの整形を行います。

VSCodeの拡張機能

VSCodeは、標準で備えている機能の他にMarketplaceにある拡張機能をインストールすることでさまざまな機能を追加することができます。

拡張機能の検索

VSCodeを起動して、ウィンドウの左端のアクティビティバーにある「拡張機能」をクリックして、Marketplaceにある拡張機能を検索することができます。

ESLintの拡張機能のインストール

便利な拡張機能の紹介

  • ESLint (dbaeumer.vscode-eslint) … ESLintを使用するための拡張機能
  • Prettier - Code formatter (esbenp.prettier-vscode) … Prettierを使用するための拡張機能
  • Vue Language Features (Volar) (Vue.volar) … Vue.jsを使用するための拡張機能

検索した拡張機能を選択し、Install (インストール)をクリックしてその拡張機能をインストールします。

ESLintの使用

「eslint」などのキーワードでESLintの拡張機能を検索し、インストールします。

ESLintの導入のように、あらかじめESLintを導入したプロジェクトをVSCodeから開くと、そのプロジェクトのESLintが自動的に実行され、VSCodeの編集画面に表示されます。

ESLintの使用

ESLintの拡張機能の使用

このようにESLintの拡張機能をインストールすることによって自動的にESLintを実行し、即時にJavaScriptのコードのチェックを行うことができます。

Prettierの使用

Prettierの導入で説明したとおり、PrettierはJavaScriptをはじめとしたさまざまなコードを整形するためのツールです。

Prettierの拡張機能をインストールすることによって、VSCodeの編集画面に表示されるコードを自動的に整形することができます。 Marketplaceに「Prettier - Code formatter」という名前で提供されています。これをインストールします。

Prettierの拡張機能のインストール

インストール後、ファイルを開き、Ctrl+Shift+P (macOSの場合はCmd+Shift+P)を押して、コマンドパレットを開きます。そのなかに

> format document

等のキーワードで「ドキュメントのフォーマット (Format Document)」を選択して、フォーマットを実行します。あるいは、Ctrl+Shift+I (macOSの場合はCmd+Shift+I)を押しても、同様の操作が可能です。いずれかを実行してコードの整形を行います。

ドキュメントのフォーマット (Format Document)

初回フォーマット時に、フォーマッタの選択肢が表示されることがあります。ここでフォーマッタとして、さきほどインストールした「Prettier - Code formatter (esbenp.prettier-vscode)」を選択します。

フォーマッタの選択

こうすることによって規定のフォーマッタとしてPrettierが設定されます。

それでは実際にPrettierによるコードの整形を試していきましょう。例として、空白と改行がぐちゃくちゃに挿入されたJavaScriptのコードを示します。

コード整形前

このコードに対して「ドキュメントのフォーマット」実行すると、次のように整形されます。

コード整形後

さらにVSCodeの便利な設定のなかで紹介した「Format On Save」を有効にすることで自動整形を行うことができます。

このようにして、Prettierによって簡単にコードを整形できます。

Vue Language Features (Volar)の使用

VolarはVueでの開発に必要な拡張機能です。

Volarのインストール

Vueとはユーザーインターフェイスを構築するためのJavaScriptフレームワークです。

Vue公式サイト: Vue.js

この拡張機能を使用するとVSCodeでVueのコードの強調表示や補完などを行えます。必要に応じてインストールしましょう。

VSCodeでのNode.jsのデバッグ

VSCodeは標準でNode.jsのプログラムのデバッグを行うことができます。

VSCodeでNode.jsのプログラムのデバッグを行うには、Auto Attach (自動アタッチ)を使用します。 設定を変更し、Node.jsで起動したプログラムにアタッチして、デバッグを開始します。

デバッグを行えるようにすることで、ブレークポイントを指定して処理の流れを確認したり、そのときの変数の内容を確認したりすることができます。

自動アタッチ設定

設定から、Debug › JavaScript: Auto Attach Filter (debug.javascript.autoAttachFilter) を変更します (1)。

smart を選択すると、VSCodeターミナルからNode.jsのプロセスを実行したとき--inspectスイッチが有効化され、自動的にデバッグを開始することができます (2)。

自動アタッチを行うにはVSCode内のターミナルを使用しなければなりません。 また、Auto Attachを有効にした後、ターミナルを一度再起動する必要があります。これは、ターミナルの右上にある ⚠ アイコンをクリックするか、新しいターミナルを作成することで行えます (3)。

自動アタッチの設定

ブレークポイント

Node.jsで実行するプログラムのコードをVSCodeで開き、行番号の左の部分をクリックしてブレークポイントを作成できます。 また、もう一度その部分をクリックすることでそのブレークポイントを削除できます。

ブレークポイントの作成

あるいは、画面上からクリックする代わりに、コードのブレークポイントを置きたい場所に debugger 文を追加することでブレークポイントを作成します。いずれの方法でもブレークポイントを作成できます。

参考文献: debugger - JavaScript | MDN

ブレークポイントを作成後、VSCode内のターミナルから実行するとそのブレークポイントでNode.jsの処理は一時停止します。

ターミナル:

$ node hello.js

Node.jsのデバッグ

上部に表示されているボタンの意味を説明します。

続行

続行

プログラムの実行を続けます。プログラムが終了するか次にブレークポイントが現れるまで実行し続けます。

ステップオーバー

ステップオーバー

ステップオーバー、ステップイン、ステップアウトはステップ実行のための機能です。

ステップオーバーは、プログラムを1行進めます。

ステップイン

ステップイン

ステップインは、もしその行に関数の呼び出しがあれば、その関数の最初の行に移動します。

ステップアウト

ステップアウト

ステップアウトは、もしその行が関数の中であれば、その関数の呼び出し元の次の行に移動します。

参考文献: Debugging in Visual Studio Code

このようにして、VSCodeでNode.jsのプログラムのデバッグを行うことができます。

Test Runnerではじめるテスト

Node.jsに組み込まれた新しいテストランナーを使ってテストを行う入門ガイドです。 Node.jsでどうやってテストするんだろう?という疑問に答えます。 テストを行っていくための最初の一歩になればと思います。

それでは、さっそく学んでいきましょう!

事前準備

あらかじめNode.jsの実行環境を構築してからはじめます。

StackBlitzではじめる

次のリンクにアクセスすると、StackBlitzで新しいNode.jsの実行環境を構築できます。

Edit on StackBlitz

StackBlitzではじめる場合は、以降の準備は不要です。

ローカル環境ではじめる

ローカル環境にNode.jsの実行環境を構築する場合、まずはじめにNode.jsをインストールします。 インストール方法は「Node.jsのインストール」をご参照ください。 プロジェクトの作成方法は「package.jsonファイル」をご参照ください。

はじめてのテスト

テストランナーは、node --test コマンドを使用することで実行できます。

node --test

しかし、まだテストが1件も存在しません。

$ node --test
ℹ tests 0
ℹ suites 0
ℹ pass 0
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1.92388

実際にテストを作成し、実行していきましょう。

ECMAScriptモジュール

ECMAScriptモジュール (ESM) とは、JavaScriptをモジュールとして再利用できるようにするための仕組みです。

Node.jsでESMを取り扱えるようにするためには package.json ファイルに "type": "module" プロパティを加えます。

{
  "type": "module"
}

このように書き加えると、プロジェクトの .js ファイルはESMとして取り扱われます。

テストファイルの作成

次のファイルを作成します。

// hello.test.js
import assert from "node:assert";
import test from "node:test";

test("1と2の合計は3です", () => {
  assert.strictEqual(1 + 2, 3);
});

この作成した hello.test.js は、node --test コマンドを実行するときにテストとして実行されるようになります。

$ node --test
✔ 1と2の合計は3です (0.54321ms)
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 65.4321

問題なく実行できましたか?

✔ 1と2の合計は3です

画面に表示されたこの部分は「テスト "1と2の合計は3です" が実行され、そのテストは合格しました ✅」ということを意味しています。

このようにしてNode.jsで簡単にテストを行うことができます。

はじめてのテストのコードの説明

テストのコードについてより詳しく説明します。

はじめてのテストのコード:

// hello.test.js
import assert from "node:assert";
import test from "node:test";

test("1と2の合計は3です", () => {
  assert.strictEqual(1 + 2, 3);
});

このコードは、「1と2の合計は3です」というテストを意味します。 式 1 + 2 が、 3 と等しいことを検証するテストです。

このコードでは下記の機能が使われています。

test() 関数

テストを宣言するための関数です。

  • 第一引数には、このテストの説明を人間が読める形式で記述します
  • 第二引数には、テストの本体を記述します

assert.strictEqual() 関数

引数に与えた値を検証します。

assert.strictEqual(<検査される値>, <期待する値>)

「検査される値」と「期待する値」の同一性を検証します。

最初の行は import 文によって node:assertnode:test を指定しています。

import assert from "node:assert";
import test from "node:test";

これらがNode.jsのテストランナーの実行に必要となります。

このコードは基本的な機能を確認するための極めて単純なテストですが、テスト環境自体の検証を行うことでもあります。 テスト環境の検証は、テストを行う上で最初に確認しておく重要なポイントです。

基本的な機能

Node.jsのテストランナーの機能について説明します。

テストファイルの検出

デフォルトで下記のパターンに一致するすべてのファイルをテストファイルとして検出します1

  • **/*.test.?(c|m)js
  • **/*-test.?(c|m)js
  • **/*_test.?(c|m)js
  • **/test-*.?(c|m)js
  • **/test.?(c|m)js
  • **/test/**/*.?(c|m)js

テストの自動監視

--watch オプションを指定することで、テストファイルの変更を自動で監視します。

node --test --watch

終了するにはキーボードの Ctrl + CCtrlキーを押しながらC を押します。

Note
--watch オプションは Node.js v18 では利用できません。

プロジェクトでのテストコマンドの設定

この設定を行うと、npm test コマンドでテストを実行できるようになります。

package.jsonscripts プロパティの中を下記のように変更します。

{
  "scripts": {
    "test": "node --test"
  }
}

NPMコマンドでのテストの実行:

npm test

node --test コマンドの実行と同様のテスト結果が得られます。

テストの実践 ――「うるう年」問題

ここでは「うるう年」を判定するモジュールを作成します。 「うるう年」の判定は、通常広く使われている date-fns などのNPMパッケージを使用することが多いですが、ここではテストを学ぶためにあえて自分で実装します。 設計して、テストを書き、コードを書くという一連のステップでより実践的なテストとの付き合い方を学びましょう。

ECMAScriptモジュール

ECMAScriptモジュール (ESM) とは、JavaScriptをモジュールとして再利用できるようにするための仕組みです。

Node.jsでESMを取り扱えるようにするためには package.json ファイルに "type": "module" プロパティを加えます。

{
  "type": "module"
}

このように書き加えると、プロジェクトの .js ファイルはESMとして取り扱われます。

目標の決定

まず「何を作るか」明らかにしましょう。 何を作るか曖昧なまま、ただ無為にソフトウェア開発を進めるとムダを生む恐れがあります。 ムダを生まないためにできるだけ「何を作るか」を明確にしておきましょう。

「うるう年」を判定するということは、「西暦年号がうるう年ならば true を返し、そうでなければ false を返す関数」ということと決めます。

「うるう年」とは何であるかは、ここでは日本の法令を参考にして決めます。 日本の法令上の取り扱いは、明治時代に制定された「閏年ニ関スル件」によって決められています。

神武天皇即位紀元年数ノ四ヲ以テ整除シ得ヘキ年ヲ閏年トス但シ紀元年数ヨリ六百六十ヲ減シテ百ヲ以テ整除シ得ヘキモノノ中更ニ四ヲ以テ商ヲ整除シ得サル年ハ平年トス

―― https://elaws.e-gov.go.jp/document?lawid=131IO0000000090

「神武天皇即位紀元」は、通常の西暦年号でいう紀元前660年を元年とした暦を意味します。したがって「紀元年数ヨリ六百六十ヲ減シテ」とあるのは通常の西暦年号を意味します。 端的に言うと「グレゴリオ暦法に基づいています」ということを意味します。 このままだと大変読みにくいですね。 書き換えると下記のようになります。

西暦年号が4で割り切れる年はうるう年。ただし、西暦年号が100で割り切れる年のうち、100で割った商が4で割り切れない年はうるう年ではない。

これを「うるう年」とします。整理するとこうなります。

  • 西暦年号が4で割り切れる年はうるう年
    • たとえば、西暦2024年、2028年、2032年は4で割り切れるので、うるう年です。
  • 西暦年号が4で割り切れない年はうるう年でない
    • たとえば、西暦2021年、2022年、2023年は4で割り切れないので、うるう年ではありません。
  • ただし、西暦年号が100で割り切れる年はうるう年でない
    • たとえば、西暦2100年、2200年、2300年は100で割り切れるので、うるう年ではありません。
  • ただし、西暦年号が400で割り切れる年はうるう年
    • たとえば、西暦2000年、2400年、2800年は400で割り切れるので、うるう年です。

これで「何を作るか」ということが明らかになりました。 それでは、順番にテストとコードを書いていきましょう。

「西暦年号が4で割り切れる年はうるう年」

ファイル isLeapYear.test.js を作成します。 「何を作るか」ということを忘れないようにコメントに転載します。

// isLeapYear.test.js
/** TODO:
西暦年号が4で割り切れる年はうるう年
  たとえば、西暦2024年、2028年、2032年は4で割り切れるので、うるう年です。
西暦年号が4で割り切れない年はうるう年でない
  たとえば、西暦2021年、2022年、2023年は4で割り切れないので、うるう年ではありません。
ただし、西暦年号が100で割り切れる年はうるう年でない
  たとえば、西暦2100年、2200年、2300年は100で割り切れるので、うるう年ではありません。
ただし、西暦年号が400で割り切れる年はうるう年
  たとえば、西暦2000年、2400年、2800年は400で割り切れるので、うるう年です。
*/

うるう年であることを判定するので isLeapYear という名前に決めました。 この名前のモジュールと関数を作成することに決めます。

テストを書いていきましょう。

// isLeapYear.test.js
import assert from "node:assert";
import test from "node:test";

test("西暦年号が4で割り切れる年はうるう年", () => {
  assert.strictEqual(isLeapYear(2024), true);
});

これをテストし、失敗することを確認します。 この失敗は、テスト環境自体の検証を行うことでもあります。

NPMコマンドでのテストの実行:

npm test

テストの自動監視:

node --test --watch

Note
--watch オプションは Node.js v18 では利用できません。

テスト結果:

✖ 西暦年号が4で割り切れる年はうるう年

失敗しますね。 この失敗によって、次の2点を実証できました。

  • 目標の「西暦年号が4で割り切れる年はうるう年」というテストが実行されること
  • 未実装のコードが意図せず合格しない ❌ ということ

テスト環境の検証は、テストを行う上での重要なポイントです。

それでは、関数を実装していきましょう。 最初からすべての実装を書こうとせず、小さい変更のみで済ませるのがポイントです。

// isLeapYear.js
function isLeapYear(year) {
  return year % 4 === 0;
}

export default isLeapYear;

ファイルを作成したら、テスト側で import 文によって実装した関数を読み込みます。

// isLeapYear.test.js
import assert from "node:assert";
import test from "node:test";
import isLeapYear from "./isLeapYear.js";

test("西暦年号が4で割り切れる年はうるう年", () => {
  assert.strictEqual(isLeapYear(2024), true);
});

テストを実行します。

テスト結果:

✔ 西暦年号が4で割り切れる年はうるう年

これでテストは合格 ✅ しました。 念の為、西暦2024年のケースだけでなくほかのケースもテストしてみましょう。

「西暦年号が4で割り切れる年はうるう年」という目標を達成したと判断したら、コメントからは消しておきます。

// isLeapYear.test.js
import assert from "node:assert";
import test from "node:test";
import isLeapYear from "./isLeapYear.js";

test("西暦年号が4で割り切れる年はうるう年", () => {
  assert.strictEqual(isLeapYear(2024), true);
  assert.strictEqual(isLeapYear(2028), true);
  assert.strictEqual(isLeapYear(2032), true);
});

/** TODO:
西暦年号が4で割り切れない年はうるう年でない
  たとえば、西暦2021年、2022年、2023年は4で割り切れないので、うるう年ではありません。
ただし、西暦年号が100で割り切れる年はうるう年でない
  たとえば、西暦2100年、2200年、2300年は100で割り切れるので、うるう年ではありません。
ただし、西暦年号が400で割り切れる年はうるう年
  たとえば、西暦2000年、2400年、2800年は400で割り切れるので、うるう年です。
*/

次の目標「西暦年号が4で割り切れない年はうるう年でない」に進めていきます。

テストを書き、実行します。

必要に応じて実装を修正します。

これらのテストも問題なく合格するようになれば、「西暦年号が4で割り切れない年はうるう年でない」という目標も達成したと判断して、コメントから消しておきます。

// isLeapYear.test.js
import assert from "node:assert";
import test from "node:test";
import isLeapYear from "./isLeapYear.js";

test("西暦年号が4で割り切れる年はうるう年", () => {
  assert.strictEqual(isLeapYear(2024), true);
  assert.strictEqual(isLeapYear(2028), true);
  assert.strictEqual(isLeapYear(2032), true);
});

test("西暦年号が4で割り切れない年はうるう年でない", () => {
  assert.strictEqual(isLeapYear(2021), false);
  assert.strictEqual(isLeapYear(2022), false);
  assert.strictEqual(isLeapYear(2023), false);
});

/** TODO:
ただし、西暦年号が100で割り切れる年はうるう年でない
  たとえば、西暦2100年、2200年、2300年は100で割り切れるので、うるう年ではありません。
ただし、西暦年号が400で割り切れる年はうるう年
  たとえば、西暦2000年、2400年、2800年は400で割り切れるので、うるう年です。
*/

続きの課題

残りの目標に関しても同様に進めていきましょう。

  • ただし、西暦年号が100で割り切れる年はうるう年でない
    • たとえば、西暦2100年、2200年、2300年は100で割り切れるので、うるう年ではありません。
  • ただし、西暦年号が400で割り切れる年はうるう年
    • たとえば、西暦2000年、2400年、2800年は400で割り切れるので、うるう年です。

テストの作法

テストを書くときの代表的な作法を紹介します。

Arrange・Act・Assert (AAA) パターン

テストを書くときの作法の1つです。 準備 (Arrange)・実行 (Act)・検証 (Assert) というプロセスで分けて書きます。 準備・実行・検証をそれぞれ分けて書いておくことで比較的読みやすいテストを書くことができます。

例:

import assert from "node:assert";
import test from "node:test";

test("正しくJSONをパースできる", () => {
  // 準備
  const json = `{ "name": "Claude Monet", "birth": "1840" }`;

  // 実行
  const parsed = JSON.parse(json);

  // 検証
  assert.deepStrictEqual(parsed, { name: "Claude Monet", birth: "1840" });
});

参考文献・動画

Node.js

テスト駆動開発

和田卓人 (2010)「TDD のこころ」

和田卓人 (2020)「TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング」

安井力 (2021)「『テスト自動化とテスト駆動開発』講演動画」

質問・提案・問題の報告

もし何か気になることがあれば、GitHub Issues からお気軽にお寄せください。