10年前に作っていた2水準系直交表割り当てプログラムを作りなおしてみました。
直交表割り付けシミュレーション
FLMatrix
10年前は多水準化で問題があったので、そのあたりを中心に実装を見直しています。
正常系テストとか異常系テストとかふだん使ったりします。この本では、機能が働くテストを「正常系」、機能がエラーなどで最後まで働かないテストを「異常系」と表現しています。また、異常に対して正しく実行できたことを確認するテストとして「準正常系」という考え方も紹介されています。何気なく使っているけど、もしかしたら人(文化?)によって定義が異なるかもしれない用語を自分なりに整理してみました。
エラーを検知して、それを結果として出すこと。僕の場合は、実装時(ユニットテスト時)ではなるべく最初に確認します。それは、因子の積集合(テスト空間と呼ぶこともある)があって、それを同値分割していくイメージです。たいていの場合は、無効同値クラスを削っていって、削っていって、最後に有効同値クラスがいくつか残ります。防御的プログラミングの視点を意識します。
機能が働き、正しい結果を期待通り出すこと。僕の場合は、実装時(ユニットテスト時)ではなるべく最後に確認します。準正常系を削った後に残った有効同値クラスを期待する結果でさらに同値分割します。一旦は考えうる同値分割を想像して、ズームアウトしてバランスをとります。
この本ではエラーによって最後まで機能を果たさないことを確認するテストですが、僕の場合は、実装とは直接関係しない因子と考えています。タイミングの問題やネットワーク状態、負荷など実行しにくい場合が多く、ユニットテスト時には確認しないことが多いです。準正常系や異常系とは異なり、ラルフチャートを思い浮かべて、因子抽出を心がけます。
また、一般的に異常系(あるいは無効値)は一つずつしか確認できないといいますが、すべての因子の無効値を組み合わせた場合は、異常系として確認します。
同値分割やデシジョンテーブル、直交表などを一般的にはテスト技法と呼びますが、「技法」ってなんだろう? とふと思ったのがきっかけでした。そして、技法、技、技術、・・・、といろいろな言葉を調べていて、「技」「術」「芸」の3つについて自分の中での定義を作り、ワークショップの最後に発表しました。
※もともとはウィキペディアに記述されている定義を参考にしています。
まずは技(わざ)。
技(わざ)とは、「特定の目的を持ち、その目的を果たすための手段・手法」、である。絵にもあるように、関節を攻めるための関節技のように、具体的な目的・標的があって、それを実現する手段である。逆にいえば、目的が合致しない場合はその技は効力を発揮できない。テスト技法と呼ばれるもののいくつかは、この「技」に分類できるのではないか。
次は術(じゅつ)。
術(じゅつ)とは、「技を体系的にまとめ、改変が施されて流派に分かれたり、統一されたすべ」、である。技よりもより体系化・フレームワーク化・パターン化されたり、いくつもの技の連なり・組合せを表すのではないか。テスト技法でいえば、テスト条件を同値分割を使ってグループ分けし、その境界値を狙う、といったものが当てはまる。戦術、あるいは戦法といった言葉に近づくイメージである。
最後は芸(げい)。
芸(げい)とは、「個性的・独創的で継承することが困難だが、作品を確認することで業績を知ることができる技能」
、である。結果については驚異的であり、劇的であり、感動すらありうるが、途中のプロセスはやや隠ぺいされているため、真似ることや教えること、説明することが難しい。当人にとっては理論的だが、それらの一部に飛躍が多いのかもしれない。
==
この3つについては、ある種の状態遷移というモデルが当てはまるのではないかと思いました。
「技」は鍛錬によって使い手のスキルとして身についていく。そして、「技」は体系化という行為によって「術」に変わる。技を覚えるだけでは、実践では役に立たない。それらを適切な場面、標的に使うことではじめて武器になる。また、「術」は使い手が日々磨きをかけていくとともに、アプローチの違いや特徴を持ち始め、流派が生まれることがある。
また、「技」は突如、独創性や直感的なエッセンスを得ることで「芸」に変化する。誤解を恐れずに言えば、突然変異かもしれない。そして、「芸」の驚異的な結果をどうにかして使いたいと思う。そのためには、「芸」を分析して、特定の切り口が解明されてくると、それはツール・道具となり、状態は「技」になる。
他にも遷移はあるかもしれないが、こういった「技」「術」「芸」の移り変わりがあってこそ、新しい考え方や概念が生まれ、ソフトウェア開発の質が向上し、ひいてはユーザへの価値が高まるのだ。
テスト技法やテスト手法を学び、プロダクトの品質を向上させつつ、こういった「技」「術」「芸」を磨くことも忘れてはならないなあと感じました。
※この記事は こちら からの一部修正をした転載です。
秋山浩一さんに教わったCFD法における流れ図の描き方を下記の例題で試してみる。
- 横浜ベイクォーター
1店舗3,000円(税込)以上のお買上げで1時間無料 ※駐車券を売場でご提示ください。 2店舗目以降も各店舗3,000円(税込)以上のお買上げで 1時間の駐車サービス券をお渡しします。
- そごう横浜店
2,000円(税込)以上のお買上げで1時間30分無料
※駐車券を売場でご提示ください。
今回は駐車料金、特に「駐車料金がどれだけ無料になるか」を確認することが目的。1時間無料、1時間半無料、2時間無料、・・・、無料でないといった結果が考えられる。2時間無料以降は、N時間無料とした(Nは2以上の正数、以後も同じとする)。ということで、「N時間無料」「1時間半無料」「1時間無料」「無料でない」の4つの結果をお得な順序で上から配置した。
4つ結果すべて有効結果ともみなせる(無料でない場合は、次にいくらになるかの処理に進むため)が、今回は「無料でない」は無効結果とした。drawCFDでは右クリックで有効結果・無効結果を切り替えられる。
仕様ではまず、「横浜ベイクォーター」での買い物金額について言及しているので、この条件を(完全)同値分割する。
この入力条件が引き起こす結果としては、「1時間無料券がN枚」「1時間無料券が1枚」「無料でない」の3つ。ということは同値分割も3つになりそうだ。ということで「N店舗で3000円以上買い物」「1店舗で3000円以上買い物」「どの店舗でも3000円未満の買い物」となる。文言は少し変えました。
次に判定するのは、「横浜そごう」での買い物金額について。ここでの買い物が影響を及ぼす結果としては、「1時間半無料」「無料でない」の2種類。ということで、「2000円以上の買い物」「2000円未満の買い物」の(完全)同値分割を考えた。同じく、文言は少し変えました。
どれも有効系同値クラスとした。
流れ図は、結果から探していく。上に配置された結果からそこにつながる流れを以下の手順で見つけていった。
仕様から、横浜ベイクォーターでN店舗で3000円以上の買い物をした場合、とわかる。横浜そごうでの買い物は関係しないので、
IF ベイクォーター is N店舗3000円以上
THEN N時間無料
他の条件はない。ということで「N時間無料」に結ばれる流れはこれでおしまい。
仕様から、横浜そごうで2000円以上の買い物をした場合、とわかる。では、そのひとつ前の「ベイクォーター」同値図のどこから結ばれるか?
「N店舗3000円以上」だと、結果が「N時間無料」となるので、ありえない。
「1店舗3000円以上」だと、ありえる。ということで、
IF ベイクォーター is 1店舗3000円以上 AND 横浜そごう is 2000円以上
THEN 1時間半無料
仕様から、横浜そごうで2000円以上の買い物をした場合、とわかる。では、そのひとつ前の「ベイクォーター」同値図のどこから結ばれるか?
「N店舗3000円以上」だと、結果が「N時間無料」となるので、ありえない。
「1店舗3000円以上」だと、ありえる。でもさっき通った。
「3000円を超えない」だと、ありえる。ということで、
IF ベイクォーター is 3000円を超えない AND 横浜そごう is 2000円以上
THEN 1時間半無料
他の条件はない。ということで「1時間半無料」に結ばれる流れはこれでおしまい。
横浜そごうで2000円以上の買い物をした場合、1時間無料ではなくなるので、「2000円を超えない」を通ることがわかる。では、そのひとつ前の「横浜ベイクォーター」同値図のどこから結ばれるのか?
「N店舗3000円以上」だと、結果がN時間無料」となるので、ありえない。
「1店舗3000円以上」だと、ありえる。ということで、
IF ベイクォーター is 1店舗3000円以上 AND 横浜そごう is 2000円を超えない
THEN 1時間無料
横浜そごうで2000円以上の買い物をした場合、1時間無料ではなくなるので、「2000円を超えない」を通ることがわかる。では、そのひとつ前の「横浜ベイクォーター」同値図のどこから結ばれるのか?
「N店舗3000円以上」だと、結果がN時間無料」となるので、ありえない。
「1店舗3000円以上」だと、ありえる。でもさっき通った。
「3000円を超えない」だと、ありえない。ということで、他の条件はない。
横浜そごうで2000円以上の買い物をした場合、ありえないので、「2000円を超えない」を通ることがわかる。では、そのひとつ前の「横浜ベイクォーター」同値図のどこから結ばれるのか?
「N店舗3000円以上」だと、結果がN時間無料」となるので、ありえない。
「1店舗3000円以上」だと、結果が1時間無料」となるので、ありえない
「3000円を超えない」だと、ありえる。ということで、
IF ベイクォーター is 3000円を超えない AND 横浜そごう is 2000円を超えない
THEN 無料でない
他に条件はない。ということで終了。
以上のような考え方で作成しました。
※この記事は こちら からの一部修正をした転載です。
試しに、直交表に割りつけてみた。
「今、食べたいラーメン」
腹が減りました。とてもラーメンが食べたいです。でも、どんなラーメンでもいいわけではありません。以下の条件を参考に、食べたいラーメンになるように原因結果グラフを作成してください。
- 味はしょうゆか塩か味噌のいずれかが良い。普通の胃袋なので1 杯で十分です。
- 昨日はステーキを食べたので、こってりではないほうが良い。
- しょうゆか塩の場合は、とんこつベースが良い。
- 味噌の場合は野菜がたっぷり入っているものが良い。
- トッピングは絶対に付けたい。金に糸目はつけないので味玉、刻み玉ねぎ、焼き海苔の中から最低1つは付けたい。
16番目の組合せだけが説明文通りの「食べたいラーメン」だけど、他の15通りで「食べたいラーメン」があるかもしれないー。
※この記事は こちら からの転載です。