👁 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
Metódusok
[forrásszöveg szerkesztése]run_tests
[forrásszöveg szerkesztése]- 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
[forrásszöveg szerkesztése]- 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
[forrásszöveg szerkesztése]- 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('%|','|')..'</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('%|','|')..'</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
