あきぴーさんより「公開してよ」と言われたので公開してみます。
自分専用に作っただけなので使いにくいとは思いますが。
garyoさんのスクリプトにパッチを当ててください。
diff --git a/allpairs2testcase.rb b/allpairs2testcase.rb index 6150db5..de40c2b 100644 --- a/allpairs2testcase.rb +++ b/allpairs2testcase.rb @@ -11,25 +11,23 @@ require 'kconv' require 'csv2testcace' class ApTestcase - attr_accessor :items,:testcase + attr_accessor :items,:testcase,:expectedResult @items @testcase + @expectedResult def initialize @items=[] @testcase = [] + @expectedResult = "" end def print s="<TABLE>" - s=s + "<TR>" for i in 0..@items.size-2 + s=s + "<TR>" s=s+"<TD>#{@items[i].split}</TD>" - end - s=s + "</TR>" - s=s + "<TR>" - for i in 0..@testcase.size-2 s=s+"<TD>#{@testcase[i].split}</TD>" + s=s + "</TR>" end - s=s + "</TR>" s=s + "</TABLE>" end def getTitle @@ -48,21 +46,41 @@ class Allpairs2Testcase attr_accessor :allpairsTestcase @allpairsTestcase @csv2testcase + @details + @summary def initialize @allpairsTestcase=AllpairsTestcase.new @csv2testcase=Csv2testcase.new + @details="" + @summary="" end def readFile(infile) f = File.open(infile,"r") - s=f.gets - s=f.gets + # skip first 2 lines + # if there are some information about "details" and/or "summary", get them. + s = f.gets.split("||") + if(s.first == "details") + @details = s[1] + end + s = f.gets.split("||") + if(s.first == "summary") + @summary = s[1] + end + # get a label line s=f.gets items=s.split("\t") + useExpRes = false + if items.last.chomp == "ExpectedResult" then + items.pop + useExpRes = true + end s=f.gets while s !="\n" tc=ApTestcase.new tc.items=items - tc.testcase=s.split("\t") + t=s.split("\t") + tc.expectedResult = t.pop if useExpRes + tc.testcase = t @allpairsTestcase.testcase << tc s=f.gets end @@ -71,9 +89,9 @@ class Allpairs2Testcase def initTestSuite(name,details) @csv2testcase.initTestSuite(name,details) end - def convXML(name_prefix="Test case No.",summary_prefix="",steps_prefix="",expectedresults_prefix="") + def convXML(name_prefix="Test case No.",summary_prefix=@summary,steps_prefix="",expectedresults_prefix="") @allpairsTestcase.testcase.each{|tc| - @csv2testcase.addTestcase(name_prefix + tc.getTitle,summary_prefix + tc.print,steps_prefix + tc.print,expectedresults_prefix) + @csv2testcase.addTestcase(name_prefix + tc.getTitle,summary_prefix,steps_prefix + tc.print,expectedresults_prefix + tc.expectedResult) } end def writeFile(outfile) @@ -81,7 +99,7 @@ class Allpairs2Testcase end def main(infile,outfile) readFile(infile) - initTestSuite(infile,"") + initTestSuite(infile,@details) convXML writeFile(outfile) end
パッチの特徴
- テストスイートの詳細に文章を記入できます。
- テストケースの概要に文章を記入できます。
- 各テストケース共通。
- 従来のように概要にステップと同様の表を書くのはやめた。
- ステップに表示される入力項目の一覧表が、2行n列からn行2列になり、1行ごとに入力項目とその値を記載するようにしました。
- 各テストケースに期待結果を記入することができます。
使い方
allpair生成ツールで、テストケースのベースを作ります。
ファイルを開き、以下の通りに入力します。
- 1行目:"details||"と記入し、その後ろにテストスイートの詳細に記入したい内容を書く。
- 2行目:"TEST CASES"という文字を削除し、その後に"summary||"と記入。その後ろに、各テストケースの概要を記入する。
- 3行目:入力項目のラベルの一番後ろに、"\tExpectedResult"と記入。
- 4行目以降:各テストケースの一番後ろをタブで区切れば、その後に期待結果の内容を記入できる。
インプットファイルの例はこんな感じ。
details||チケット113に関するテストを実施する。 summary||以下の通りに入力する。 "case" "ユーザ" "OS" "性別" "年齢" "好きな食べ物" "pairings" ExpectedResult 1 "一般ユーザ" "Windows XP" "男" "10歳以下" "マンゴー" 10 "OK" 2 "運用ユーザ" "Windows Vista" "女" "10〜30歳" "マンゴー" 10 "OK" 3 "システム管理者" "Windows XP" "男" "10〜30歳" "みかん" 9 "OK"
ツールとしての問題点
- ステップに具体的な操作手順を記載するわけじゃないので、テスターからしてみればとにかく使いづらい。
- 「入力項目」なのか「操作の種類」なのかもわからないので、いきなりテストに放り込まれると混乱する。
- というかいきなりプロジェクトに放り込まれた人から実際に言われた。
- XMLファイル自体は別に大して複雑でもないから、今のプロジェクト終わって時間できたら作り直そうかとか考え中。
Allpair法の問題点
- 前回書いたように、とにかくスイッチの多い入力項目を減らすのが最重要課題。
- 逆に、最大数より少ないスイッチしか持っていない項目は、多少増減させても全体のケース数に影響はない。
入力項目の種類と数 | ペア数 | ケース数 |
スイッチ数20の項目2つ、スイッチ数2の項目8つ | 2000ぐらい | 449 |
スイッチ数20の項目2つ、スイッチ数4の項目8つ | 3000ぐらい | 474 |
スイッチ数2の項目100個 | 20000弱 | 16 |
最近考え中のこと
- あらゆる項目を二元論的に分類して、それらの網羅テストを行えば相当少ないテストケースで一通りの網羅ができるとか考えた。
- 例えば「1つだけ入力する」「2つ以上入力する」などの分類や、テスト環境を「Windows + IE」「それ以外」などの大雑把な対応のしかたも可能であろう。