| name | blackbox-covering |
| description | 独立した因子が多く全組合せが爆発するとき、因子の被覆や均等割付でケース数を縮約するブラックボックス技法群。 test-catalog の手法カタログの一部。ペアワイズ(Pairwise/All-pairs、全ペアを最低1回被覆)、 直交表(Orthogonal Array、全ペアを同回数で均等割付し主効果まで読む)、 T-way テスト(t個組の高次組合せと制約付き covering array) を検証したい、または割り当てたいときに使う。通常は test-catalog スキルの索引経由で 手法が選定された後にこのスキルを直接参照する。
|
| disable-model-invocation | true |
ブラックボックス設計技法(因子被覆による組合せ縮約)
独立した因子が多くて全組合せが爆発するとき、2要因(以上)の被覆や均等割付でケース数を縮約する技法群。
ここでは、全ペアを最低1回出すペアワイズ、全ペアを同回数で出す直交表、t 個組へ一般化した T-way テストをまとめる。
条件の論理関係や入力の多次元構造から導く論理ベース系(原因結果グラフ、クラシフィケーションツリー)は blackbox-cause-effect.md を参照。
これらも独立して使うものではなく、入力空間の分割技法の上に重ねる。
独立した因子が多くて全組合せが爆発するならペアワイズ、各水準の主効果まで読みたいなら直交表、3変数以上の相互作用が疑われるなら T-way へ進む。
入力空間の分割(同値分割、境界値分析、デシジョンテーブル)は blackbox-partition.md を、履歴と状態(状態遷移、CRUD/ライフサイクル)は blackbox-state.md を参照。
目次
ペアワイズ(Pairwise / All-pairs)
概要
多数のパラメータの全組合せではなく、任意の2パラメータのすべての値の対(ペア)が少なくとも1度現れる最小集合に絞る。
多くの欠陥が2要因の相互作用で起きるという経験則に依拠する。
近縁の直交表とは縮約の強度が違う。ペアワイズは網羅優先で、全ペアを最低1回出せれば各ペアの出現回数は不均等でよく、結果としてケース数が小さくなる。
目的/いつ使う
独立した設定項目が多くて全組合せが爆発するときに使う(OS × ブラウザ × 言語 × 通貨など)。
3要因以上の相互作用が疑われる箇所には不向きで、その部分だけT-way テストで別途網羅する。
各ペアを均等回数で出して要因の主効果まで見たいなら直交表を選ぶ。
TypeScript example
ペアワイズの組合せ生成はツール(@fast-check/... や allpairs 系)で作るのが筋。
ここでは生成済みのペアワイズ表をテストデータとして読み込み回す形を示す。
import { describe, it, expect } from "vitest";
import { render } from "./checkout";
import pairs from "./checkout.pairwise.json";
describe("checkout: pairwise coverage", () => {
it.each(pairs)("%o renders without error", (combo) => {
expect(() => render(combo)).not.toThrow();
});
});
落とし穴
- 「2要因で十分」は経験則。既知の3要因バグがあるなら、その組はペアワイズと別に明示追加する。
- 手で最小集合を組もうとしない。最小化は組合せ最適化で、ツールに任せる。
網羅の定義
- 網羅基準:任意の2パラメータ間の全値ペアが少なくとも1度現れたとき網羅完了(2-way カバレッジ100%)。
- 網羅手順:
- パラメータとその値域を列挙する。
- 実現不可な値の組合せを制約として定義する。
- covering array をツールで生成する。
- 生成表の各行を1ケースにする。
- 達成チェック:既知の3要因バグがペアワイズと別に明示追加されているか確認する。
- 組合せ生成が手作業でなくツール出力になっているか(手で組むとペア漏れが残る)を見る。
直交表(Orthogonal Array)
概要
統計的実験計画から来た割付表(L8、L9 など)を使い、任意の2因子間で全ての値の組合せが同じ回数ずつ現れるようにケースを選ぶ。
表記 L8(2^7) は、8行で2水準の因子を最大7本まで割り付けられることを表す。
ペアワイズと同じく2因子間の網羅を狙うが、縮約の強度が違う。
- 直交表は均等割付:全ペアが同回数で出る。そのぶんケース数は固定の表サイズに従う。
- ペアワイズは網羅優先:全ペアを最低1回出せれば回数は不均等でよい。多くの場合ケース数は直交表より小さくなる。
目的/いつ使う
均等割付なので、欠陥検出に加えて各水準の主効果(どの因子のどの水準が結果に効くか)まで読みたいときに使う。
因子数と水準数が既製の表(L4、L8、L9、L12、L16…)にうまく収まるときは、ツールなしで表を引くだけで割付が決まる。
収まらない(水準数が混在する、ケース数を最小化したい)ならペアワイズの covering array を選ぶ。
TypeScript example
L8 相当の割付表(2水準の因子3本)をテストデータとして読み込み、各行を1ケースで回す。
均等割付であることはコメントで残し、表自体は表引き(またはツール)で用意する。
import { describe, it, expect } from "vitest";
import { render } from "./checkout";
const rows = [
{ os: "win", browser: "chrome", lang: "ja" },
{ os: "win", browser: "safari", lang: "en" },
{ os: "mac", browser: "chrome", lang: "en" },
{ os: "mac", browser: "safari", lang: "ja" },
] as const;
describe("checkout: orthogonal array coverage", () => {
it.each(rows)("%o renders without error", (combo) => {
expect(() => render(combo)).not.toThrow();
});
});
落とし穴
- 水準数が因子ごとに違う(2水準と3水準が混在)と既製の表に素直に乗らない。無理に合わせると割付が崩れる。混在時は混合水準の表かペアワイズへ逃がす。
- 均等割付のためケース数が表サイズに固定され、ペアワイズより多くなりがち。最小化が目的なら直交表は選ばない。
- 表を自分で書き換えて直交性を壊さない。直交性(全ペア同回数)が崩れると、均等割付という利点ごと失う。
網羅の定義
- 網羅基準:採用した直交表の全行を踏み、任意の2因子間で全値ペアが同回数ずつ出現したとき網羅完了(均等な2-way カバレッジ)。
- 網羅手順:
- 因子とその水準数を列挙する。
- 因子数・水準数を収容できる最小の直交表(L8、L9…)を選ぶ。
- 各因子を表の列へ割り付ける。
- 表の各行を1ケースにする。
- 達成チェック:任意の2因子を取り出したとき、全ての値ペアが等しい回数で出ているか(直交性)を確認する。
- 水準数の混在で表に乗らないものを無理に詰めていないか見る。均等割付が要らないならペアワイズの方が少ないケースで済む。
T-way テスト(高次組合せと制約付き covering array)
概要
ペアワイズ(2-way)を一般化し、任意の t 個の因子のあらゆる値組合せを少なくとも1度出す(3-way、4-way…)。
あわせて、現実には起こり得ない値の組合せを**制約(constraint)**として宣言し、covering array から除外する。
目的/いつ使う
2-way では取りこぼす高次の相互作用、すなわち3変数以上が同時に揃って初めて出る欠陥が疑われるときに使う(例: 認証方式 × プロトコル × 暗号スイートの三つ組で初めて壊れる)。
全因子を一律に高次へ上げるとケースが急増するので、相互作用が疑われる因子群だけ t を上げ、残りは2-way に留めるのが筋。
禁止組合せ(実現不可能な値の対)があるときは、制約として covering array に渡し、無効ケースを生成段階で落とす。
TypeScript example
3-way の covering array を制約付きで生成するのはツールの仕事(@fast-check/...、PICT、ACTS など)。
ここでは生成済みの3-way 表を読み込み、各行を1ケースで回す。禁止組合せは生成側の制約で既に除いてある前提。
import { describe, it, expect } from "vitest";
import { authenticate } from "./auth";
import triples from "./auth.3way.json";
describe("auth: 3-way coverage with constraints", () => {
it.each(triples)("%o authenticates without error", (combo) => {
expect(() => authenticate(combo)).not.toThrow();
});
});
落とし穴
- t を上げるほどケース数が急増する。全因子を一律 3-way 以上にせず、相互作用が疑わしい因子群に絞る。
- 制約を書き落とすと、実現不可能な組合せをテストしてしまう。逆に制約を効かせ過ぎると、本来到達可能な組合せまで除外して網羅に穴があく。
- 制約で因子の一部が固定されると、その因子を含む t 個組のうち一部は構造的に到達不能になる。これを「網羅漏れ」と「制約による正当な除外」とで取り違えない。
網羅の定義
- 網羅基準:任意の t 個の因子について、(制約で除外したものを除く)全ての値組合せが少なくとも1度現れたとき網羅完了(t-way カバレッジ100%)。
- 網羅手順:
- 因子とその値域を列挙する。
- 相互作用の強さ t を因子群ごとに決める(全体一律でなくてよい)。
- 実現不可能な値の組合せを制約として定義する。
- 制約付き covering array をツールで生成する。
- 生成表の各行を1ケースにする。
- 達成チェック:制約除外後に残る t 個組の値組合せが全て出ているか確認する。制約により到達不能になった組合せは網羅対象から外し、未達(穴)と区別する(除外理由を1行残す)。
- 全因子を一律高次にしてケースが過剰に膨れていないか、t を上げた範囲が相互作用の疑われる因子に限定されているかを見る。
条件の論理関係や入力の多次元構造から縮約する技法(原因結果グラフ、クラシフィケーションツリー)は blackbox-cause-effect.md を参照。
入力空間の分割は blackbox-partition.md を、履歴と状態は blackbox-state.md を参照。