ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

スモークテストとサニティテストとは何なのか

Sanity check"Sanity check" by foreverdigital is licensed under CC BY-NC-ND 2.0

 「サニティテスト」(sanity test)という言葉を聴くことがちょいちょいあったので、意味を捉えておきたいなと思っての記事です。なお、「本当の」「正しい」定義を見つけることが目的ではなく、「こんな風に捉えられていることが多そう」を理解することを意図しています。

 また、調べる過程で、自分がかつてまとめた以下のtogetterも見つけてしまったので、「テストタイプなのか、テストレベルなのか、テストフェーズなのか」 という議論も、ここではしません。

togetter.com

I/JSTQBでは

 まずはいつものここからですね。
 結論からいうと、サニティテストはスモークテストの類語とされています。

スモークテスト(smoke test)
定義・計画した全テストケースのサブセット。プログラムの必須機能が正常に動作することを確認するのが目的で、コンポーネントやシステムの主要機能を網羅し、細かな点は無視する。
Synonyms: コンフィデンステスト(confidence test), サニティテスト(sanity test)

 「スモークテスト」の方は、これでしっくりきます。本格的なテストを始めるにあたって、「そもそも最低限のところは動くよね」を一通り、さらっと見ることが目的です。ここでダメ、つまり最低限すらまともに動かないなら、それ以上テストをすることは無駄と判断できます。
 ネットワーク接続チェックの一番素朴なものであるpingになぞらえて、「疎通確認」という呼び方も聞いたことがあります。

スモークテストの由来

 Wikipediaを信じると、スモークテストはまず配管工事の分野で使われ、それが電気の分野に輸入され、さらにソフトウェアテストの分野に入ってきたようですね。

en.wikipedia.org

 配管の世界では、下水管などに対し無毒な煙を流し込んで全体を通過させ、パイプの劣化やひび割れを見つけるということを行っているようです。煙が漏れ出ていれば、そこに不具合(defect!)があるわけですね。

 電気の世界でこの言葉が拡張され、「回路基板の電源を入れた途端に煙が出てくるようなら、電源と落としてテストはおしまい」という拡張されたとのことです*1

 ここで、違和感を覚える人もいるかもしれません。
 電気の文脈では、「テストのしょっぱなの段階で、いきなりダメ」で煙が出るんですね。ソフトウェアのアナロジーだと、「インストーラが途中で止まる」とか「プロセスが起動しない」とか、そんな感じでしょうか。テストは始まってもいません。
 上のISTQBの定義の通り、ソフトウェアの文脈では「主要機能を網羅」するのがスモークテストなので、由来元の由来元である「全体を通過させ」る配管の文脈でのスモークテストの方が近いんですね。

 主要機能を網羅するとなると、わたしは自動リグレッションテストを連想してしまいます*2が、ISTQBの定義だと、リグレッションテストに限定していません。修正・変更後だけでなく、新しく作ったものを動かしてみる際にも、本格的なテストの前に軽く動かしてみる、これがスモークテストといえそうですね。

サニティテスト

 sanityというのは、「健全さ」「正気」という意味です。sanity testは「まともに動いているか」を確認するテストということになります。これだけだと、サニティテストとスモークテストは似たような印象ですね。

 両者の違いを説明した記事はけっこうあって、それぞれの主張があるのですが、共通的に見られる主張をテーブルにしてみると、以下のような対照がメジャーのようです*3

項目 スモークテスト サニティテスト
目的 プログラムの機能の主要な部分が正しく動作するかを確認するために行われる。 新しい機能の追加やバグの改修後が適切に行われたかを確認するために行われる。
特徴 浅く広いテスト。 (スモークテストに比べて)深く狭いテスト。
範囲 システム全体のEnd to Endが対象である。 システム全体の特定の部分が対象である。
対象 各ビルドに対して行われる。 比較的安定したビルドに対して行われる。
タイミング リグレッションテストの前に行われる。 スモークテストの後、リグレッションテストの前に行われる。
実施者 開発者、またはテスターによって行われる。 テスターによって行われる。
他のテストとの関係 受入れテストのサブセットである。 リグレッションテストのサブセットである。

 「他のテストとの関係」については、まったく逆の位置づけをしているサイトもあります。つまり、スモークテストがリグレッションテストの一部で、サニティテストが受入れテストの一部ということです。
 ただ上述の通り、I/JSTQBではスモークテストの実施タイミングを、プログラム修正に限ってない(プログラムの新規追加も対象にしている)ことから、上表での位置づけの方が親和性が高そうです。

終わりに

 用語の定義や、世の中で一定以上の共通認識があるものと、そうでないものがあります。「サニティテスト」は後者の一つのように思います。
 このような場合、組織やチームの中で定義を合意しておかないと、混乱のもとになります。
 スモークテストとサニティテストを別の概念として扱う場合の定義の一案として、この記事を参考にしていただければと思います。

参考サイト

*1:ただしこの話が載っているのはソフトウェアテストの書籍のようですが。

*2:パイプを煙が通過していく様子も、自動テストをイメージさせませんか?

*3:調べてみると、言い回しを含めて似たようなテーブルがたくさん出てきます。