前回書いた記事について、まったく想定外の角度からのツッコミを受けました。
「はじめてのテスト」 って、なし→失敗じゃないの?
— あきやま🌱 (@akiyama924) 2020年3月14日
「期待」という言葉が未定義だったことに加えて、「テストの目的とは何か」という基本的な点で、人によって考え方が大きく異なることをあらためて認識しました。
テストの目的について
JSTQBのFoundation Sylabussの「1.1.1 テストに共通する目的」には、以下のように書かれています。番号はこちらで振っています。
- 要件、ユーザーストーリー、設計、およびコードなどの作業成果物を評価する。
- 明確にしたすべての要件を満たしていることを検証する。
- テスト対象が完成し、ユーザーやその他ステークホルダーの期待通りの動作内容であることの妥当性確認をする。
- テスト対象の品質に対する信頼を積み重ねて、所定のレベルにあることを確証する。
- 欠陥の作りこみを防ぐ。
- 故障や欠陥を発見する。
- ステークホルダーが意志決定できる、特にテスト対象の品質レベルについての十分な情報を提供する。
- (以前に検出されなかった故障が運用環境で発生するなどの)不適切なソフトウェア品質のリスクレベルを低減する。
- 契約上、法律上、または規制上の要件や標準を遵守する、そして/またはテスト対象がそのような要件や標準に準拠していることを検証する。
思ったよりたくさんありました*1・・・。
何らかの軸で、もう少しきれいに整理できそうな気もしますね。
さて、あくまで個人的な意見なのですが、テストケースを作るときには2つの気持ちがあります。
- いやここは仕様ややこしすぎるし絶対何かやらかす場所だよ、バグ見つけるぜ~
- まあここはね・・・ 何も起きないだろうけど、網羅性という意味では通さないとね・・・。
前者は、上述のJSTQBリストの6個目。後者は3個目です。
テスト実行していて楽しいのはもちろん前者です。後者のテストは、「対象のソフトウェアを学ぶ」という目的以外にはあまり魅力がない・・・。
いただいたご指摘は、「テストは fail した時に価値がある」という立場からのご指摘であり、上述リストの#6に重きをおいた価値観だと思います。
一方わたしは、「ソフトウェアの誤った部分に対し fail する」(真陽性)テストと、「ソフトウェアの正しい部分に対し pass する」(真陰性)テスト、どちらにも価値があると考えています。上述リストの#7の、「情報を提供する」という役割を果たすためです。
インフルエンザの検査を考えてみます。検査は偽陽性が出てもいいから陽性(患者がインフルエンザであることを)を見逃さないことが期待されます。
— あきやま🌱 (@akiyama924) 2020年3月14日
テストも同様です。
テスト対象のソフトウェアにバグが残っている前提に立つと、それを見逃さないで少ないテストが良いテストです。
「インフルエンザの検査」のアナロジーもとてもわかりやすいのですが、インフルエンザの検査が果たすべき役割についての考え方も、秋山さんとわたしで異なっていました。
秋山さんは陽性の人を漏れなく見つけることに重きをおき、わたしは陰性であるとわかることにも価値を感じるという立場で、テストについての考え方とまったく同じようにズレていたので、合意には至れませんでした(笑)。
テストの「期待」結果について
「目的」とか「価値」みたいな根本でズレているので、何を「期待」するかについて一致しないのはある意味当然ですね。
わたしとしては、「テスト屋はコケさすつもりでテストするけれど、実装側はしっかり動くつもりでテストに出してきている」みたいなイメージで、「テストが成功することを"期待"する」と表現していました。とはいえ、「たぶんいろいろボロが出るので、早めに叩いてもらえますか」みたいなケースもあるし、いろいろですね。
「期待」じゃなくて、以下の方が書かれているように「終了基準」とか、「この結果であれば次にいける」みたいな表現がよかったのかもしれませんね。
横からすみませんが、もしはじめてのテストが「なし→失敗」になるならばリグレも「成功→失敗」になる(といいますか今回成功を期待するテストは存在しない)と思います。
— ama/あまやん (@MZRSEN) 2020年3月15日
そもそも該当のマトリクスは「期待」ではなく「終了基準」であって、それであればマトリクスは正しいように見受けられます。
辰巳さんからは以下のようなご指摘をいただいています。
書かれている「成功/失敗」が、テストケースのpass/failと(Myersの)テストのsuccsess/unsuccessの2つの意味が混ざっているように感じました。pass/failは客観的事実で、succsess/unsuccessは主観的なもの。後者は誰の主観かという議論もあるかな。
— Keizo Tatsumi (@KeizoTatsumi) 2020年3月14日
記事で述べている pass / fail はあくまでも、「テストケースの成功/失敗」のことです。「テスターというロールにおける成功/失敗」ではありません。
後者だとすると、結局また「テスターとしての成功とは何か」という話になりますね・・・。
ともあれ、この手の議論は楽しく、また学ぶことも多いので、大好物です。コメントくださったみなさん、ありがとうございました。
*1:2018年のシラバス改訂で増えたとの情報を @nowsprinting さんからいただき調べたところ、Ver2011では以下の4つになっていました。
テストには以下のような目的がある。
* 欠陥を摘出する。
* 対象ソフトウェアの品質レベルが十分であることを確認する。
* 意志決定のための情報を示す。
* 欠陥の作りこみを防ぐ。