2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【NestJS】spec ファイルとは何か?なぜ必要なのか?(他言語フレームワークでも共通の概念)

Last updated at Posted at 2023-04-16

概要

「spec」とは何かについての備忘録。
本記事は NestJS を初めて触る人向けの記事だが、今回の内容は、他の言語やフレームワークでも同じ意味で登場するため、他の言語ユーザも参考にどうぞ。

NestJSの基本的な仕組みを知るために、モジュール/コントローラ/サービス の基本3概念と、spec ファイルとは何か、について紹介。

# 内容
1 基本概念・環境構築
2 基本3概念、モジュール/コントローラ/サービス とは
3 spec とは何か?(今回)

基本ファイル構成

前回の記事 で NestJS は基本的に 「モジュール(module)」「コントローラ(controller)」「サービス(service)」 の3つのクラスで構成されていると説明した。
nestjs_001.png

ここで、コマンドを使ってコントローラやサービスを自動生成すると、一緒に .spec.ts ファイルも作られる。これが何かを説明する。

spec ファイルとは

spec ファイルは、一言で表すと「テストコード」が書かれているファイル。つまり、プログラムの自動テストをするためのソースコードである。
NestJS の場合、「単体テスト(ユニットテスト)」 と、「E2E テスト」 を書くことができる(具体的な書き方は、また別の機会に)。

単体テスト

単体テストの spec は、「コントローラ」や「サービス」の 個別テスト ができる。入出力や繋ぎこみの部分は、スタブやモックを作成して、単体でも処理が動くようにする。
nestjs_003.png

E2E テスト

「E2E」とは「End to End(エンド・トゥー・エンド)」の略で、"端から端まで" という意味。

E2E テストの spec は、API 全体の処理テスト ができる。DB 部分や外部の別システムと連携する API 処理などは、スタブやモックを作成して、テスト処理が正常に動くようにする。
nestjs_004.png

spec の意味

そもそも「spec」とは 「Specification(スピシフィケーション)」 の略で、意味は "仕様"
つまり、実際やっていることはテストなのだが、目的は「動作確認をするためのファイル」ではなく「アプリの仕様を明示するためファイル」ということ。

『A という入力をされたら、B を返却してくれるよね?』『C という入力をしたら、エラーになるよね?』という、入力と期待結果を書いたプログラム であり、テストモードで動かすことで、期待した仕様通りになっていることを確認 するためにある。

spec ファイルは作成・更新すべき

上記に説明した意味合いから、spec ファイルには、想定される処理パターンを全て網羅して、テストコードが書かれているべきである。
また、これらは機能の新規作成や改修の度にメンテナンスし、コードレビューに一緒に載せるべきである。

spec ファイルは、存在しなくてもアプリケーションとしては問題なく動くので、テストコードが面倒で書かない(or ファイルを消す)人も多い。

しかし、ソースコードの修正や機能追加などで、ソースコードがどんどん膨らんでいった時に、『あれ、これ正しい動きなんだっけ?』『この処理の正しい仕様わかる人いる?』や『この場合は何が返ってくるのが正解だっけ?』など、処理の抜け漏れ、デグレ発生、新たなバグの発生などの要因を作らないために、できれば spec の書き方にも慣れおくべきだ。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?