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

2つのUnitテスト(Solitary Unit Test、Sociable Unit Test)

Posted at

はじめに

freeeさんのTechBlogを読んでいた所、Solitary Unit Testという単語が出てきました。
あれ?Solitary Unit Testって何??Unitテストってそんな種類があるの??と思い、UnitTestに関して調べることにしました。

Solitary Unit Testとは?

KentBeckが提唱するUnitテスト手法の1つ。

image.png
Martin FowlerのUnitTestから引用

KentBeckはUnitTestはSociable Unit TestSolitary Unit Testの2種類あると定義。

  • Solitary Unit Test(孤立型)
    • モックやスタブを使い、対象を完全に切り離してテスト
    • テスト失敗の原因が明確になる
  • Sociable Unit Test(社交型)
    • 依存クラスも本物を使って一緒に動かす
    • クラス単体ではなく協調も含めて確認できる

→なるほど。クラスや関数単体のテストをUnitTestと理解してたけど、依存クラスも含めてUnitTestと呼んでいるんですね。感覚的には、Sociable Unit Testは結合テストな気がするけど切り分けが違うんですね。
あれ?そうするとUnitTestとIntegration Testの違いはなんなんでしょうか??🤔

「ユニット」の定義は?

  • ユニット = 最小の関心ごと
  • クラスや関数に限定されるわけではなく、モジュールやサービスも「ユニット」となりうる
  • そのため Sociable Unit Test(依存も一緒に動かすテスト) もユニットテストに含まれる

👉 Kent Beck にとっては「小さなまとまり」であればまだユニットテスト。

Unit Test と Integration Test の違い

項目 Unit Test(ユニットテスト) Integration Test(結合テスト)
対象範囲 小さな単位(関数・クラス・モジュール) 複数ユニット+外部システムの連携
依存の扱い モックやスタブで置き換える(Solitary) or 自分のコードの依存を一緒に使う(Sociable) 実際の DB・ファイル・ネットワーク・外部APIを使う
目的 コードの振る舞いを明確に検証する システム全体が正しく連携するかを確認する
速度 高速(ミリ秒〜秒単位) 遅い(秒〜分単位)
壊れやすさ 壊れにくい(依存が隔離されているため) 外部要因で壊れやすい(DBやAPIの状態に依存)
失敗の原因特定 明確(対象コードの責任範囲に限定できる) 曖昧(どのコンポーネントが原因か切り分けが必要)
Kent Beckの整理 Sociable も Solitary も「まだユニットテスト」 外部システムに接続した時点で「結合テスト」

ポイントまとめ

  • ユニットテスト: コードの「最小単位の振る舞い」を保証するもの
  • 結合テスト: ユニット+外部システムとの「接続・連携」を保証するもの

さいごに

KentBeckが提唱するSolitary Unit TestSociable Unit Testに関して学びました。
今後も僕の中では、Sociable Unit Testは結合テストと定義付けておきますが、定義の切り分けがある事はいいなと思います。テストの粒度を合わせる時に役立ちそうですね。

参考文献

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