Luaスクリプトに基づく自動化テストフレームワーク設計
8626 ワード
一、自動化テストの背景
1.被験者は、組み込みシステムにおいてLuaスクリプトを用いて接着するモジュールインタフェースである.Luaスクリプトを作成してこれらのインタフェースを呼び出してインタフェースをテストする必要があります.実行環境は組み込みシステムでPC機ではありません.
2.テストスクリプトは回帰テストとテスト結果の自動判断とテストレポートの出力を行うことができる
二、実現方法
主にXUnitフレームワークメカニズムを参考にしてテストキットのパッケージを実現し、そのパッケージの対象は以下の通りである.
1.テスト環境
2.自動化判断
3.テストログ
4.テスト実行状況統計
5.テストレポート
三、テストフレームワーク
四、実現コード
1.環境変数
2.テストフレームワークの初期化
3.テストパッケージ
4.自動化判断
5.テストログ
6.テストレポート
7.テスト実行統計
五、使い方
1.テストケース
2.テストレポート
一、自動化テストの背景
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