Luaスクリプトに基づく自動化テストフレームワーク設計



一、自動化テストの背景
1.被験者は、組み込みシステムにおいてLuaスクリプトを用いて接着するモジュールインタフェースである.Luaスクリプトを作成してこれらのインタフェースを呼び出してインタフェースをテストする必要があります.実行環境は組み込みシステムでPC機ではありません.
2.テストスクリプトは回帰テストとテスト結果の自動判断とテストレポートの出力を行うことができる
二、実現方法
主にXUnitフレームワークメカニズムを参考にしてテストキットのパッケージを実現し、そのパッケージの対象は以下の通りである.
1.テスト環境
2.自動化判断
3.テストログ
4.テスト実行状況統計
5.テストレポート
三、テストフレームワーク
1. InitTestFrame()                        --  , ,  
2. SetCurrModule("CurrModuleName")      --  
3. WriteCaseName("CurrCaseName")        --  
4. WriteCaseStep("CurrStepName")          --  
5. ret = AssertResult("sExpects","RealResult")  -- ( ) 
6. WriteReport(ret,"sRealResult")            --  
7. GetStatistic()                          --  

四、実現コード
1.環境変数
 -- ,  
  if TestEntironment == nil then  -- TestEntironment 
      Win32   = 1 
      Symbian = 2 
      TestEntironment = Win32 
      --TestEntironment = Symbian 
  End 
   
  if TestEntironment == Win32 then 
      reportfile = "..\\TestCode\\TestReport.txt"  --  
  else 
      reportfile = "c:\\TestCode\\TestReport.txt"  --  
  end 

2.テストフレームワークの初期化
 --  
  function InitTestFrame() 
      --  
      tRunStatistic = {} 
      tRunStatisticIndex = 0   --tRunStatistic  
       
      CurrNGModuleIndex  = 0 
      CurrNGCaseIndex    = 0    
      --  
      tRunNG = {} 
  end 

3.テストパッケージ
function WriteCaseName(sCaseName)   -- ,   
      CurrCase = sCaseName  
      local h = io.open(reportfile,"a")  
      io.output(h)  
      local sWriteStr = "
【" .. sCaseName .."】" .. "
" if TestEntironment == Win32 then print(sWriteStr) end io.write(sWriteStr) io.close(h) end function WriteCaseStep(sStep) -- , CurrStep = sStep local h = io.open(reportfile,"a") io.output(h) local sWriteStr = " |--" .. sStep .. "
" if TestEntironment == Win32 then print(sWriteStr) end io.write(sWriteStr) io.close(h) end function SetCurrModule(sModuleName) CurrModule = sModuleName temp = {Module = sModuleName,iRunCaseNum = 0,iOKCaseNum = 0,iNGCaseNum = 0} tRunStatisticIndex = tRunStatisticIndex + 1 table.insert(tRunStatistic,tRunStatisticIndex,temp) end

4.自動化判断
--    
  function AssertResult(sExpects,RealResult)  
      if sExpects == RealResult then  
          return "OK"  
      else   
          return "NG"  
      end  
  
  end

5.テストログ
 function WriteMsg(sMsg)  
      local h = io.open(reportfile,"a")  
      io.output(h)  
      local sWriteStr = sMsg .. "
" if TestEntironment == Win32 then print(sWriteStr) end io.write(sWriteStr) io.close(h) end

6.テストレポート
--   
  function WriteReport(sAssertResult,sRealResult)  
      local h = io.open(reportfile,"a")  
      io.output(h)  
      local sWriteStr = "       " .. sAssertResult .."    (RealResult:" .. sRealResult .. ")
" if TestEntironment == Win32 then print(sWriteStr) end io.write(sWriteStr) io.input(h) io.close(h) AddRunStatistic(sAssertResult) end

