ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

テスト条件とは何か

「テスト条件」とは何かが分からず悩んでいたところ、にしさん (@YasuharuNishi) にTwitter上でレクチャーいただくという、貴重な機会をいただきました。このやり取りをまとめることは同じ悩みを抱えた方の手助けになると考え、本記事を公開するに至りました。

今回は編集をせず、スレッドの流れの整理にとどめ、やり取りをそのままに引用しています。

なお、私は文中で「(ぱと)」若しくは「@pato_taityo さん」となっています。

https://twitter.com/pato_taityo/status/1349519598501052420 のスレッドより。

(ぱと)

今更ながら、テスト条件とテストケースの違いが判らなくなってきた…。より正確には「テスト条件」とは何かが分からなくなった。「入力Aと入力Bを加算した結果を表示すること」は(具体的な)テスト条件で、それを操作(テスト)手順に落とし込んだものがテストケース…?

テスト条件について調べるうちに、西さん(@YasuharuNishi)の解説に行きあたって、より分からなくった面もある。
テスト条件とテスト観点 - Togetter
この説明からはテスト条件⊆テスト観点の関係にあるようにも読み取れる。が、その理解でよいのだろうか。まだ何か理解しきれていない気がするんだよなぁ。

(にしさん)

組織や人によって、テスト条件やテスト観点という概念の使い方は様々ですからね。私流でよろしければお答えしますよ。 (^_^)

(ぱと)

ぜひお願いします!まとめを何度も読み返したのですが、私に前提の理解や知識が足りていないため、理解しきれませんでした。まず、テスト条件やテスト観点をどのように定義しているのでしょうか?ここでは西さん流で構いません。

(にしさん)

遅くなってすみません。まず、私はテスト条件という用語は厳密に使いません。抽象的なものを表す時も、具体的なテスト値を表す時もあります。その時話しているテストタイプによりますが、テストケースを実行する際に入力として扱うようなものを表すことが多いです。これらは相手の理解に合わせてます。

で、テスト観点を理解するためには、少なくとも3つのことを理解しておかなくてはなりません。抽象度と、テストケースの構成要素、バグの検出への影響です。

抽象度は一番理解しやすいと思います。テストケースを設計するときには、具体的な値を示すもの(例: 東135°•北38°)と、抽象的なもの(例: 経度•緯度、位置情報)といった抽象度を区別しなくてはなりません。そこで前者をテスト値、後者をテスト観点と呼んでます。

後者のうち最も具体的なもの(テスト値より1段階だけ抽象的なもの)をボトムテスト観点やパラメータと呼んでます。最も抽象的なものをトップテスト観点やビューと呼んでます。

前者がインスタンスで、後者がクラスのようなもの、とざっくり考えるとわかりやすいかもしれません。

テスト条件という用語は、割と両方を意味してしまいます。区別したい時には高位テスト条件と呼ぶ人もいますね。

まぁ厳密には親テスト観点と子テスト観点の間の関係は「抽象度」だけではないのですが、それはまた今度。

次に構成要素ですが、一般にテストケースは、事前条件、テスト条件、トリガー、テスト対象、テスト環境、期待結果など、様々な要素から構成されます。

これらは典型的な例だと区別しやすいのですが、実務では区別しにくい場合があります。例えば構成テストタイプ(動作環境を変更するテストタイプ)で、周辺機器を変えるテストをしたい時、周辺機器はテスト条件でしょうか、テスト環境でしょうか。

この問いって、不毛なんです。なので僕は、テストケースの目的を表すものをテスト観点と呼ぶことにしました。ですからこの例の場合、周辺機器はテスト観点と呼びます。

じゃあ例えば周辺機器がSSDだとして、書き込みや読み込みといった機能や、何メガバイトのデータを読み書きするのかといった量はどう扱うのでしょう。僕は、SSDでバグを出すために考えなきゃいけないのであれば、それらもテスト観点として扱います。

厳密には、これはバグ検出型のテスト設計と保証型のテスト設計で変わりますが、それはまた今度。

つまりテスト条件という用語は一般に、抽象度を区別せず、テストケースの特定の構成要素に限定して意味することが多いです。テスト観点は僕の場合、抽象度を区別して、テストケースの特定の構成要素に限定せず、バグが出るかどうかに関係しそうかものを意味します。

