組み合わせ生成ツール「PICT」の可視化
Last Modified:2020/08/13
All-pair(Pairwise)法によるソフトウェアテストの組み合わせ生成ツールが、いくつか発表されている。今回は、その中でのMicrosoft社による”PICT”と呼ぶツールの可視化を行なった。具体的には、PICTはWindows上のコマンドラインによるツールだが、表計算ソフトのExcelで因子・水準の設定→結果表示をおこなうようにした。なお本可視化はPICTでの基本的な設定への対応のみで、重みづけとか禁則の指定へは対応していない。
※自己責任で使用願います。 なお、本ドキュメントでExcel等は商標・登録商標です。
【操作方法】
本可視化は、Excelのマクロ(VBA)で実装している。マクロを含むExcelファイルを特定フォルダへダウンロードしてセーブし、ファイルを開く際にマクロを有効にする。Windowsで動作可能。細部は後述する。※2020年の更新で、エクセルファイルそのものを示す→マクロのテキストを示すに変更しました。マクロは後段を参考に願います。
(本Excelファイルのファイル名には、日本語文字を含んでいます。IEを利用している場合でファイルが見つからない旨が表示されたら、「インターネットオプション」→「詳細設定」で「常にUTF-8としてURLを送信する」のオプションを外してダウンロードしてみて下さい。また、上手く動かない時は、PICT.exeと本エクセルを同じフォルダに置いてみて下さい。)
Excel上で、矩形領域に因子と水準を記載する。行方向の先頭に因子名。それ以降に水準値を記述する。
矩形領域を選択選択状態にして、「ツール」→「マクロ」→「Case_Gen」を実行させる。(なお実装上は、途中で空白のセルがある場合、水準や因子の記述が一旦終了したと見做しています。)
マクロの実行で、新しいシートに生成結果を表示する。
【Excelのマクロで実装した理由】
All-Pair法に基づくテストケース生成ツール"ALLPAIRS"の利用を支援するExcelアドイン「AssistAllpair」があり、それとの因子・水準の共用を考えたため。矩形領域を指定して実行する操作方法も似せた。
ちなみに「AssistAllpair」は、moonlightさんの作でフリーソフト。"ALLPAIRS"はJames Bachさんの作。ただし、本Excelファイルにはそれらのアドインは含んでいない。
【マクロ「Case_Gen」(テキスト)】
Public Const INUMMAX As Integer = 100
'領域の行、列数 先頭位置
Public IAreaRow As Integer
Public IAreaCol As Integer
Public IAreaStartRow As Integer
Public IAreaStartCol As Integer
Dim ObjString As New DataObjectSub Case_Gen()
'
' ユーザー名 : ほんだ
'
Dim StrFactorLevel(1 To INUMMAX, 1 To INUMMAX) As String 'エクセルでの列、行
Dim ITempRow, ITempCol As Integer
Dim StrTemp, StrDir As StringDim StrWSH, Str_WSHExec, StrResult As String
Application.DisplayStatusBar = True
Application.StatusBar = " "
If Selection.Areas.Count <> 1 Then End'領域が1つのみ
IAreaRow = Selection.CurrentRegion.Rows.Count
IAreaCol = Selection.CurrentRegion.Columns.CountIAreaStartRow = Selection.CurrentRegion.Row
IAreaStartCol = Selection.CurrentRegion.ColumnIf IAreaRow > INUMMAX Or IAreaCol > INUMMAX Then End
If IAreaRow < 3 Or IAreaCol < 2 Then End'行、列計算でIntのオーバーフローを避けるために、先頭も100行・列で制限
If IAreaStartRow > INUMMAX Or IAreaStartCol > INUMMAX Then End'配列クリア
For ITempCol = 1 To INUMMAX
For ITempRow = 1 To INUMMAX
StrFactorLevel(ITempCol, ITempRow) = ""
Next ITempRow
Next ITempCol
For ITempCol = 1 To IAreaColIf Trim(Cells(IAreaStartRow, IAreaStartCol + ITempCol - 1)) = "" Then Exit For
For ITempRow = 1 To IAreaRowApplication.StatusBar = "取り込み。Row、Col= " + Str(ITempCol) + "、 " + Str(ITempRo)
If Trim(Cells(IAreaStartRow + ITempRow - 1, IAreaStartCol + ITempCol - 1)) = "" Then Exit For
StrFactorLevel(ITempCol, ITempRow) = Cells(IAreaStartRow + ITempRow - 1, IAreaStartCol + ITempCol - 1)
Next ITempRow
If ITempRow < 3 Then End
Next ITempColIf ITempCol < 2 Then End
'配列→PICT用Modelファイル
ChDrive ("")
StrDir = ActiveWorkbook.Path'本BookのディレクトリへModelファイルや結果をストアするため
ChDir (StrDir)Open CurDir + "\ModelFile.txt" For Output As #1
For ITempCol = 1 To INUMMAX
If StrFactorLevel(ITempCol, 1) = "" Then Exit For
StrTemp = StrFactorLevel(ITempCol, 1) + ": "
For ITempRow = 2 To INUMMAX
Application.StatusBar = "ModelFile作成中。Row、Col= " + Str(ITempCol) + "、 " + Str(ITempRo)If StrFactorLevel(ITempCol, ITempRow) = "" Then Exit For
If ITempRow <> 2 Then StrTemp = StrTemp + ", "
StrTemp = StrTemp + StrFactorLevel(ITempCol, ITempRow)
Next ITempRow
Print #1, StrTemp
Next ITempColClose #1
Application.StatusBar = "PICTで処理中。。。。"
Set StrWSH = CreateObject("WScript.Shell")
Set Str_WSHExec = StrWSH.Exec("PICT ModelFile.txt")
Do While Str_WSHExec.Status = 0
DoEvents
Loop
StrResult = Str_WSHExec.StdOut.ReadAllSet Str_WSHExec = Nothing
Set StrWSH = NothingIf Len(StrResult) > 32000 Then End '出力文字列が多すぎる (対策は大変かな)
Set ObjString = New DataObjectObjString.SetText StrResult
ObjString.PutInClipboard'新規シートへ書き出し
Sheets.Add
DoEvents
DoEvents
ActiveSheet.PasteApplication.DisplayStatusBar = True
Application.StatusBar = "新規シートへの書き出しが完了しました。 "End Sub
【動作環境】
WindowsXP Pro、Excel2003で動作確認した。その他のOS等については??
クリップボードの操作のために、必要なDLLを取り込んでいるので、注意の事。マクロのソースをコピー&ペーストして実行させようとしても、本DLLの取り込みを行なわないと実行出来ない。
【おことわり】
・使用に伴う障害については、責任は負いません。
・以下は気にしているけど、ごめんなさい。
重みづけとか禁則の指定というPICTの利点への対応。
Excelのマクロよりも、、、。(上述の様に理由有り。)
エラーへの対応が不十分とか命名ルール等がいい加減。
・多量の因子・水準にすると、PICT自体の挙動がおかしいように思う。単に処理時間がかかっているだけかもしれないが、、。
(多量の因子・水準を処理させる場合は、しばらくしたら、本処理のために開かれている"コマンドプロンプト"を閉じてみてください。処理が続行され、結果が表に記載されます。"コマンドプロンプト"のタイトルバーで、PICTの実行か確認した上でのクローズがいいと思われます。本件は、色々試していますが、いい解決方法や実装が見つかりません。)
【変更履歴】
2020/08/13:ブログ移行の関連で、図や例文をページ内で記述。エクセルはファイルそのものを示すから、マクロのテキスト記述へ。(内容自体が陳腐化してるけど、移行での実験ということで、、。)
2009/03/22:2020年の今となっては変更部分??