7.テスト実行統計
function AddRunStatistic(sAssertResult)  
      --   
      tRunStatistic[tRunStatisticIndex].iRunCaseNum = tRunStatistic[tRunStatisticIndex].iRunCaseNum + 1  
      if sAssertResult == "OK" then  
         tRunStatistic[tRunStatisticIndex].iOKCaseNum = tRunStatistic[tRunStatisticIndex].iOKCaseNum + 1  
      else  
         tRunStatistic[tRunStatisticIndex].iNGCaseNum = tRunStatistic[tRunStatisticIndex].iNGCaseNum + 1  
           
         -- tRunNG  
         if (tRunNG[CurrNGModuleIndex]~= nil)and(tRunNG[CurrNGModuleIndex][1] == CurrModule) then  -- Module   
             if (tRunNG[CurrNGModuleIndex] [2][CurrNGCaseIndex][1]~= nil)and(tRunNG[CurrNGModuleIndex][2] [CurrNGCaseIndex][1] == CurrCase) 
 then -- Case   
                 -- Step   
                 table.insert(tRunNG[CurrNGModuleIndex][2][CurrNGCaseIndex][2],CurrStep)  
             else  
                 -- Case   
                 table.insert(tRunNG[CurrNGModuleIndex][2],{CurrCase,{CurrStep}})  
                 CurrNGCaseIndex = CurrNGCaseIndex + 1  
             end  
         else -- Module   
             table.insert(tRunNG,{CurrModule,{{CurrCase,{CurrStep}}}})  
             CurrNGModuleIndex = CurrNGModuleIndex + 1  
             CurrNGCaseIndex   = 1  -- 1  
         end  
      end   
  end  
    
    
  --   
  function GetStatistic()    
      WriteMsg("
Testcase run statistic:") WriteMsg("**********************************************************************") WriteMsg("【ModuleName】".." 【Run】".." 【OK】".." 【NG】") WriteMsg("----------------------------------------------------------------------") for i = 1,table.getn(tRunStatistic) do -- s1 = "" for j = 1,24 - string.len(tRunStatistic[i].Module) do s1 = s1 .." " end s2 = "" for j = 1,17 - string.len(tRunStatistic[i].iRunCaseNum) do s2 = s2 .. " " end s3 = "" for j = 1,16 - string.len(tRunStatistic[i].iOKCaseNum) do s3 = s3 .. " " end WriteMsg(i..":"..tRunStatistic[i].Module..s1..tRunStatistic[i].iRunCaseNum..s2..tRunStatistic[i].iOKCaseNum..s3..tRunStatistic[i] .iNGCaseNum) end WriteMsg("**********************************************************************") -- GetRunNGCase() end -- function GetRunNGCase() WriteMsg("NG case info:") if table.getn(tRunNG)==0 then WriteMsg("No NG case,are you sure your case is perfect?") end for i = 1,table.getn(tRunNG) do WriteMsg(tRunNG[i][1]) --Module Name for j = 1,table.getn(tRunNG[i][2]) do WriteMsg(" |--"..tRunNG[i][2][j][1]) --Case Name for k = 1,table.getn(tRunNG[i][2][j][2]) do WriteMsg(" |--"..tRunNG[i][2][j][2][k]) -- Step Name end end end end

五、使い方
1.テストケース
function db_read_case()  
      WC("db_read_case");  
      WS("Step1")  
      h = db.open(U(Sdir .. "dbComm"))  
      --WM(h)  
      --       
      for i = 1,TEST_RECORD do  
          writeField = string.char(0x15)  
          for j = 1,20 do  
              writeField = writeField .. string.char(i+j)  
          end  
          readField = db.read(h,i,0,512)   --   
          ret = AR(writeField,readField)  
          if(ret == "NG")then  
              WM("error:".. i)  
              break  
          end  
      end  
  WR(ret,"nil")  
    
      --   
      db.close(h)  
  end  
    
  --   
  InitTestFrame()  
  WriteMsg("Database API test begin ...")  
  SetCurrModule("Database")  
  CreateEntironment() --   
  db_read_case()  
  DestroyEntironment()--   
  WriteMsg("Database API test end!
") GetStatistic()

2.テストレポート
****************************************************  
  Tester   :Anndy
  Test Date:03/27/08 15:19:06  
    
  Database API test begin ...  
    
  【db_read_case】  
     |--Step1  
         OK    (RealResult:nil)  
     |--Step2  
         OK    (RealResult:nil)  
  Database API test end!  
    
  Testcase run statistic:  
  **********************************************************************  
  【ModuleName】          【Run】          【OK】          【NG】  
  ----------------------------------------------------------------------  
  1:Database                57               49              8  
  **********************************************************************  
  NG case info:  
  Database  
    |--db_read_case  
          |--Step1  
    |--db_update_case  
          |--Step4