と、書いてみましたが、多分この説明ではとても分かりにくいと思うので(説明が下手でごめんなさい)、色々聞いてくださいまし。 m(__)m

(ぱと)

解説をありがとうございました!心待ちにしていたので、大変うれしかったです。
何度も読み返したり、他の資料にもあたっているうちに、混乱してきてしまったので、追加で質問をさせてください。

(1)
テスト条件は入力に限定されるのでしょうか?
「条件」という響きから「AならばB」のとき、テスト条件がAのみを指しているように感じます(Aは入力でBは期待結果)。
ですが、『基本から学ぶテストプロセス管理』の用語集では「テスト条件」を「テストケース内のステップ、サブステップ、またはアクションの組み合わせをいくつか実行することによって生み出されるシステムの状態または状況。」と定義しています。これは出力(期待結果)を指しているように感じました。どのように解釈するのが正しいでしょうか?

(2)
テスト条件とテスト観点 - Togetter
以前のツイート群からは「テスト観点とは高位テスト条件である。テスト観点からテスト対象に合わせて具体的にしたものがテスト条件である。」というようにテスト観点とテスト条件は抽象度の違いであるととらえました。
ですが、今回の解説を踏まえると、単に抽象度の理解ととらえて良いのかわからなくなりました。

つまりテスト条件という用語は一般に、抽象度を区別せず、テストケースの特定の構成要素に限定して意味することが多いです。テスト観点は僕の場合、抽象度を区別して、テストケースの特定の構成要素に限定せず、バグが出るかどうかに関係しそうかものを意味します。

https://twitter.com/YasuharuNishi/status/1350838641489137665

このツイートでの「抽象度を区別する/しない」の説明とごっちゃになっているのが原因なのですが、どのように紐解いて理解すべきでしょうか。

大変お忙しいと思いますので、お時間と余裕があるときにご教示いただけますと幸いです。その間に私も思考を整理してみます。

https://twitter.com/YasuharuNishi/status/1351185878346039299 のスレッドより。
※このスレッドは少し横道へ逸れ、勉強方法に関するやりとりになっています。

(にしさん)

えーと、多分、@pato_taityo さんの勉強の仕方のために、混乱してると思われますので、その話を先にしますね。

高校までで習う数学や物理学、化学などに比べて、ソフトウェア工学はとても歴史が浅く、ソフトウェアテストはさらにもう少し歴史が浅いです。この差を理解しておかないと、勉強してて大混乱します。

歴史の深い技術や学問では、知識体系がきちんと整理されていますし、用語の定義もきちんと標準化されています。ニュートン力学は良い例だと思います。こういう技術では、どの先生から聞いてもどの参考書を読んでも同じことが書いてあります。

でもソフトウェアテストは歴史が浅いため、どの先生から聞いてもどの参考書を読んでも同じことが書いてあるわけではありません。「標準化されている」とは言えないわけです。

言い換えると、同じ用語でも、教える人や参考書が違えば、違う意味で使われます。聞いている方は大混乱ですよね。

しかも始末に負えないことに、教える人や参考書がそれぞれの概念をきちんと理解しているかどうかも保証できません。それじゃあ、聞いている方が理解できるわけがありません。

したがって一番混乱する勉強法は、Aさんに聞いたらこう言ってたけどBさんに聞いたらこう言ってて、なんか矛盾している、みたいに、色んな流儀をつまみ食いすることです。

なんとなく@pato_taityo さんからのご質問を読んでいて、そんな気がしています。

(ぱと)

ソフトウェアの他の分野でも比較的歴史が浅い&用語の定義がバラバラ、ということがありました。その分野を専門に扱う本は英語含め数冊しか無く、それらを見比べて解釈する、ということをしていました。それでもその時に上手くいっていたのは、知見を持つ方が解釈の道筋をつけてくれたからでした。

もし今回のように独学するのであれば、この著者はこの用語をこういう定義で議論を展開している、ということを念頭に置いた上で、議論全体の構成を理解する。と考え直したのですが、いかがでしょうか?

著者の考える定義が必ずしも説明されていないこともあり、このようなケースでは混乱しますが…。

(にしさん)

はい。仰る通りです。例えば、引用して頂いた「基本から学ぶテストプロセス管理」におけるテスト条件の定義ですが、確かに用語集にはそう書いてあるものの、本文でテスト条件について例を含めてきちんと書いてあるところを見つけられませんでした。

