はじめに
freeeさんのTechBlogを読んでいた所、Solitary Unit Testという単語が出てきました。
あれ?Solitary Unit Testって何??Unitテストってそんな種類があるの??と思い、UnitTestに関して調べることにしました。
Solitary Unit Testとは?
KentBeckが提唱するUnitテスト手法の1つ。
KentBeckはUnitTestはSociable Unit TestとSolitary 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 Test、Sociable Unit Testに関して学びました。
今後も僕の中では、Sociable Unit Testは結合テストと定義付けておきますが、定義の切り分けがある事はいいなと思います。テストの粒度を合わせる時に役立ちそうですね。
参考文献