VOOZH about

URL: https://hu.wikipedia.org/wiki/Modul:UnitTesztek

⇱ Modul:UnitTesztek – Wikipédia


Ugrás a tartalomhoz
Ellenőrzött
A Wikipédiából, a szabad enciklopédiából
Ez a közzétett változat, ellenőrizve: 2014. április 28.
Pontosságellenőrzött

👁 Image
UnitTesztek[mi ez?] • [dokumentáció: mutat, szerkeszt] • [tesztek: létrehozás]

Az UnitTesztek modul tesztelési lehetőséget biztosít más , a require utasítást alkalmazó szkriptek számára. Lásd a részleteket itt: w:Wikipedia:Lua#Unit_testing. Nézzük pl. a Modul:Banánok/tesztdoboz modult:

-- Unit tesztelése a [[Modul:Banánok]]on. Klikkelj a vitalapra, hogy elinduljon a teszt.
localp=require('Module:UnitTests')

functionp:test_hello()
self:preprocess_equals('{{#invoke:Banánok | hello}}','Hello, world!')
end

returnp

A Modulvita:Banánok/tesztdoboz a következő kódot hajtja végre:

{{#invoke: Banánok/tesztdoboz| run_tests}}.

Minden egyes tesztelést szolgáló metódust, amelyet a "run_tests" végrehajtásra vár, kötelezően - mint a példabeli test_hello (lásd fent) a "test" sztringgel kell kezdenünk, mert erről ismeri fel a run_test metódus a tesztelni kívánt függvényt. Összetettebb példa: Modul:URLutil/teszt

  • run_tests(differs_at): Minden tesztet végrehajt. Ha "differs_at=1" módon specifikáljuk, akkor kapunk egy újabb oszlopot, amelyben megtalálhatjuk az általunk elvárt és a teszttől kapott végeredmény közötti első eltérő karaktert. Szokásosan az egyes unit teszt modulok modulvita-lapján használjuk.
 {{#invoke:Banánok/tesztdoboz|run_tests(|opcionálisan megadhatod: differs_at=1)}}

preprocess_equals

[forrásszöveg szerkesztése]
  • preprocess_equals(szöveg, elvárt): Végrehajtja (preprocessing) azt a szöveget, amit az első argumentumában talál és összeveti azt a mi elvárt eredményünkkel. Szkripteket és sablonokat egyformán hívhatunk meg, ezek eredményei a lap tartalmába kerülnek majd.
self:preprocess_equals('{{#invoke:Banánok | hello}}','Hello, világ!')

preprocess_equals_many

[forrásszöveg szerkesztése]
  • preprocess_equals_many(prefix, suffix, párok): Egy sorozat preprocess_equals() hívást valósít meg a megadott párokból álló halmazon. Automatikusan hozzáfűzi a megadott prefix és suffix-eket minden szöveghez.
self:preprocess_equals_many('{{#invoke:BanánokArgumentumok | add |','}}',{
{'2|3','5'},
{'-2|2','0'},
})

preprocess_equals_preprocess

[forrásszöveg szerkesztése]
  • preprocess_equals_preprocess(text, elvárt): két wikitext végrehajtása (preprocessing) és az ezekből előálló eredmények azonosságának vizsgálatát végzi. Hasznos, ha szkripteket akarunk összevetni, hogy ugyanazt teljesítik-e, amit egy már ismert sablon.
self:preprocess_equals_preprocess('{{#invoke:Banánok | hello}}','{{Hello}}')

Vizsgálható, hogy az Helló, világ! a Sablon:Hello sablonnal azonos eredményt nyújtja-e.

preprocess_equals_preprocess_many

[forrásszöveg szerkesztése]
  • preprocess_equals_preprocess_many(prefix, suffix, párok)}}: Megvalósít egy sorozatot a preprocess_equals_preprocess() függvényhívásokból, "párok" ismét adott párokból álló halmaz. A prefix/suffix automatikusan hozzáadódik. Ha valamely páron belül nem adjuk meg a másodikat, akkor a pár második elemének is az elsőt tekinti.
self:preprocess_equals_preprocess_many('{{#invoke:Foo | spellnum |','}}','{{spellnum','}}',{
{'2'},-- equivalent to {'2','2'},
{'-2','-2.0'},
})
  • equals(név, aktuális, elvárt): Visszaad egy számított értéket, meg az elvárt értéket és ellenőrzi, hogy az egyenlőség (== operátor) fennáll-e. Olyankor hasznos, ha más modulokon belül felhasználni kívánt modulunkat kívánjuk tesztelni és nem kívánjuk az #invoke parser funkciót használni eközben.
self:equals('Simple addition',2+2,4)
  • equals_deep(név, aktuális, elvárt): Mint előbb az equals, de táblákat kezel, mélységében végez összehasonlítást. Egyetlen értéknek sem szabad körbe mutató referenciákat tartalmaznia, mivel - egyrészt ezeket a jelenlegi változat nem interpretálja - másrészt végtelen ciklust hozhat ez létre.
self:equals_deep('Tábla egybevetés',createRange(1,3),{1,2,3})
-- UnitTester provides unit testing for other Lua scripts. For details see [[Wikipedia:Lua#Unit_testing]].
-- For user documentation see talk page.
localUnitTester={}
localframe,tick,cross
localresult_table_header="{|class=\"wikitable\"\n! !! Szöveg !! Elvárt !! Aktuális"
localresult_table=''
localnum_failures=0
functionfirst_difference(s1,s2)
ifs1==s2thenreturn''end
localmax=math.min(#s1,#s2)
fori=1,maxdo
ifs1:sub(i,i)~=s2:sub(i,i)thenreturniend
end
returnmax+1
end
functionUnitTester:preprocess_equals(text,expected,options)
localactual=frame:preprocess(text)
ifactual==expectedthen
result_table=result_table..'| '..tick
else
result_table=result_table..'| '..cross
num_failures=num_failures+1
end
localnowiki_open=(optionsandoptions.nowiki)and'<nowiki>'or''
localnowiki_close=(optionsandoptions.nowiki)and'</nowiki>'or''
localdiffers_at=self.differs_atand(' || '..first_difference(expected,actual))or''
result_table=result_table..' || <nowiki>'..text:gsub('%|','&#124;')..'</nowiki> || '..nowiki_open..expected..nowiki_close..' || '..nowiki_open..actual..nowiki_close..differs_at.."\n|-\n"
end
functionUnitTester:preprocess_equals_many(prefix,suffix,cases,options)
for_,caseinipairs(cases)do
self:preprocess_equals(prefix..case[1]..suffix,case[2],options)
end
end
functionUnitTester:preprocess_equals_preprocess(text1,text2,options)
localactual=frame:preprocess(text1)
localexpected=frame:preprocess(text2)
ifactual==expectedthen
result_table=result_table..'| '..tick
else
result_table=result_table..'| '..cross
num_failures=num_failures+1
end
localnowiki_open=(optionsandoptions.nowiki)and'<nowiki>'or''
localnowiki_close=(optionsandoptions.nowiki)and'</nowiki>'or''
localdiffers_at=self.differs_atand(' || '..first_difference(expected,actual))or''
result_table=result_table..' || <nowiki>'..text1:gsub('%|','&#124;')..'</nowiki> || '..nowiki_open..expected..nowiki_close..' || '..nowiki_open..actual..nowiki_close..differs_at.."\n|-\n"
end
functionUnitTester:preprocess_equals_preprocess_many(prefix1,suffix1,prefix2,suffix2,cases,options)
for_,caseinipairs(cases)do
self:preprocess_equals_preprocess(prefix1..case[1]..suffix1,prefix2..(case[2]andcase[2]orcase[1])..suffix2,options)
end
end
functionUnitTester:equals(name,actual,expected,options)
ifactual==expectedthen
result_table=result_table..'| '..tick
else
result_table=result_table..'| '..cross
num_failures=num_failures+1
end
localnowiki_open=(optionsandoptions.nowiki)and'<nowiki>'or''
localnowiki_close=(optionsandoptions.nowiki)and'</nowiki>'or''
localdiffers_at=self.differs_atand(' || '..first_difference(expected,actual))or''
result_table=result_table..' || '..name..' || '..nowiki_open..expected..nowiki_close..' || '..nowiki_open..actual..nowiki_close..differs_at.."\n|-\n"
end
localfunctiondeep_compare(t1,t2,ignore_mt)
localty1=type(t1)
localty2=type(t2)
ifty1~=ty2thenreturnfalseend
ifty1~='table'andty2~='table'thenreturnt1==t2end
localmt=getmetatable(t1)
ifnotignore_mtandmtandmt.__eqthenreturnt1==t2end
fork1,v1inpairs(t1)do
localv2=t2[k1]
ifv2==nilornotdeep_compare(v1,v2)thenreturnfalseend
end
fork2,v2inpairs(t2)do
localv1=t1[k2]
ifv1==nilornotdeep_compare(v1,v2)thenreturnfalseend
end
returntrue
end
functionval_to_str(v)
iftype(v)=='string'then
v=mw.ustring.gsub(v,'\n','\\n')
ifmw.ustring.match(mw.ustring.gsub(v,'[^\'"]',''),'^"+$')then
return"'"..v.."'"
end
return'"'..mw.ustring.gsub(v,'"','\\"')..'"'
else
returntype(v)=='table'andtable_to_str(v)ortostring(v)
end
end
functiontable_key_to_str(k)
iftype(k)=='string'andmw.ustring.match(k,'^[_%a][_%a%d]*$')then
returnk
else
return'['..val_to_str(k)..']'
end
end
functiontable_to_str(tbl)
localresult,done={},{}
fork,vinipairs(tbl)do
table.insert(result,val_to_str(v))
done[k]=true
end
fork,vinpairs(tbl)do
ifnotdone[k]then
table.insert(result,table_key_to_str(k)..'='..val_to_str(v))
end
end
return'{'..table.concat(result,',')..'}'
end
functionUnitTester:equals_deep(name,actual,expected,options)
ifdeep_compare(actual,expected)then
result_table=result_table..'| '..tick
else
result_table=result_table..'| '..cross
num_failures=num_failures+1
end
localnowiki_open=(optionsandoptions.nowiki)and'<nowiki>'or''
localnowiki_close=(optionsandoptions.nowiki)and'</nowiki>'or''
localactual_str=val_to_str(actual)
localexpected_str=val_to_str(expected)
localdiffers_at=self.differs_atand(' || '..first_difference(expected_str,actual_str))or''
result_table=result_table..' || '..name..' || '..nowiki_open..expected_str..nowiki_close..' || '..nowiki_open..actual_str..nowiki_close..differs_at.."\n|-\n"
end
functionUnitTester:run(frame_arg)
frame=frame_arg
self.frame=frame
self.differs_at=frame.args['differs_at']
tick=frame:preprocess('{{zöldpipa}}')
cross=frame:preprocess('{{pirosiksz}}')
localtable_header=result_table_header
ifself.differs_atthen
table_header=table_header..' !! Különbözik itt:'
end
forkey,valueinpairs(self)do
ifkey:find('^test')then
result_table=result_table.."'''"..key.."''':\n"..table_header.."\n|-\n"
value(self)-- ez és környezete már elavult
result_table=result_table.."|}\n\n"
end
end
return(num_failures==0and"<font color=\"#008000\">'''Minden teszt sikeres.'''</font>"or"<font color=\"#800000\">'''"..num_failures.." sikertelen tesz.'''</font>").."\n\n"..frame:preprocess(result_table)
end
functionUnitTester:run(frame_arg)
frame=frame_arg
self.frame=frame
self.differs_at=frame.args['differs_at']
tick=frame:preprocess('{{zöldpipa}}')
cross=frame:preprocess('{{pirosiksz}}')
localtable_header=result_table_header
ifself.differs_atthen
table_header=table_header..' !! Különbözik ettől'
end
-- Sort results into alphabetical order.
localself_sorted={}
forkey,valueinpairs(self)do
ifkey:find('^test')then
table.insert(self_sorted,key)
end
end
table.sort(self_sorted)
fori,valueinipairs(self_sorted)do
result_table=result_table.."'''"..value.."''':\n"..table_header.."\n|-\n"
self[value](self)
result_table=result_table.."|}\n\n"
end
return(num_failures==0and"<font color=\"#008000\">'''Minden teszt sikeres.'''</font>"or"<font color=\"#800000\">'''ennyi hibás van:"..num_failures.." '''</font>").."\n\n"..frame:preprocess(result_table)
end
functionUnitTester:new()
localo={}
setmetatable(o,self)
self.__index=self
returno
end
localp=UnitTester:new()
functionp.run_tests(frame)returnp:run(frame)end
returnp