HexWolf Blog

「単体テストって何?」からユニットテストの用語を整理してみた

はじめに

とあるWeb広告で「ユニットテストを書いてPRを作ってください」みたいなAIに指示するみたいなのがあったのですが、当方こう思いました。
「ユニットテストってなんだ…?」と。
私はRailsを使っている関係上、Request SpecとかModel Spec、System Specは知っていますけどユニットテストとか結合テストがイマイチ繋がらなかったので調べてみることにしました。
基本情報半年前に受けてるのにテストの用語分からないとかマジ?

対象者

  • 私みたいにIT用語が知りたい人向け
  • テストの基本を知りたい人向け

そもそもソフトウェアテストとは

開発したソフトウェアが想定通りに動くかを評価・検証して品質を担保するために実施されるものです。
テストの主な目的としてはバグを検出することです。項目の消化を目的にせずバグを必ず見つけるくらいの意気込みでテストを作成していきます。
ただしテストは「欠陥がある」ことは証明できますが、「欠陥がない」ことは証明できません。
故にそのソフトウェアはテストをクリアしたとしても「たまたま」バグがでなかっただけで内部的に不具合があるかもしれないということは念頭に置く必要があります。

単体テストとは

ソフトウェアを構成するコンポーネント(関数、メソッド、クラス)が、設計通りに正しく動作するかを個別に検証するテストです。

V字モデル

V字モデルという開発工程とテスト工程の対応関係を視覚的に表した画像ですが、詳細設計に対応するのが単体テストになります。用語的にはユニットテストとも言います。
筆者が扱うRuby on RailsのRSpecではModelSpecが単体テストとなり、バリデーションやスコープ、インスタンスメソッドが対象となります。

RSpecでの実践例

RSpec.describe User, type: :model do
  describe 'validations' do
    it '名前が空だと無効であること' do
      user = User.new(name: nil)
      expect(user).to be_invalid
      expect(user.errors[:name]).to be_present
    end
  end

  describe '#adult?' do
    it '20歳以上ならtrueを返す' do
      user = build(:user, age: 20)
      expect(user.adult?).to be true
    end
  end
end

目的

単体テストを作る目的として

  • 壊れた箇所の特定が速い
  • リグレッションの早期発見
    • リグレッション:ロジック修正時に別の機能が意図せず壊れること
    • 単体テストがあれば、この破壊を早期に検知できる
  • 「テストが書きにくい=設計が悪いサイン」に気づける(モックだらけになるクラスは依存過多)

というのが上げられます。少なくともテーブルを1つ作る度に1つはModel Specを作るのが自然な流れでしょう。

まとめ

単体テストはユニットテストともいう。RailsアプリにおいてはModel Specが単体テスト。

こうやってまとめてようやく用語の理解が進みそうです。今作ってる簡単なアプリではちょうどテストに悩んでいるところだったのでちょうどいい感じがします。Zennに書くほどでもない車輪の再開発とかそのあたりの基本用語はこうやって個人ブログに乗せたいなと思います。