ざっと見ただけなので見落としかもしれませんので、もしご存じなら教えてください。 m(_)m

で、「基本から学ぶテストプロセス管理」では、テストケースがいわゆるテスト手順を含んでいますね。そしてこの本が準拠しているとされているIEEE829(-1998かな?)には、テスト条件(test condition)は定義されていません。(ちなみにIEEE829-2008も同様です。)

さて、ではこの本におけるテスト条件の定義は、何のために行われたのでしょう?どうも
@pato_taityo さんが考えてるものとは少し違うかもしれません。 (^^;

ちなみにISO/IEC/IEEE29119シリーズでは、「test condition. (1) testable aspect of a component or system, such as a function, transaction, feature, quality attribute, or structural element identified as a basis for testing」と定義されています。 https://pascal.computer.org/sev_display/index.action

ところで、@pato_taityo さんは、何をしたくて/知りたくてテスト条件を理解しようとしてらっしゃるのですか? (^_^)

(ぱと)

重ねて丁寧な返信を頂き、ありがとうございます。話題が分岐しており、それぞれに返信したいのですが、考えを整理するのに時間がかかって追い切れておらず、申し訳ございません…。分岐した話題については別途返信させてください。

知りたいことは「JSTQBシラバスにおける『テスト条件』とは何か」です。用語自体は頻出するのですが、シラバスということもあってか、解説や具体例はありません。用語集とTA「1.4テスト分析」に少し説明があるくらいでした。これでは私が理解するには情報が足りませんでした。

そこで他の資料(「基本から学ぶテストプロセス管理」もその一つです)に手掛かりを求めましたが、袋小路に迷い込んだ、というのが現状でした。レクチャー頂いた考え方を参考に今一度シラバスに立ち返ろうかと考えていましたが、他にすべき事があればご教示頂きたいです。

なお、テスト条件とは何かと言うことについて、具体例を持って説明した資料は今のところ見つけられていません。ご指摘通り「基本から学ぶテストプロセス管理」の本文内からも見つけられませんでした。

https://twitter.com/YasuharuNishi/status/1351188320752193536 のスレッドより。
※このスレッドでは本流に戻っています。

(にしさん)
で、@pato_taityo さんのご質問に答えます。

(1)a「テスト条件は入力に限定されるのでしょうか?」 --- されません。でも人というか流儀に依存します。入力だけを指す人もいます。

ISTQBでは「An aspect of the test basis that is relevant in order to achieve specific test objectives.」と書いてあります。抽象的ですね。

JSTQBではもっと補足して「コンポーネントやシステムのアイテムやイベントで、テストケースにより検証できるもの。たとえば、機能、トランザクション、フィーチャー、品質の属性、構造要素など」と書いてあります。

すなわちISTQB/JSTQBでは、テスト条件は入力だけに限定されません。

私もISTQB/JSTQBと同じように、テスト条件は入力だけに使いません。

(1)b「「条件」という響きから「AならばB」のとき、テスト条件がAのみを指しているように感じます(Aは入力でBは期待結果)。」 --- はい。そう思うのも無理はありません。初心者ならそれでよいと思います。

でも例えば構成テストの場合、様々な動作環境に変更しても動くかどうかをテストしますが、入力値はどの環境でも同じであるテストケースかもしれません。この場合、テスト条件は入力値ではなくて、「様々な動作環境」を指す方が設計しやすいです。

だってテスト設計って、テスト条件を色々変えていきますよね。構成テストで変えたいのは入力値じゃなくて動作環境ですから。

そうすると、動作環境は入力値ではないということで、(1)bの答えになります。

(1)c「『基本から学ぶテストプロセス管理』…では…「テストケース内のステップ、サブステップ、またはアクションの組み合わせをいくつか実行することによって生み出されるシステムの状態または状況。」と定義しています。これは出力(期待結果)を指しているように感じました。」

えーと、ご自分がこの本に沿ったテスト設計を身につけたいのでなく、単に用語確認のために使っているのであれば、この定義は忘れた方がよいと思います。

(2)「今回の解説を踏まえると、単に抽象度の理解ととらえて良いのかわからなくなりました。」 --- @pato_taityo さんがテスト条件をどう捉えているかが分からなかったので、抽象度以外のことも説明しました。でも一番分かりやすいのは、抽象度の違いだと思います。

引用して頂いたTogetterも、抽象度の違いだけとは言ってませんね。でもまずは、入力系に限定して、抽象度の違いについてしっかり理解しておくのがよいと思います。

多分ですね、矛盾なく全ての定義を理解しようとすると、ドツボにはまると思います。そうじゃなくて、自分はどういうテスト設計をしたいのか、その時にテスト条件やテスト観点という用語をどう使いたいのか、そう使って困ることはないのか、と考える方が実り多い気がします。

ちなみにテスト条件という用語は、あまりにも色んな人が色んな定義で使っていてよく分からんということで、今度改訂されるISO/IEC/IEEE29119シリーズでは削除される方向で議論されています。それくらい「テスト条件」という用語は、深く考えると理解しにくい用語なのです。

でもね、xSTQBやJTC1/SC7/WG26(ISO/IEC/IEEE29119シリーズを決めている人たち)の全員がちゃんと「テスト条件」という概念を理解しているか、というと、そうでもないのですよ。

顔も見たことない、分かってるかどうかも保証できない誰かの定義に頼るくらいなら、自分なりのテスト設計の方法を生み出しながら自分なりの定義をしてしまい、自分が「この人はよく分かってる」と感じる人と1対1で(オープンに)議論する方が実り多いし、実務に役立つと思います。

なんか上手く答えられている気がしないので、モヤモヤするところがあればいくらでも聞いてください。 (^_^)

(ぱと)

こんにちは。先日の書き込み以降、考えてみたことをまとめます。

JSTQBシラバスにおける『テスト条件』とは何か」という疑問に対し、明確な答えは出せていません。用語集の解説が答えなのかもしれませんが、それを自分の言葉で説明できないでいます。

JSTQBシラバスに答えを求めるなら、テストアナリスト「1.4 テスト分析」にテスト条件の具体例があります。ここでの例のうち、私なら「画面Xの機能性」はテスト観点に振り分けるものですし、「~正しい長さよりも一桁足りない~を拒否する」はテスト条件といわれてもしっくりきます。

抽象度を問わずこれらをひっくるめたものがJSTQBにおける『テスト条件』ではないか、と考えました。

このようなふわっとした理解(解釈)に対して不安はありますが、シラバスを読み直す中で気付きがあれば適宜見直せばよいかなと。

あと、シラバスはあくまで学習指針であり、その内容を一生懸命理解しようとするより、自分が学びたいことを学び、実践することがより大事なのではとも。JSTQB認定テスト対策だけを考えればだいぶ回り道かもしれませんが、ゴールは単に合格を目指すことではないので。

まとめるといいつつ、上手くまとめられませんでしたが、このように考えてみました。
もし考え違いなどあれば(そしてお時間があれば)、ご指導・アドバイスいただけますと幸いです。

(にしさん)

遅くなってすみません。有益なコメントになるかどうかは分かりませんが…。

@pato_taityo さんが何を悩んでおられるかの可能性を考えていたのですが、一つは「テスト条件という概念を何のために考えなきゃいけないのか」。もう一つは「何のために使うかは分かってて、どんなものがテスト条件になりえて、どんなものはテスト条件にならないのか」。かな、と思いました。

ツイートを読んでいると「テスト条件という概念を何のために考えなきゃいけないのか」については分かっていると思ってます。これを分かるということは、テスト開発のプロセスを分かっている、ということになりますね。

JSTQBシラバスは、分かって読まないと、テスト設計のプロセスや方法論が読み取りにくいかもしれません。詳しい手順としては書いてないので。でも考え方は書いてありますね。

「何のために使うかは分かってて、どんなものがテスト条件になりえて、どんなものはテスト条件にならないのか」については、色々考えておられて、かなり分かってこられた感じがします。

実は、この疑問はかなり高度な技術的課題なんです。テスト設計は、もの凄く初歩的なレベルだと「書き写し」でできてしまう気がするのですが、この疑問が出てくるレベルになると「モデリング」の知見や技術が必要になります。

高位レベルとか低位レベルなんていうのは、抽象度とか段階的詳細化というモデリングの概念をテストに適用したわけですね。

ですので、@pato_taityo さんが書かれていた「抽象度を問わずこれらをひっくるめたもの」がテスト条件という理解で問題ないと思います。

テスト条件という用語は非常に曖昧で、人によって使われ方が違いますからね。国際規格の次版では削っちゃった方がいい(別の用語を使うことでもっとしっかり定義した方がいい)という議論もされています。

何か少しでもお役に立てるツイートだといいのですが、気になるところとか分かりにくいところは引き続き聞いてくださいね。 (^_^)

(ぱと)

私の言葉足らずなツイートに対し、言わんとしていることを汲み取って適切なアドバイス頂き、大変恐縮です。ありがとうございます。

ここまでに頂いた解説を読み返し、自分の言葉でまとめてみました。

開発プロセスでは単体テスト結合テストのようにテストレベルでステップを設定することがある。また、各テストレベル内でも開発プロセス同様のステップ(分析、設計、実装、実行)を踏んで進行することがある。

開発プロセスは要件という抽象度の高い物から、コード(実装)という具体的な物へ変換するプロセスである。適切なステップを踏むことで適切な変換を実現出来る。

テストも同様で、このテストの目的は何か。目的を実現するためにどうすれば良いのか。と、抽象度を徐々に下げる(具体化する)ことで、テストの目的に合ったテストケースを生成する事が出来る。

「テスト条件」はこの具体化の過程で使われる用語である。「テスト条件」の定義は定まっていない。一例として「どんな要素(例:機能、品質等)をテストしたいのか?を指す」の意味で使われることもある。

ALシラバス テストアナリスト「1.4 テスト分析」にテスト条件の具体例があり、「画面Xの機能性」は抽象度の高い例、「画面Xでは、正しい長さよりも一桁足りないアカウント番号を拒否する」は抽象度の低い(具体的な)例と言える。

今回のように用語の定義は必ずしも定まっていない。ただ、著者の中では何かしらの定義を持って記述しているはずなので、それが何であるかを意識しつつ、著者はその用語を使って何を主張したいのか読み解くと良い。

…と理解してみたところ、JSTQBでの用語の定義もストンと理解できました。最初からそう書いてあったのだけど、それの意味するところをようやく解釈できるようになりました。

JSTQBではもっと補足して「コンポーネントやシステムのアイテムやイベントで、テストケースにより検証できるもの。たとえば、機能、トランザクション、フィーチャー、品質の属性、構造要素など」と書いてあります。

https://twitter.com/YasuharuNishi/status/1351189133222432771

西さんの貴重なお時間を割いてレクチャー頂いた今回のツイート群はブログ等の形でまとめようかと考えています。同じように悩んでしまった方の一助になればと。

もし差し支えるようであれば個人メモに留めますので、その旨ご連絡頂けますと幸いです。

本当にありがとうございました!

泳げないヤツは沈めばいい、だが泳ぎ方は教えるべきだ

「泳げないヤツは沈めばいい」。今はわからないが、昔のマイクロソフトの育成ポリシーだ。

マイクロソフトは、十分な研修をしないことで有名だ。「泳げないヤツは沈めばいい」というのが、新人のルールだった。
闘うプログラマー[新装版] ビル・ゲイツの野望を担った男達

入社してから二か月、ハルプトゾクはオフィスにこもって、C言語のプログラミングを自習した。ウィットマーから本を一冊わたされ、後は自分でやれと言われた。泳げないヤツは沈めばいいのだ。大学では、プログラミング理論を学んでいた。プログラミングの実務は職場で学べると考えていた。しかし、しばらくすると、時間がかかりすぎているのではないかと心配になってきた。ウィトマーがいつ自分のオフィスに来て、クビを宣告するかわからないと思うこともあった。
闘うプログラマー[新装版] ビル・ゲイツの野望を担った男達

この育成ポリシーはIT業界で時折見かける。私が未経験でIT業界に入り、プログラマーとしてのキャリアを始めた時も引用したハルプトゾクのエピソードと同じ教育方法だった。時間がかかりすぎていて、いつかクビになるのではないかとおびえていた。

そして、私は今もIT業界の片隅にいる。泳ぎ切れたということなのだろう。だが、こんな生存者バイアスで語るのはもうやめよう。後輩がエンジニアとしての泳ぎ方(成長の仕方)を知らないのであれば、泳ぎ方を教えるべきだ。

泳ぎ方を教えることで成長のスピードが格段にアップする。そして、そこで教わった経験は次の世代へとつながっていく。

泳ぎ方を教えるというのは、手取り足取りすることではない。それは操っているだけに過ぎない。泳ぎ方を説明し、実際にやってみせる。次に泳がせて、良かった点と改善すべき点を伝える。想定したレベルに到達していなければ、要求レベルをステップに分解して、ステップ毎に教える。これを繰り返すことだ。

スキルは知識と経験の掛け算だ。知識だけなら独学できることもある。知識を効率よく身に着ける方法を伝授することもできる。一方、経験は実践しなければ身につかない。後輩に取り組むチャンスを与えることが重要だ。目の前の効率だけを考えれば、自分でやったほうが格段に早い。後輩に任せると自分の効率まで落ちるかもしれない。でも、後輩の将来のために任せるのだ。知識として泳法を知っていても、泳ぐ経験を積まなければ、泳げないままだ。

自分ができるからといって後輩にそのレベルを求めないことも重要だ。自分が休暇も費やしてスキルアップに勤しんでいるからといって、後輩にも同じことを求めてはいけない。自身のそんな姿勢を見せつつも、取り組み方は後輩に任せる。後輩の置かれている状況は後輩にしかわからない。その中でベストを尽くしていると信じるのだ。

後輩に学ぶ意欲が無ければ諦める。学ぶ意欲が無い方に教えても響かないし、いつまでたっても自分で学べるようにはならない。「泳げないヤツは沈めばいい」。厳しいようだが、やる気の無い方にはできることだけやってもらい、その分の余力を見込みある若者に費やすべきだ。

後輩が育つのには時間がかかる。学ぶ意欲のある後輩が伸び悩んでも見捨てないことだ。成長曲線には踊り場(プラトー)がある。この踊り場を突き抜けた時、急激に成長することがあるからだ。
天才にもおとずれるプラトーの正体とは? | 脳にまかせる勉強法 | ダイヤモンド・オンライン

私は意欲ある後輩の可能性を信じている。例えいつか別の道を歩もうとも、そこで活躍してくれると信じている。だから泳ぎ方を教え続ける。

「はじめて学ぶソフトウェアのテスト技法」の読解メモ

この記事について

「はじめて学ぶソフトウェアのテスト技法(リー・コープランド著)」は JSTQB認定テスト技術者資格 AL テストアナリスト のシラバスで参考文献として取り上げられたり、テストアナリストの過去問題解説でもお勧めの参考文献として挙げられています。

原書は "A Practitioner's Guide to Software Test Design" です。

A Practitioner’s Guide to Software Test Design (Artech House Computing Library)

A Practitioner’s Guide to Software Test Design (Artech House Computing Library)

  • 作者:Copeland, Lee
  • 発売日: 2013/12/31
  • メディア: ペーパーバック

この記事内で「本書」は日本語版の「はじめて学ぶソフトウェアのテスト技法」を指すものとします。

本書は特に前半のパートで誤記や説明不足な箇所が目立ちます。原書含め、現時点では正誤表を見つけることができませんでした。また、日本語版の出版社(日経BP社)にも問い合わせ*1を行ったことがあるのですが、初刷り当時の担当編集者が既に退職されているということで、確認できないこともありました。

そこで、誤記や説明不足な点に対し、これらを補足する目的で本記事をまとめることにしました。本記事の内容は私個人の見解です。本記事の内容に関して出版社は関知しておらず、問い合わせることはお控えください。

全般

iOSKindleアプリだと一部の表が黒塗り表示となります。私の環境では表5-5がその一例でした。PC版kindleアプリであれば正しく表示できていました。

第3章 同値クラステスト

雇用の社内規定のコード

この章で取り上げている雇用の社内規定の例を引用します。

0歳~16歳:雇用しない
16歳~18歳:パートタイムでのみ雇用
18歳~55歳:正社員として雇用
55歳~99歳:雇用しない

この社内規定では 16, 18, 55 歳が複数の区分で現れています。どちらの区分に属することを想定しているのかはその後のべた書きのコードでわかります。

If (applicantAge == 16) hireStatus = "パート";
If (applicantAge == 18) hireStatus = "正社員";
If (applicantAge == 55) hireStatus = "雇用せず";

ですが、続けて示されるコード例では条件式が不適切です。

If (applicantAge >= 0 && applicantAge <= 16)
	hireStatus = "雇用せず";
If (applicantAge >= 16 && applicantAge <= 18)
	hireStatus = "パート";
If (applicantAge >= 18 && applicantAge <= 55)
	hireStatus = "正社員";
If (applicantAge >= 55 && applicantAge <= 99)
	hireStatus = "雇用せず";

例えば16歳は1つ目のIf文で true となり "雇用せず" となりますが、2つ目のIf文でも true となり "パート" に上書きされます。結果は想定通りですが、見通しの良いコードではありません。

実はこのコードは「第4章 境界値テスト」で欠陥のあるコードとして取り上げられており、そこでの伏線としてあえてこのようにしていると考えられます。

例題2の誤記

有効な値は 1 以上、9999 以下です。有効な入力値の集合としては {1, 22, 333, 4444}、無効な入力値としては {42, 0, 12345, sqe, $#@%} が選べます。

無効な入力値の例の "42" は "-42" の誤記です。

第4章 境界値テスト

境界値分析は2ポイントか3ポイントか

この章では著者の意図をつかみかねる箇所がありました。

まず、境界値分析は境界値に対して2ポイントを選ぶ場合・3ポイントを選ぶ場合があります。詳細は下記の記事を参照ください。
境界値分析で分析する境界「値」について|Tsuyoshi Yumoto|note

本書から技法の解説のキーポイントを引用します。

各境界について、境界上の値、境界のすぐ下の値、境界のすぐ上の値を1点ずつ選んで、テストケースを作る。

これは3ポイント境界値分析の説明となります。

これを踏まえ、図4-1の境界値を確認します。ここでは下記の解説がありました。

収入の境界は、月額1,000ドルと月額83,333ドル(単位は米ドルとします)です。
テストデータの下端の箇所では {999ドル、1,000ドル、1,001ドル} を、上端の箇所では {83,332ドル、83,333ドル、83,334ドル} を、境界テスト用の値として選択します。

これは3ポイント境界値分析です。

次に例題1の解説を確認します。

このフィールドの入力は、1桁から4桁の数字 (0, 1, ... , 8, 9) です。このデータ長属性に関する境界値テストのテストケースは、{0, 1, 4, 5} 桁の数字となります。

とあり、これは桁数に着目した2ポイント境界値分析です。

つまり、特段の断りなく2ポイントと3ポイントの境界値分析の例が混在しています。

さらに混乱を招くのが「人材雇用アプリケーション」の例です。

前章では、人材雇用アプリケーションが個人の年齢によってどう処理を行うかを示すために、以下のルールを定めました。
 0歳~16歳:雇用しない
 16歳~18歳:パートタイムでのみ雇用
 18歳~55歳:正社員として雇用
 55歳~99歳:雇用しない
<中略>
私たちが考えている組織の意図しているルールは、おそらく次のようなものでしょう。
 0歳~15歳:雇用しない
 16歳~17歳:パートタイムでのみ雇用
 18歳~54歳:正社員として雇用
 55歳~99歳:雇用しない
<中略>
この例の境界、およびその近傍で注意を払うべき値は、{-1, 0, 1}、{15, 16, 17}、{17, 18, 19}、{54, 55, 56}、{98, 99, 100} です。

「注意を払うべき値」は修正後のルールから境界値分析をしても導くことはできません。修正前のルールに対し3ポイント境界値分析を行うことで導くことができます。
ただ、修正前のルールは不適切であり、それを境界値分析することは妥当ではないと考えています。

第5章 デシジョンテーブルテスト

表5-8 の誤記

はじめて学ぶソフトウェアのテスト技法 表5-8 誤記

表5-8の「条件」の上に "8" という記載がありますが、これは「ルール8」の "8" の位置が誤っています。

第7章 状態遷移テスト

すべてのイベントを最低1回起動するテストケース

はじめて学ぶソフトウェアのテスト技法 図7-11

「図7-11 すべてのイベントを最低1回起動するテストケース」で「入金済 → 顧客によるキャンセル」と「発券済 → 顧客によるキャンセル」のパスを通っていませんが、「キャンセル」というイベントは「成立 → 顧客によるキャンセル」のテストケースで起動したため、同じ「キャンセル」イベントによるパスは通らなくても良い、ということのようです。

第8章 ドメイン分析テスト

1×1ドメイン分析

1×1ドメイン分析の "1×1" が何を意味しているかを本書内で解説されていません。推測になりますが、関連すると思われる記述を引用します。

1 by1 selection criteria、つまり仕様を式に表して、各式に対して境界値をテストするとした選択基準を適用する際にはドメインテストマトリクスを作ればよいと書かれています。

ドメイン分析と言うテスト技法は他のテスト技法と何が違うのか?|Tsuyoshi Yumoto|note

ドメインテストマトリックスの使い方

はじめて学ぶソフトウェアのテスト技法 表8-1 ドメインテストマトリックスの例

「変数/条件のタイプ」をどのように設定すべきなのか、湯本さんの記事の例を参考に考えます。
ドメイン分析と言うテスト技法は他のテスト技法と何が違うのか?|Tsuyoshi Yumoto|note

チルド宅配パックの長さ制限として「長さ ≦ 100 cm, ≧ 1 cm」が示されています。これを表8-1には以下の通り当てはめられます。

  • X1 : 長さ
  • C11 : 長さ ≧ 1 cm
  • C12 : 長さ ≦ 100 cm

そして、C11, C12 の各条件に対して on ポイントと off ポイントを割り当てます。

C11 - on 1 cm
C11 - off 0 cm
C12 - on 100 cm
C12 - off 101 cm

湯本さんの記事のドメインテストマトリックスは各条件を列に割り当てていますが、表8-1ではこれを行に割り当てています。

以下の条件でドメインテストマトリックスを作成した例を示します。

  • 長さ ≦ 100 cm, ≧1 cm
  • 幅 ≦ 100 cm, ≧1 cm
  • 長さ+幅 ≦ 150 cm

チルド宅配パックのドメインテストマトリックス

表8-1の誤記

はじめて学ぶソフトウェアのテスト技法 表8-1 誤記

X2の代表値の横線がX2を突き抜けていますが、これは誤記です。

表8-4 の代表値選択ミス?

はじめて学ぶソフトウェアのテスト技法 表8-4

テストケース1では GPA = 4.0, ACT = 34, GPA/ACT = 3.9/35 が選ばれています。

ここで疑問なのが、テストケース内で矛盾していることです。GPA = 4.0, ACT = 34 なのですから、GPA/ACT = 4.0/34 を選ぶべきと思われます。

仮に GPA/ACT の in ポイントとしてだけ考えれば GPA/ACT = 3.9/35 も適切です。GPA/ACT の制約条件は "10 * GAP + ACT ≧ 71" です。GPA = 3.9, ACT = 35 の計算結果は 74 であり、制約条件を満たす代表値となります。

ただ、テストケース内で異なる GPA, ACT の値を使ってしまってはテストが実施できないため、この代表値の選び方は不適切と思われます。

第9章 ユースケーステスト

トランザクションテストに必要なリソース

Boris Beizer は、トランザクションテストではテストリソースの30%から140%が、テストデータの生成、収集、抽出に使われると言っています。

原書で確認したところ、『テストリソースの30%から140%』ではなく、『テストリソースの30%から40%』となっていました。

第10章 制御フローテスト

図10-5の実行パス

100%複合コンディションカバレッジを達成するためのテストケースとして以下の4つが挙げられていました。
a > 0, c = 1, b = 3, d < 0
a ≦ 0, c = 1, b = 3, d ≧ 0
a > 0, c ≠ 1, b ≠ 3, d < 0
a ≦ 0, c ≠ 1, b ≠ 3, d ≧ 0

これを図解します。
はじめて学ぶソフトウェアのテスト技法 図10-5 実行パス

構造化テストの基礎パスの組が必ずしも一意に決まらない?

構造化テストの説明に下記の記載があります。

必ずしも一意でない複数の基礎パスの組が作成可能なことに、気付かれたかもしれません。しかし、どの組から作成したテストケースを実行しても、すべてのステートメントとすべての分岐が実行されるという性質があります。

この『必ずしも一意でない複数の基礎パスの組が作成可能』が何を指しているのか、分かりませんでした。今後判明すれば追記します。

第11章 データフローテスト

動的データフローテスト

本書の解説だけでは手法が理解できず、日本語の記事を探しましたが、セミナー情報以外見つけることができませんでした。

"Dynamic Data Flow Testing" で検索すると複数の論文がヒットしましたが、英語&ボリュームがあるため、今回の調査では断念しました。

改めて再挑戦したいと考えています。

更新情報

2021/01/17

ドメインテストマトリックスの使い方」に具体例を追記しました。

*1:日経BP社はこうした問い合わせに対し、とても真摯に接してくれる出版社です。問い合わせても回答できない旨すら返してくれない出版社が多いことを踏まえると、日経BP社の姿勢に尊敬の念を抱いています。