組み合わせ
直交表に ついて
(株)日科技研:直交表とは
直交表とは,任意の
2因子(列)に ついて, その 水準の すべての 組合せが 同数回ずつ 現れると いう 性質を もつ 実験の ための 割り付け表です. 直交表には,いろいろな
ものが ありますが, これを 表すのに 一般に LN(PK)と いう 記号を 用います.Lは 直交表を 表す 記号(LATIN SQUAREに 由来)であり, Nは 実験の 大きさ(直交表の 行数), Pは 因子の 水準数Kは 直交表の 列数を 示しています.関係式は,N-1/P-1=Kと なります.
膨大な
- テストケース生成ツール
PictMaster プロジェクト日本語トップページ - OSDN で直交表を 用いた テストケースが 生成できるようです。
オールペア法に ついて
Pairwise Testing - Research Papers に
1因子も
N-wise testing
オールペア法(ペアワイズ法)は2因子の 組み合わせ 網羅の テストケースに なります。 1因子網羅の 組み合わせ 網羅の テストケースは one wise と いい、 N因子網羅の テストを N-wise testing
と呼ぶようです。 PICTは N因子の 組み合わせ 網羅の テストケース生成にも 対応しているので、 一部の 組み合わせのみ 厚く テストを 実施すると いう 用途にも 使用できます。 PICTの 使用方法は 以下の Qiita記事に わかりやすく 記載されています。 One wise
1因子の組み合わせ 網羅の テストケースを 生成してくれる JavaScript ライブラリが あります。
テストケース数は、因子の 中でもっとも 要素数の 多い 因子の 要素すうに 従って 生成されます。 有即と
無即、 デシジョンテーブルと、 オールペア法の 使い分け
有即と無即と いう 概念が あり、 それで デシジョンテーブルと、 オールペア法を 使い分けた ほうが 良さそうです。
以下のスライドが 参考に なりました。
allpairspy を インストールして 使ってみる
allpairspyと
allpairspy を
インストール
!pip install allpairspy
Collecting allpairspy Downloading https://files.pythonhosted.org/packages/58/23/7890aa2f8064c14462163cdf707828fbad1c21a26b3bacd30577042417fb/allpairspy-2.5.0-py2.py3-none-any.whl Requirement already satisfied: six<2.0.0,>=1.10.0 in /Users/kensakurai/Programing/Bitbucket/monotalk_blogs/contents/jupyter/.env_jupyter/lib/python3.7/site-packages (from allpairspy) (1.12.0) Installing collected packages: allpairspy Successfully installed allpairspy-2.5.0
Example の 実行
allpairspy · PyPI に
テストケース数を
from allpairspy import AllPairs parameters = [ ["Brand X", "Brand Y"], ["98", "NT", "2000", "XP"], ["Internal", "Modem"], ["Salaried", "Hourly", "Part-Time", "Contr."], [6, 10, 15, 30, 60], ] print("PAIRWISE:") for i, pairs in enumerate(AllPairs(parameters)): print("{:2d}: {}".format(i + 1, pairs))
PAIRWISE: 1: ['Brand X', '98', 'Internal', 'Salaried', 6] 2: ['Brand Y', 'NT', 'Modem', 'Hourly', 6] 3: ['Brand Y', '2000', 'Internal', 'Part-Time', 10] 4: ['Brand X', 'XP', 'Modem', 'Contr.', 10] 5: ['Brand X', '2000', 'Modem', 'Part-Time', 15] 6: ['Brand Y', 'XP', 'Internal', 'Hourly', 15] 7: ['Brand Y', '98', 'Modem', 'Salaried', 30] 8: ['Brand X', 'NT', 'Internal', 'Contr.', 30] 9: ['Brand X', '98', 'Internal', 'Hourly', 60] 10: ['Brand Y', '2000', 'Modem', 'Contr.', 60] 11: ['Brand Y', 'NT', 'Modem', 'Salaried', 60] 12: ['Brand Y', 'XP', 'Modem', 'Part-Time', 60] 13: ['Brand Y', '2000', 'Modem', 'Hourly', 30] 14: ['Brand Y', '98', 'Modem', 'Contr.', 15] 15: ['Brand Y', 'XP', 'Modem', 'Salaried', 15] 16: ['Brand Y', 'NT', 'Modem', 'Part-Time', 15] 17: ['Brand Y', 'XP', 'Modem', 'Part-Time', 30] 18: ['Brand Y', '98', 'Modem', 'Part-Time', 6] 19: ['Brand Y', '2000', 'Modem', 'Salaried', 6] 20: ['Brand Y', '98', 'Modem', 'Salaried', 10] 21: ['Brand Y', 'XP', 'Modem', 'Contr.', 6] 22: ['Brand Y', 'NT', 'Modem', 'Hourly', 10]
直積 (全組み 合わせ)との テストケース数の 比較
itertools.product
で
import itertools a = ["Brand X", "Brand Y"] b = ["98", "NT", "2000", "XP"] c = ["Internal", "Modem"] d = ["Salaried", "Hourly", "Part-Time", "Contr."] e = [6, 10, 15, 30, 60] print("PRODUCT:") for i, pairs in enumerate(itertools.product(a, b,c,d,e)): print("{:2d}: {}".format(i + 1, pairs))
PRODUCT: 1: ('Brand X', '98', 'Internal', 'Salaried', 6) 2: ('Brand X', '98', 'Internal', 'Salaried', 10) 3: ('Brand X', '98', 'Internal', 'Salaried', 15) 4: ('Brand X', '98', 'Internal', 'Salaried', 30) 5: ('Brand X', '98', 'Internal', 'Salaried', 60) 6: ('Brand X', '98', 'Internal', 'Hourly', 6) 7: ('Brand X', '98', 'Internal', 'Hourly', 10) 8: ('Brand X', '98', 'Internal', 'Hourly', 15) 9: ('Brand X', '98', 'Internal', 'Hourly', 30) 10: ('Brand X', '98', 'Internal', 'Hourly', 60) 11: ('Brand X', '98', 'Internal', 'Part-Time', 6) 12: ('Brand X', '98', 'Internal', 'Part-Time', 10) 13: ('Brand X', '98', 'Internal', 'Part-Time', 15) 14: ('Brand X', '98', 'Internal', 'Part-Time', 30) 15: ('Brand X', '98', 'Internal', 'Part-Time', 60) 16: ('Brand X', '98', 'Internal', 'Contr.', 6) 17: ('Brand X', '98', 'Internal', 'Contr.', 10) 18: ('Brand X', '98', 'Internal', 'Contr.', 15) 19: ('Brand X', '98', 'Internal', 'Contr.', 30) 20: ('Brand X', '98', 'Internal', 'Contr.', 60) 21: ('Brand X', '98', 'Modem', 'Salaried', 6) 22: ('Brand X', '98', 'Modem', 'Salaried', 10) 23: ('Brand X', '98', 'Modem', 'Salaried', 15) 24: ('Brand X', '98', 'Modem', 'Salaried', 30) 25: ('Brand X', '98', 'Modem', 'Salaried', 60) 26: ('Brand X', '98', 'Modem', 'Hourly', 6) 27: ('Brand X', '98', 'Modem', 'Hourly', 10) 28: ('Brand X', '98', 'Modem', 'Hourly', 15) 29: ('Brand X', '98', 'Modem', 'Hourly', 30) 30: ('Brand X', '98', 'Modem', 'Hourly', 60) 31: ('Brand X', '98', 'Modem', 'Part-Time', 6) 32: ('Brand X', '98', 'Modem', 'Part-Time', 10) 33: ('Brand X', '98', 'Modem', 'Part-Time', 15) 34: ('Brand X', '98', 'Modem', 'Part-Time', 30) 35: ('Brand X', '98', 'Modem', 'Part-Time', 60) 36: ('Brand X', '98', 'Modem', 'Contr.', 6) 37: ('Brand X', '98', 'Modem', 'Contr.', 10) 38: ('Brand X', '98', 'Modem', 'Contr.', 15) 39: ('Brand X', '98', 'Modem', 'Contr.', 30) 40: ('Brand X', '98', 'Modem', 'Contr.', 60) 41: ('Brand X', 'NT', 'Internal', 'Salaried', 6) 42: ('Brand X', 'NT', 'Internal', 'Salaried', 10) 43: ('Brand X', 'NT', 'Internal', 'Salaried', 15) 44: ('Brand X', 'NT', 'Internal', 'Salaried', 30) 45: ('Brand X', 'NT', 'Internal', 'Salaried', 60) 46: ('Brand X', 'NT', 'Internal', 'Hourly', 6) 47: ('Brand X', 'NT', 'Internal', 'Hourly', 10) 48: ('Brand X', 'NT', 'Internal', 'Hourly', 15) 49: ('Brand X', 'NT', 'Internal', 'Hourly', 30) 50: ('Brand X', 'NT', 'Internal', 'Hourly', 60) 51: ('Brand X', 'NT', 'Internal', 'Part-Time', 6) 52: ('Brand X', 'NT', 'Internal', 'Part-Time', 10) 53: ('Brand X', 'NT', 'Internal', 'Part-Time', 15) 54: ('Brand X', 'NT', 'Internal', 'Part-Time', 30) 55: ('Brand X', 'NT', 'Internal', 'Part-Time', 60) 56: ('Brand X', 'NT', 'Internal', 'Contr.', 6) 57: ('Brand X', 'NT', 'Internal', 'Contr.', 10) 58: ('Brand X', 'NT', 'Internal', 'Contr.', 15) 59: ('Brand X', 'NT', 'Internal', 'Contr.', 30) 60: ('Brand X', 'NT', 'Internal', 'Contr.', 60) 61: ('Brand X', 'NT', 'Modem', 'Salaried', 6) 62: ('Brand X', 'NT', 'Modem', 'Salaried', 10) 63: ('Brand X', 'NT', 'Modem', 'Salaried', 15) 64: ('Brand X', 'NT', 'Modem', 'Salaried', 30) 65: ('Brand X', 'NT', 'Modem', 'Salaried', 60) 66: ('Brand X', 'NT', 'Modem', 'Hourly', 6) 67: ('Brand X', 'NT', 'Modem', 'Hourly', 10) 68: ('Brand X', 'NT', 'Modem', 'Hourly', 15) 69: ('Brand X', 'NT', 'Modem', 'Hourly', 30) 70: ('Brand X', 'NT', 'Modem', 'Hourly', 60) 71: ('Brand X', 'NT', 'Modem', 'Part-Time', 6) 72: ('Brand X', 'NT', 'Modem', 'Part-Time', 10) 73: ('Brand X', 'NT', 'Modem', 'Part-Time', 15) 74: ('Brand X', 'NT', 'Modem', 'Part-Time', 30) 75: ('Brand X', 'NT', 'Modem', 'Part-Time', 60) 76: ('Brand X', 'NT', 'Modem', 'Contr.', 6) 77: ('Brand X', 'NT', 'Modem', 'Contr.', 10) 78: ('Brand X', 'NT', 'Modem', 'Contr.', 15) 79: ('Brand X', 'NT', 'Modem', 'Contr.', 30) 80: ('Brand X', 'NT', 'Modem', 'Contr.', 60) 81: ('Brand X', '2000', 'Internal', 'Salaried', 6) 82: ('Brand X', '2000', 'Internal', 'Salaried', 10) 83: ('Brand X', '2000', 'Internal', 'Salaried', 15) 84: ('Brand X', '2000', 'Internal', 'Salaried', 30) 85: ('Brand X', '2000', 'Internal', 'Salaried', 60) 86: ('Brand X', '2000', 'Internal', 'Hourly', 6) 87: ('Brand X', '2000', 'Internal', 'Hourly', 10) 88: ('Brand X', '2000', 'Internal', 'Hourly', 15) 89: ('Brand X', '2000', 'Internal', 'Hourly', 30) 90: ('Brand X', '2000', 'Internal', 'Hourly', 60) 91: ('Brand X', '2000', 'Internal', 'Part-Time', 6) 92: ('Brand X', '2000', 'Internal', 'Part-Time', 10) 93: ('Brand X', '2000', 'Internal', 'Part-Time', 15) 94: ('Brand X', '2000', 'Internal', 'Part-Time', 30) 95: ('Brand X', '2000', 'Internal', 'Part-Time', 60) 96: ('Brand X', '2000', 'Internal', 'Contr.', 6) 97: ('Brand X', '2000', 'Internal', 'Contr.', 10) 98: ('Brand X', '2000', 'Internal', 'Contr.', 15) 99: ('Brand X', '2000', 'Internal', 'Contr.', 30) 100: ('Brand X', '2000', 'Internal', 'Contr.', 60) 101: ('Brand X', '2000', 'Modem', 'Salaried', 6) 102: ('Brand X', '2000', 'Modem', 'Salaried', 10) 103: ('Brand X', '2000', 'Modem', 'Salaried', 15) 104: ('Brand X', '2000', 'Modem', 'Salaried', 30) 105: ('Brand X', '2000', 'Modem', 'Salaried', 60) 106: ('Brand X', '2000', 'Modem', 'Hourly', 6) 107: ('Brand X', '2000', 'Modem', 'Hourly', 10) 108: ('Brand X', '2000', 'Modem', 'Hourly', 15) 109: ('Brand X', '2000', 'Modem', 'Hourly', 30) 110: ('Brand X', '2000', 'Modem', 'Hourly', 60) 111: ('Brand X', '2000', 'Modem', 'Part-Time', 6) 112: ('Brand X', '2000', 'Modem', 'Part-Time', 10) 113: ('Brand X', '2000', 'Modem', 'Part-Time', 15) 114: ('Brand X', '2000', 'Modem', 'Part-Time', 30) 115: ('Brand X', '2000', 'Modem', 'Part-Time', 60) 116: ('Brand X', '2000', 'Modem', 'Contr.', 6) 117: ('Brand X', '2000', 'Modem', 'Contr.', 10) 118: ('Brand X', '2000', 'Modem', 'Contr.', 15) 119: ('Brand X', '2000', 'Modem', 'Contr.', 30) 120: ('Brand X', '2000', 'Modem', 'Contr.', 60) 121: ('Brand X', 'XP', 'Internal', 'Salaried', 6) 122: ('Brand X', 'XP', 'Internal', 'Salaried', 10) 123: ('Brand X', 'XP', 'Internal', 'Salaried', 15) 124: ('Brand X', 'XP', 'Internal', 'Salaried', 30) 125: ('Brand X', 'XP', 'Internal', 'Salaried', 60) 126: ('Brand X', 'XP', 'Internal', 'Hourly', 6) 127: ('Brand X', 'XP', 'Internal', 'Hourly', 10) 128: ('Brand X', 'XP', 'Internal', 'Hourly', 15) 129: ('Brand X', 'XP', 'Internal', 'Hourly', 30) 130: ('Brand X', 'XP', 'Internal', 'Hourly', 60) 131: ('Brand X', 'XP', 'Internal', 'Part-Time', 6) 132: ('Brand X', 'XP', 'Internal', 'Part-Time', 10) 133: ('Brand X', 'XP', 'Internal', 'Part-Time', 15) 134: ('Brand X', 'XP', 'Internal', 'Part-Time', 30) 135: ('Brand X', 'XP', 'Internal', 'Part-Time', 60) 136: ('Brand X', 'XP', 'Internal', 'Contr.', 6) 137: ('Brand X', 'XP', 'Internal', 'Contr.', 10) 138: ('Brand X', 'XP', 'Internal', 'Contr.', 15) 139: ('Brand X', 'XP', 'Internal', 'Contr.', 30) 140: ('Brand X', 'XP', 'Internal', 'Contr.', 60) 141: ('Brand X', 'XP', 'Modem', 'Salaried', 6) 142: ('Brand X', 'XP', 'Modem', 'Salaried', 10) 143: ('Brand X', 'XP', 'Modem', 'Salaried', 15) 144: ('Brand X', 'XP', 'Modem', 'Salaried', 30) 145: ('Brand X', 'XP', 'Modem', 'Salaried', 60) 146: ('Brand X', 'XP', 'Modem', 'Hourly', 6) 147: ('Brand X', 'XP', 'Modem', 'Hourly', 10) 148: ('Brand X', 'XP', 'Modem', 'Hourly', 15) 149: ('Brand X', 'XP', 'Modem', 'Hourly', 30) 150: ('Brand X', 'XP', 'Modem', 'Hourly', 60) 151: ('Brand X', 'XP', 'Modem', 'Part-Time', 6) 152: ('Brand X', 'XP', 'Modem', 'Part-Time', 10) 153: ('Brand X', 'XP', 'Modem', 'Part-Time', 15) 154: ('Brand X', 'XP', 'Modem', 'Part-Time', 30) 155: ('Brand X', 'XP', 'Modem', 'Part-Time', 60) 156: ('Brand X', 'XP', 'Modem', 'Contr.', 6) 157: ('Brand X', 'XP', 'Modem', 'Contr.', 10) 158: ('Brand X', 'XP', 'Modem', 'Contr.', 15) 159: ('Brand X', 'XP', 'Modem', 'Contr.', 30) 160: ('Brand X', 'XP', 'Modem', 'Contr.', 60) 161: ('Brand Y', '98', 'Internal', 'Salaried', 6) 162: ('Brand Y', '98', 'Internal', 'Salaried', 10) 163: ('Brand Y', '98', 'Internal', 'Salaried', 15) 164: ('Brand Y', '98', 'Internal', 'Salaried', 30) 165: ('Brand Y', '98', 'Internal', 'Salaried', 60) 166: ('Brand Y', '98', 'Internal', 'Hourly', 6) 167: ('Brand Y', '98', 'Internal', 'Hourly', 10) 168: ('Brand Y', '98', 'Internal', 'Hourly', 15) 169: ('Brand Y', '98', 'Internal', 'Hourly', 30) 170: ('Brand Y', '98', 'Internal', 'Hourly', 60) 171: ('Brand Y', '98', 'Internal', 'Part-Time', 6) 172: ('Brand Y', '98', 'Internal', 'Part-Time', 10) 173: ('Brand Y', '98', 'Internal', 'Part-Time', 15) 174: ('Brand Y', '98', 'Internal', 'Part-Time', 30) 175: ('Brand Y', '98', 'Internal', 'Part-Time', 60) 176: ('Brand Y', '98', 'Internal', 'Contr.', 6) 177: ('Brand Y', '98', 'Internal', 'Contr.', 10) 178: ('Brand Y', '98', 'Internal', 'Contr.', 15) 179: ('Brand Y', '98', 'Internal', 'Contr.', 30) 180: ('Brand Y', '98', 'Internal', 'Contr.', 60) 181: ('Brand Y', '98', 'Modem', 'Salaried', 6) 182: ('Brand Y', '98', 'Modem', 'Salaried', 10) 183: ('Brand Y', '98', 'Modem', 'Salaried', 15) 184: ('Brand Y', '98', 'Modem', 'Salaried', 30) 185: ('Brand Y', '98', 'Modem', 'Salaried', 60) 186: ('Brand Y', '98', 'Modem', 'Hourly', 6) 187: ('Brand Y', '98', 'Modem', 'Hourly', 10) 188: ('Brand Y', '98', 'Modem', 'Hourly', 15) 189: ('Brand Y', '98', 'Modem', 'Hourly', 30) 190: ('Brand Y', '98', 'Modem', 'Hourly', 60) 191: ('Brand Y', '98', 'Modem', 'Part-Time', 6) 192: ('Brand Y', '98', 'Modem', 'Part-Time', 10) 193: ('Brand Y', '98', 'Modem', 'Part-Time', 15) 194: ('Brand Y', '98', 'Modem', 'Part-Time', 30) 195: ('Brand Y', '98', 'Modem', 'Part-Time', 60) 196: ('Brand Y', '98', 'Modem', 'Contr.', 6) 197: ('Brand Y', '98', 'Modem', 'Contr.', 10) 198: ('Brand Y', '98', 'Modem', 'Contr.', 15) 199: ('Brand Y', '98', 'Modem', 'Contr.', 30) 200: ('Brand Y', '98', 'Modem', 'Contr.', 60) 201: ('Brand Y', 'NT', 'Internal', 'Salaried', 6) 202: ('Brand Y', 'NT', 'Internal', 'Salaried', 10) 203: ('Brand Y', 'NT', 'Internal', 'Salaried', 15) 204: ('Brand Y', 'NT', 'Internal', 'Salaried', 30) 205: ('Brand Y', 'NT', 'Internal', 'Salaried', 60) 206: ('Brand Y', 'NT', 'Internal', 'Hourly', 6) 207: ('Brand Y', 'NT', 'Internal', 'Hourly', 10) 208: ('Brand Y', 'NT', 'Internal', 'Hourly', 15) 209: ('Brand Y', 'NT', 'Internal', 'Hourly', 30) 210: ('Brand Y', 'NT', 'Internal', 'Hourly', 60) 211: ('Brand Y', 'NT', 'Internal', 'Part-Time', 6) 212: ('Brand Y', 'NT', 'Internal', 'Part-Time', 10) 213: ('Brand Y', 'NT', 'Internal', 'Part-Time', 15) 214: ('Brand Y', 'NT', 'Internal', 'Part-Time', 30) 215: ('Brand Y', 'NT', 'Internal', 'Part-Time', 60) 216: ('Brand Y', 'NT', 'Internal', 'Contr.', 6) 217: ('Brand Y', 'NT', 'Internal', 'Contr.', 10) 218: ('Brand Y', 'NT', 'Internal', 'Contr.', 15) 219: ('Brand Y', 'NT', 'Internal', 'Contr.', 30) 220: ('Brand Y', 'NT', 'Internal', 'Contr.', 60) 221: ('Brand Y', 'NT', 'Modem', 'Salaried', 6) 222: ('Brand Y', 'NT', 'Modem', 'Salaried', 10) 223: ('Brand Y', 'NT', 'Modem', 'Salaried', 15) 224: ('Brand Y', 'NT', 'Modem', 'Salaried', 30) 225: ('Brand Y', 'NT', 'Modem', 'Salaried', 60) 226: ('Brand Y', 'NT', 'Modem', 'Hourly', 6) 227: ('Brand Y', 'NT', 'Modem', 'Hourly', 10) 228: ('Brand Y', 'NT', 'Modem', 'Hourly', 15) 229: ('Brand Y', 'NT', 'Modem', 'Hourly', 30) 230: ('Brand Y', 'NT', 'Modem', 'Hourly', 60) 231: ('Brand Y', 'NT', 'Modem', 'Part-Time', 6) 232: ('Brand Y', 'NT', 'Modem', 'Part-Time', 10) 233: ('Brand Y', 'NT', 'Modem', 'Part-Time', 15) 234: ('Brand Y', 'NT', 'Modem', 'Part-Time', 30) 235: ('Brand Y', 'NT', 'Modem', 'Part-Time', 60) 236: ('Brand Y', 'NT', 'Modem', 'Contr.', 6) 237: ('Brand Y', 'NT', 'Modem', 'Contr.', 10) 238: ('Brand Y', 'NT', 'Modem', 'Contr.', 15) 239: ('Brand Y', 'NT', 'Modem', 'Contr.', 30) 240: ('Brand Y', 'NT', 'Modem', 'Contr.', 60) 241: ('Brand Y', '2000', 'Internal', 'Salaried', 6) 242: ('Brand Y', '2000', 'Internal', 'Salaried', 10) 243: ('Brand Y', '2000', 'Internal', 'Salaried', 15) 244: ('Brand Y', '2000', 'Internal', 'Salaried', 30) 245: ('Brand Y', '2000', 'Internal', 'Salaried', 60) 246: ('Brand Y', '2000', 'Internal', 'Hourly', 6) 247: ('Brand Y', '2000', 'Internal', 'Hourly', 10) 248: ('Brand Y', '2000', 'Internal', 'Hourly', 15) 249: ('Brand Y', '2000', 'Internal', 'Hourly', 30) 250: ('Brand Y', '2000', 'Internal', 'Hourly', 60) 251: ('Brand Y', '2000', 'Internal', 'Part-Time', 6) 252: ('Brand Y', '2000', 'Internal', 'Part-Time', 10) 253: ('Brand Y', '2000', 'Internal', 'Part-Time', 15) 254: ('Brand Y', '2000', 'Internal', 'Part-Time', 30) 255: ('Brand Y', '2000', 'Internal', 'Part-Time', 60) 256: ('Brand Y', '2000', 'Internal', 'Contr.', 6) 257: ('Brand Y', '2000', 'Internal', 'Contr.', 10) 258: ('Brand Y', '2000', 'Internal', 'Contr.', 15) 259: ('Brand Y', '2000', 'Internal', 'Contr.', 30) 260: ('Brand Y', '2000', 'Internal', 'Contr.', 60) 261: ('Brand Y', '2000', 'Modem', 'Salaried', 6) 262: ('Brand Y', '2000', 'Modem', 'Salaried', 10) 263: ('Brand Y', '2000', 'Modem', 'Salaried', 15) 264: ('Brand Y', '2000', 'Modem', 'Salaried', 30) 265: ('Brand Y', '2000', 'Modem', 'Salaried', 60) 266: ('Brand Y', '2000', 'Modem', 'Hourly', 6) 267: ('Brand Y', '2000', 'Modem', 'Hourly', 10) 268: ('Brand Y', '2000', 'Modem', 'Hourly', 15) 269: ('Brand Y', '2000', 'Modem', 'Hourly', 30) 270: ('Brand Y', '2000', 'Modem', 'Hourly', 60) 271: ('Brand Y', '2000', 'Modem', 'Part-Time', 6) 272: ('Brand Y', '2000', 'Modem', 'Part-Time', 10) 273: ('Brand Y', '2000', 'Modem', 'Part-Time', 15) 274: ('Brand Y', '2000', 'Modem', 'Part-Time', 30) 275: ('Brand Y', '2000', 'Modem', 'Part-Time', 60) 276: ('Brand Y', '2000', 'Modem', 'Contr.', 6) 277: ('Brand Y', '2000', 'Modem', 'Contr.', 10) 278: ('Brand Y', '2000', 'Modem', 'Contr.', 15) 279: ('Brand Y', '2000', 'Modem', 'Contr.', 30) 280: ('Brand Y', '2000', 'Modem', 'Contr.', 60) 281: ('Brand Y', 'XP', 'Internal', 'Salaried', 6) 282: ('Brand Y', 'XP', 'Internal', 'Salaried', 10) 283: ('Brand Y', 'XP', 'Internal', 'Salaried', 15) 284: ('Brand Y', 'XP', 'Internal', 'Salaried', 30) 285: ('Brand Y', 'XP', 'Internal', 'Salaried', 60) 286: ('Brand Y', 'XP', 'Internal', 'Hourly', 6) 287: ('Brand Y', 'XP', 'Internal', 'Hourly', 10) 288: ('Brand Y', 'XP', 'Internal', 'Hourly', 15) 289: ('Brand Y', 'XP', 'Internal', 'Hourly', 30) 290: ('Brand Y', 'XP', 'Internal', 'Hourly', 60) 291: ('Brand Y', 'XP', 'Internal', 'Part-Time', 6) 292: ('Brand Y', 'XP', 'Internal', 'Part-Time', 10) 293: ('Brand Y', 'XP', 'Internal', 'Part-Time', 15) 294: ('Brand Y', 'XP', 'Internal', 'Part-Time', 30) 295: ('Brand Y', 'XP', 'Internal', 'Part-Time', 60) 296: ('Brand Y', 'XP', 'Internal', 'Contr.', 6) 297: ('Brand Y', 'XP', 'Internal', 'Contr.', 10) 298: ('Brand Y', 'XP', 'Internal', 'Contr.', 15) 299: ('Brand Y', 'XP', 'Internal', 'Contr.', 30) 300: ('Brand Y', 'XP', 'Internal', 'Contr.', 60) 301: ('Brand Y', 'XP', 'Modem', 'Salaried', 6) 302: ('Brand Y', 'XP', 'Modem', 'Salaried', 10) 303: ('Brand Y', 'XP', 'Modem', 'Salaried', 15) 304: ('Brand Y', 'XP', 'Modem', 'Salaried', 30) 305: ('Brand Y', 'XP', 'Modem', 'Salaried', 60) 306: ('Brand Y', 'XP', 'Modem', 'Hourly', 6) 307: ('Brand Y', 'XP', 'Modem', 'Hourly', 10) 308: ('Brand Y', 'XP', 'Modem', 'Hourly', 15) 309: ('Brand Y', 'XP', 'Modem', 'Hourly', 30) 310: ('Brand Y', 'XP', 'Modem', 'Hourly', 60) 311: ('Brand Y', 'XP', 'Modem', 'Part-Time', 6) 312: ('Brand Y', 'XP', 'Modem', 'Part-Time', 10) 313: ('Brand Y', 'XP', 'Modem', 'Part-Time', 15) 314: ('Brand Y', 'XP', 'Modem', 'Part-Time', 30) 315: ('Brand Y', 'XP', 'Modem', 'Part-Time', 60) 316: ('Brand Y', 'XP', 'Modem', 'Contr.', 6) 317: ('Brand Y', 'XP', 'Modem', 'Contr.', 10) 318: ('Brand Y', 'XP', 'Modem', 'Contr.', 15) 319: ('Brand Y', 'XP', 'Modem', 'Contr.', 30) 320: ('Brand Y', 'XP', 'Modem', 'Contr.', 60)
削減テストケース数と、
バグ検出率
全組み合わせでの テストケースが 320、 オールペア法での テストケース数が 22なので、 298ケースが 削減できる ことになります。
これでどれくらいのバグが 検出できるかと いうと、 以下、 基幹システムに おける テスト十分性の 確保 と いう PDF文書の 引用です。
1因子単独、2因子の 網羅で 80%-100% の バグの 検出が できるらしいです。 D. Richard Kuhn[22]は,1 因子単独
および 2 個の 因子間の 組み合わせで 発生する バグが,全体の 7 ~ 9 割を 占めると 報告している .日本ユニシスの 基幹システムで 稼働後に 発生した バグ(障害)を 分析した ところ, 図 3 に 示す通り 1 因子に 起因する 障害が 38%~ 65%, これに 2 因子の 組み合わせで 発生した 障害を 加えると, 全体の 79%~ 100%を 占めており, 高い 効果が 見込める ことが 判明した. 1因子単独、
2因子の 網羅で 検出できない バグを どう 検出するか
個人的には以下が 浮かびました。 - リスクベースの
考えで、 リスクの 高い 因子の 組み合わせに ついては、 全網羅テストを 実施する。 - ホワイトボックス観点での
テストケースの 追加。
- リスクベースの
Filterを 指定して 実行
AllPairs の
from allpairspy import AllPairs def is_valid_combination(row): """ This is a filtering function. Filtering functions should return True if combination is valid and False otherwise. Test row that is passed here can be incomplete. To prevent search for unnecessary items filtering function is executed with found subset of data to validate it. """ n = len(row) # Listのサイズによる判定、1、2要素目の組み合わせで判断したい場合は、 if n > 1 とかで判定してもOK # 要素数が膨大な場合は、if n > 1 にした方がパフォーマンスが出る。 if n > 4: # Brand Y does not support Windows 98 if "98" == row[1] and "Brand Y" == row[0]: return False # Brand X does not work with XP if "XP" == row[1] and "Brand X" == row[0]: return False # Contractors are billed in 30 min increments if "Contr." == row[3] and row[4] < 30: return False return True parameters = [ ["Brand X", "Brand Y"], ["98", "NT", "2000", "XP"], ["Internal", "Modem"], ["Salaried", "Hourly", "Part-Time", "Contr."], [6, 10, 15, 30, 60] ] print("PAIRWISE:") for i, pairs in enumerate(AllPairs(parameters, filter_func=is_valid_combination)): print("{:2d}: {}".format(i + 1, pairs))
PAIRWISE: 1: ['Brand X', '98', 'Internal', 'Salaried', 6] 2: ['Brand Y', 'NT', 'Modem', 'Hourly', 6] 3: ['Brand Y', '2000', 'Internal', 'Part-Time', 10] 4: ['Brand X', '2000', 'Modem', 'Contr.', 30] 5: ['Brand X', 'NT', 'Internal', 'Hourly', 15] 6: ['Brand Y', 'XP', 'Modem', 'Salaried', 15] 7: ['Brand Y', 'XP', 'Internal', 'Contr.', 60] 8: ['Brand X', '98', 'Modem', 'Part-Time', 60] 9: ['Brand X', 'NT', 'Modem', 'Part-Time', 10] 10: ['Brand Y', '2000', 'Internal', 'Salaried', 30] 11: ['Brand Y', 'XP', 'Internal', 'Part-Time', 6] 12: ['Brand Y', '2000', 'Internal', 'Hourly', 60] 13: ['Brand Y', 'NT', 'Internal', 'Contr.', 60] 14: ['Brand Y', 'XP', 'Internal', 'Hourly', 10] 15: ['Brand Y', 'NT', 'Internal', 'Salaried', 60]
直積 (全組み 合わせ)で Filterを 実行する
itertools.product
にはfilter
で
import itertools def is_valid_combination(row): # Brand Y does not support Windows 98 if "98" == row[1] and "Brand Y" == row[0]: return False # Brand X does not work with XP if "XP" == row[1] and "Brand X" == row[0]: return False # Contractors are billed in 30 min increments if "Contr." == row[3] and row[4] < 30: return False return True a = ["Brand X", "Brand Y"] b = ["98", "NT", "2000", "XP"] c = ["Internal", "Modem"] d = ["Salaried", "Hourly", "Part-Time", "Contr."] e = [6, 10, 15, 30, 60] print("PRODUCT:") elems = filter(is_valid_combination,itertools.product(a, b,c,d,e)) for i, pairs in enumerate(elems): print("{:2d}: {}".format(i + 1, pairs))
PRODUCT: 1: ('Brand X', '98', 'Internal', 'Salaried', 6) 2: ('Brand X', '98', 'Internal', 'Salaried', 10) 3: ('Brand X', '98', 'Internal', 'Salaried', 15) 4: ('Brand X', '98', 'Internal', 'Salaried', 30) 5: ('Brand X', '98', 'Internal', 'Salaried', 60) 6: ('Brand X', '98', 'Internal', 'Hourly', 6) 7: ('Brand X', '98', 'Internal', 'Hourly', 10) 8: ('Brand X', '98', 'Internal', 'Hourly', 15) 9: ('Brand X', '98', 'Internal', 'Hourly', 30) 10: ('Brand X', '98', 'Internal', 'Hourly', 60) 11: ('Brand X', '98', 'Internal', 'Part-Time', 6) 12: ('Brand X', '98', 'Internal', 'Part-Time', 10) 13: ('Brand X', '98', 'Internal', 'Part-Time', 15) 14: ('Brand X', '98', 'Internal', 'Part-Time', 30) 15: ('Brand X', '98', 'Internal', 'Part-Time', 60) 16: ('Brand X', '98', 'Internal', 'Contr.', 30) 17: ('Brand X', '98', 'Internal', 'Contr.', 60) 18: ('Brand X', '98', 'Modem', 'Salaried', 6) 19: ('Brand X', '98', 'Modem', 'Salaried', 10) 20: ('Brand X', '98', 'Modem', 'Salaried', 15) 21: ('Brand X', '98', 'Modem', 'Salaried', 30) 22: ('Brand X', '98', 'Modem', 'Salaried', 60) 23: ('Brand X', '98', 'Modem', 'Hourly', 6) 24: ('Brand X', '98', 'Modem', 'Hourly', 10) 25: ('Brand X', '98', 'Modem', 'Hourly', 15) 26: ('Brand X', '98', 'Modem', 'Hourly', 30) 27: ('Brand X', '98', 'Modem', 'Hourly', 60) 28: ('Brand X', '98', 'Modem', 'Part-Time', 6) 29: ('Brand X', '98', 'Modem', 'Part-Time', 10) 30: ('Brand X', '98', 'Modem', 'Part-Time', 15) 31: ('Brand X', '98', 'Modem', 'Part-Time', 30) 32: ('Brand X', '98', 'Modem', 'Part-Time', 60) 33: ('Brand X', '98', 'Modem', 'Contr.', 30) 34: ('Brand X', '98', 'Modem', 'Contr.', 60) 35: ('Brand X', 'NT', 'Internal', 'Salaried', 6) 36: ('Brand X', 'NT', 'Internal', 'Salaried', 10) 37: ('Brand X', 'NT', 'Internal', 'Salaried', 15) 38: ('Brand X', 'NT', 'Internal', 'Salaried', 30) 39: ('Brand X', 'NT', 'Internal', 'Salaried', 60) 40: ('Brand X', 'NT', 'Internal', 'Hourly', 6) 41: ('Brand X', 'NT', 'Internal', 'Hourly', 10) 42: ('Brand X', 'NT', 'Internal', 'Hourly', 15) 43: ('Brand X', 'NT', 'Internal', 'Hourly', 30) 44: ('Brand X', 'NT', 'Internal', 'Hourly', 60) 45: ('Brand X', 'NT', 'Internal', 'Part-Time', 6) 46: ('Brand X', 'NT', 'Internal', 'Part-Time', 10) 47: ('Brand X', 'NT', 'Internal', 'Part-Time', 15) 48: ('Brand X', 'NT', 'Internal', 'Part-Time', 30) 49: ('Brand X', 'NT', 'Internal', 'Part-Time', 60) 50: ('Brand X', 'NT', 'Internal', 'Contr.', 30) 51: ('Brand X', 'NT', 'Internal', 'Contr.', 60) 52: ('Brand X', 'NT', 'Modem', 'Salaried', 6) 53: ('Brand X', 'NT', 'Modem', 'Salaried', 10) 54: ('Brand X', 'NT', 'Modem', 'Salaried', 15) 55: ('Brand X', 'NT', 'Modem', 'Salaried', 30) 56: ('Brand X', 'NT', 'Modem', 'Salaried', 60) 57: ('Brand X', 'NT', 'Modem', 'Hourly', 6) 58: ('Brand X', 'NT', 'Modem', 'Hourly', 10) 59: ('Brand X', 'NT', 'Modem', 'Hourly', 15) 60: ('Brand X', 'NT', 'Modem', 'Hourly', 30) 61: ('Brand X', 'NT', 'Modem', 'Hourly', 60) 62: ('Brand X', 'NT', 'Modem', 'Part-Time', 6) 63: ('Brand X', 'NT', 'Modem', 'Part-Time', 10) 64: ('Brand X', 'NT', 'Modem', 'Part-Time', 15) 65: ('Brand X', 'NT', 'Modem', 'Part-Time', 30) 66: ('Brand X', 'NT', 'Modem', 'Part-Time', 60) 67: ('Brand X', 'NT', 'Modem', 'Contr.', 30) 68: ('Brand X', 'NT', 'Modem', 'Contr.', 60) 69: ('Brand X', '2000', 'Internal', 'Salaried', 6) 70: ('Brand X', '2000', 'Internal', 'Salaried', 10) 71: ('Brand X', '2000', 'Internal', 'Salaried', 15) 72: ('Brand X', '2000', 'Internal', 'Salaried', 30) 73: ('Brand X', '2000', 'Internal', 'Salaried', 60) 74: ('Brand X', '2000', 'Internal', 'Hourly', 6) 75: ('Brand X', '2000', 'Internal', 'Hourly', 10) 76: ('Brand X', '2000', 'Internal', 'Hourly', 15) 77: ('Brand X', '2000', 'Internal', 'Hourly', 30) 78: ('Brand X', '2000', 'Internal', 'Hourly', 60) 79: ('Brand X', '2000', 'Internal', 'Part-Time', 6) 80: ('Brand X', '2000', 'Internal', 'Part-Time', 10) 81: ('Brand X', '2000', 'Internal', 'Part-Time', 15) 82: ('Brand X', '2000', 'Internal', 'Part-Time', 30) 83: ('Brand X', '2000', 'Internal', 'Part-Time', 60) 84: ('Brand X', '2000', 'Internal', 'Contr.', 30) 85: ('Brand X', '2000', 'Internal', 'Contr.', 60) 86: ('Brand X', '2000', 'Modem', 'Salaried', 6) 87: ('Brand X', '2000', 'Modem', 'Salaried', 10) 88: ('Brand X', '2000', 'Modem', 'Salaried', 15) 89: ('Brand X', '2000', 'Modem', 'Salaried', 30) 90: ('Brand X', '2000', 'Modem', 'Salaried', 60) 91: ('Brand X', '2000', 'Modem', 'Hourly', 6) 92: ('Brand X', '2000', 'Modem', 'Hourly', 10) 93: ('Brand X', '2000', 'Modem', 'Hourly', 15) 94: ('Brand X', '2000', 'Modem', 'Hourly', 30) 95: ('Brand X', '2000', 'Modem', 'Hourly', 60) 96: ('Brand X', '2000', 'Modem', 'Part-Time', 6) 97: ('Brand X', '2000', 'Modem', 'Part-Time', 10) 98: ('Brand X', '2000', 'Modem', 'Part-Time', 15) 99: ('Brand X', '2000', 'Modem', 'Part-Time', 30) 100: ('Brand X', '2000', 'Modem', 'Part-Time', 60) 101: ('Brand X', '2000', 'Modem', 'Contr.', 30) 102: ('Brand X', '2000', 'Modem', 'Contr.', 60) 103: ('Brand Y', 'NT', 'Internal', 'Salaried', 6) 104: ('Brand Y', 'NT', 'Internal', 'Salaried', 10) 105: ('Brand Y', 'NT', 'Internal', 'Salaried', 15) 106: ('Brand Y', 'NT', 'Internal', 'Salaried', 30) 107: ('Brand Y', 'NT', 'Internal', 'Salaried', 60) 108: ('Brand Y', 'NT', 'Internal', 'Hourly', 6) 109: ('Brand Y', 'NT', 'Internal', 'Hourly', 10) 110: ('Brand Y', 'NT', 'Internal', 'Hourly', 15) 111: ('Brand Y', 'NT', 'Internal', 'Hourly', 30) 112: ('Brand Y', 'NT', 'Internal', 'Hourly', 60) 113: ('Brand Y', 'NT', 'Internal', 'Part-Time', 6) 114: ('Brand Y', 'NT', 'Internal', 'Part-Time', 10) 115: ('Brand Y', 'NT', 'Internal', 'Part-Time', 15) 116: ('Brand Y', 'NT', 'Internal', 'Part-Time', 30) 117: ('Brand Y', 'NT', 'Internal', 'Part-Time', 60) 118: ('Brand Y', 'NT', 'Internal', 'Contr.', 30) 119: ('Brand Y', 'NT', 'Internal', 'Contr.', 60) 120: ('Brand Y', 'NT', 'Modem', 'Salaried', 6) 121: ('Brand Y', 'NT', 'Modem', 'Salaried', 10) 122: ('Brand Y', 'NT', 'Modem', 'Salaried', 15) 123: ('Brand Y', 'NT', 'Modem', 'Salaried', 30) 124: ('Brand Y', 'NT', 'Modem', 'Salaried', 60) 125: ('Brand Y', 'NT', 'Modem', 'Hourly', 6) 126: ('Brand Y', 'NT', 'Modem', 'Hourly', 10) 127: ('Brand Y', 'NT', 'Modem', 'Hourly', 15) 128: ('Brand Y', 'NT', 'Modem', 'Hourly', 30) 129: ('Brand Y', 'NT', 'Modem', 'Hourly', 60) 130: ('Brand Y', 'NT', 'Modem', 'Part-Time', 6) 131: ('Brand Y', 'NT', 'Modem', 'Part-Time', 10) 132: ('Brand Y', 'NT', 'Modem', 'Part-Time', 15) 133: ('Brand Y', 'NT', 'Modem', 'Part-Time', 30) 134: ('Brand Y', 'NT', 'Modem', 'Part-Time', 60) 135: ('Brand Y', 'NT', 'Modem', 'Contr.', 30) 136: ('Brand Y', 'NT', 'Modem', 'Contr.', 60) 137: ('Brand Y', '2000', 'Internal', 'Salaried', 6) 138: ('Brand Y', '2000', 'Internal', 'Salaried', 10) 139: ('Brand Y', '2000', 'Internal', 'Salaried', 15) 140: ('Brand Y', '2000', 'Internal', 'Salaried', 30) 141: ('Brand Y', '2000', 'Internal', 'Salaried', 60) 142: ('Brand Y', '2000', 'Internal', 'Hourly', 6) 143: ('Brand Y', '2000', 'Internal', 'Hourly', 10) 144: ('Brand Y', '2000', 'Internal', 'Hourly', 15) 145: ('Brand Y', '2000', 'Internal', 'Hourly', 30) 146: ('Brand Y', '2000', 'Internal', 'Hourly', 60) 147: ('Brand Y', '2000', 'Internal', 'Part-Time', 6) 148: ('Brand Y', '2000', 'Internal', 'Part-Time', 10) 149: ('Brand Y', '2000', 'Internal', 'Part-Time', 15) 150: ('Brand Y', '2000', 'Internal', 'Part-Time', 30) 151: ('Brand Y', '2000', 'Internal', 'Part-Time', 60) 152: ('Brand Y', '2000', 'Internal', 'Contr.', 30) 153: ('Brand Y', '2000', 'Internal', 'Contr.', 60) 154: ('Brand Y', '2000', 'Modem', 'Salaried', 6) 155: ('Brand Y', '2000', 'Modem', 'Salaried', 10) 156: ('Brand Y', '2000', 'Modem', 'Salaried', 15) 157: ('Brand Y', '2000', 'Modem', 'Salaried', 30) 158: ('Brand Y', '2000', 'Modem', 'Salaried', 60) 159: ('Brand Y', '2000', 'Modem', 'Hourly', 6) 160: ('Brand Y', '2000', 'Modem', 'Hourly', 10) 161: ('Brand Y', '2000', 'Modem', 'Hourly', 15) 162: ('Brand Y', '2000', 'Modem', 'Hourly', 30) 163: ('Brand Y', '2000', 'Modem', 'Hourly', 60) 164: ('Brand Y', '2000', 'Modem', 'Part-Time', 6) 165: ('Brand Y', '2000', 'Modem', 'Part-Time', 10) 166: ('Brand Y', '2000', 'Modem', 'Part-Time', 15) 167: ('Brand Y', '2000', 'Modem', 'Part-Time', 30) 168: ('Brand Y', '2000', 'Modem', 'Part-Time', 60) 169: ('Brand Y', '2000', 'Modem', 'Contr.', 30) 170: ('Brand Y', '2000', 'Modem', 'Contr.', 60) 171: ('Brand Y', 'XP', 'Internal', 'Salaried', 6) 172: ('Brand Y', 'XP', 'Internal', 'Salaried', 10) 173: ('Brand Y', 'XP', 'Internal', 'Salaried', 15) 174: ('Brand Y', 'XP', 'Internal', 'Salaried', 30) 175: ('Brand Y', 'XP', 'Internal', 'Salaried', 60) 176: ('Brand Y', 'XP', 'Internal', 'Hourly', 6) 177: ('Brand Y', 'XP', 'Internal', 'Hourly', 10) 178: ('Brand Y', 'XP', 'Internal', 'Hourly', 15) 179: ('Brand Y', 'XP', 'Internal', 'Hourly', 30) 180: ('Brand Y', 'XP', 'Internal', 'Hourly', 60) 181: ('Brand Y', 'XP', 'Internal', 'Part-Time', 6) 182: ('Brand Y', 'XP', 'Internal', 'Part-Time', 10) 183: ('Brand Y', 'XP', 'Internal', 'Part-Time', 15) 184: ('Brand Y', 'XP', 'Internal', 'Part-Time', 30) 185: ('Brand Y', 'XP', 'Internal', 'Part-Time', 60) 186: ('Brand Y', 'XP', 'Internal', 'Contr.', 30) 187: ('Brand Y', 'XP', 'Internal', 'Contr.', 60) 188: ('Brand Y', 'XP', 'Modem', 'Salaried', 6) 189: ('Brand Y', 'XP', 'Modem', 'Salaried', 10) 190: ('Brand Y', 'XP', 'Modem', 'Salaried', 15) 191: ('Brand Y', 'XP', 'Modem', 'Salaried', 30) 192: ('Brand Y', 'XP', 'Modem', 'Salaried', 60) 193: ('Brand Y', 'XP', 'Modem', 'Hourly', 6) 194: ('Brand Y', 'XP', 'Modem', 'Hourly', 10) 195: ('Brand Y', 'XP', 'Modem', 'Hourly', 15) 196: ('Brand Y', 'XP', 'Modem', 'Hourly', 30) 197: ('Brand Y', 'XP', 'Modem', 'Hourly', 60) 198: ('Brand Y', 'XP', 'Modem', 'Part-Time', 6) 199: ('Brand Y', 'XP', 'Modem', 'Part-Time', 10) 200: ('Brand Y', 'XP', 'Modem', 'Part-Time', 15) 201: ('Brand Y', 'XP', 'Modem', 'Part-Time', 30) 202: ('Brand Y', 'XP', 'Modem', 'Part-Time', 60) 203: ('Brand Y', 'XP', 'Modem', 'Contr.', 30) 204: ('Brand Y', 'XP', 'Modem', 'Contr.', 60)
allpairspyでも、
Webシステムに おける 組み合わせ テストの ルール
個人的には、
独断と
ミッションクリティカルではない、
且つ、 金額計算、 生命が 関わる 仕組みではない 場合 - オールペア法に
よる 組み合わせ 網羅を 基本とし、 オールペア法の テストケースは コスト範囲内であれば、 最低限実施する。 - その他の
組み合わせに ついては サービス担当者の 過去の 経験、 及び勘を 働かせて 追加する。
- オールペア法に
ミッションクリティカル、
又は、 金額計算、 生命が 関わる 仕組みの 場合 - オールペア法、
直行表の 組み合わせ 網羅を 基本とする。 - サービス担当者の
過去の 経験、 及び勘と、 障害発生時の リスクを 勘案して テストケースを 追加する。 - 予算に
よっては、 泣く<wbr>泣く
テストケースを削減する。
- オールペア法、
参考
以下、
DevelopSense - Things can be different
Pairwise法の説明記事、 Wikipediaから リンクが 貼られていました。 Pairwise Testing - Available Tools
Pairwise法のツール一覧です。 組み
合わせ テストケース生成ツール 「PictMaster」 と ソフトウェアテストの 話題
PictMasterの開発者の 方の Blogです。 直交表の 話とか、 オールペア法に ついて 記載されています。 allpairspy · PyPI
pypi.org
のallpairspy の ページ。
以上です。
コメント