読者です 読者をやめる 読者になる 読者になる

TestLinkメモ(2)

雑記

あきぴーさんより「公開してよ」と言われたので公開してみます。

自分専用に作っただけなので使いにくいとは思いますが。

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」「それ以外」などの大雑把な対応のしかたも可能であろう。