LoginSignup
3
4

More than 5 years have passed since last update.

テストへのリソース配分

Posted at

これなに

あなたは、ソフトウェアの試験担当です。ソフトウェアは、4つのモジュールでできています。
また、テストは、A,B,C,D,E の5つのカテゴリに分かれています。

さて、あなたは、どのカテゴリのテストをどの割合でやるかを決めなければいけません。

方針

過去の経験から、モジュールとテストの相関が表Aで与えられているものとします。
このとき、各テストを割合 $p$ で実施したとき、モジュール1 での障害の発見確率は、$A_1 \cdot p$で求められるものとします。

データ作成

乱数で表Aを作ります。

python3
import numpy as np, pandas as pd
from pulp import *
from ortoolpy import addvar, addvars
np.random.seed(4)
nm, nt = 4, 5 # モジュール数、テスト数
A = pd.DataFrame(np.maximum(np.random.normal
     (-0.05,0.2,(nt,nm)), np.zeros((nt,nm))),
     columns=['モジュール%d'%(i+1) for i in range(nm)],
     index=['テスト%s'%chr(i+65) for i in range(nt)])
print(A)
発見確率 モジュール1 モジュール2 モジュール3 モジュール4
テストA 0.000000 0.049990 0.000000 0.088720
テストB 0.000000 0.000000 0.000000 0.069715
テストC 0.016450 0.000000 0.073734 0.000000
テストD 0.035014 0.016451 0.000000 0.020199
テストE 0.000000 0.259396 0.094668 0.000000

計算その1

全体の総和を最大化するように、Pythonで計算してみましょう。

python3
m = LpProblem(sense=LpMaximize) # 数理モデル
x = addvars(nt) # 変数(テストの割合)
m += lpDot(A.sum(1),x) # 目的関数
m += lpSum(x) == 1
m.solve()
r = np.vectorize(value)(x)
print('%s 総和 %.4f 最低 %.4f'%(LpStatus[m.status],
    r.dot(A.values).sum(), r.dot(A.values).min()))
for i,v in zip(A.index,r):
    print('%sの作業量 %.4f'%(i,v))
>>>
Optimal 総和 0.3541 最低 0.0000
テストAの作業量 0.0000
テストBの作業量 0.0000
テストCの作業量 0.0000
テストDの作業量 0.0000
テストEの作業量 1.0000

最も効率のよいテストEだけやるという結果になりました。

検討

テストEでは、モジュール1とモジュール2の障害を発見できません。
品質保証とは、ある最低ラインの品質を担保するものと考えられます。

image

「計算その1」では、赤の分布のように平均的な品質が上がるようにテストをしますが、低品質になる可能性を残しています。
「計算その2」として、青の分布のように平均的な品質を上げるのではなく、低品質を避けるようなテストを考えてみましょう。

計算その2

モジュールごとの品質の最小値を最大化するように、計算してみましょう。

python3
m = LpProblem(sense=LpMaximize) # 数理モデル
x = addvars(nt) # 変数(テストの割合)
y = addvar() # 変数(最低ライン)
m += y + lpDot(A.sum(1),x)*0.01 # 目的関数
m += lpSum(x) == 1
for j in range(nm):
    m += y <= lpDot(A.ix[:,j],x)
m.solve()
r = np.vectorize(value)(x)
print('%s 総和 %.4f 最低 %.4f'%(LpStatus[m.status],
    r.dot(A.values).sum(), r.dot(A.values).min()))
for i,v in zip(A.index,r):
    print('%sの作業量 %.4f'%(i,v))
>>>
Optimal 総和 0.0948 最低 0.0237
テストAの作業量 0.1434
テストBの作業量 0.0000
テストCの作業量 0.2838
テストDの作業量 0.5435
テストEの作業量 0.0293

その1と比べて、総和は下がりましたが、最低が上がりました。

この考え方は、「組合せ最適でゲーム理論を解く」と同じものです。

以上

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4