A Feldspar fordító, illetve Feldspar programok tesztelése [KMOP-1.1.2-08/1-2008-0002 társfinanszírozó: ERFA] Leskó Dániel Eötvös Loránd Tudományegyetem Programozási Nyelvek és Fordítóprogramok Tanszék 2012. június 19. Leskó Dániel 1 / 13
Motiváció Feldspar fordító, értelmező összehasonlítása Tesztadatok generálása Nyitott rendszer kiértékelés - nyelvek generálás tulajdonság Automatizált, regressziós tesztelésre alkalmas legyen Ne kelljen nagy szaktudás egy teszteset megírásához Leskó Dániel 2 / 13
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet Modell Generátor Transzformátor Tulajdonság Operátor Leskó D., Tejfel M.: Testing framework for embedded languages /Symposium on Computer Languages, Implementations and Tools 2012/ Leskó Dániel 3 / 13
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet Generátor Feladata típusosan helyes Haskell tesztadatok generálása Megvalósítás QuickCheck, SmallCheck generátorok használata továbbiakkal bővíthető a rendszer Erős típusrendszer legtöbbször nem kell megírni a generátort (arbitrary, serial) kivéve ha speciális generátorunk van az adott típushoz foo :: Data Float -> DVector (Int16) -> Data Bool foo x y =... gen :: Gen (Float ::> [Int16] ::> ()) gen = genfloat ::> vectorof 170 genint16 ::> () Paraméterek közötti kapcsolat? Megoldható Leskó Dániel 4 / 13
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet Transzformátor Transzformátor = Transzformátor-minta + tesztelendő program, függvény A tesztelendő függvényt, programot értékeli ki Elrejti a kiszámolást, kifelé egy egyszerű Haskell függvénynek látszik A kiszámolás módját a transzformátor-minta határozza meg (evaltransformer foo) :: Transformer (Float ::> [Int16] ::> ()) (Bool ::> ()) Leskó Dániel 5 / 13
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet Tulajdonság Bemenet transzformátorok végeredménye + extra adatok (futási- fordítási idő, code coverage, eloc) tesztadatok Kimenet: Ok / Hiba Alap típusokra kell elkészíteni (példák) strictequality, epsilonequality, disequality Tulajdonság kombinátorok: elemwise, sumwise and, or, not, imply base, total Leskó Dániel 6 / 13
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet Operátor Összefogja, összekapcsolja az eddigi egységeket Felelős: külső konfiguráció fogadása iterációk száma epsilon, tűréshatár munkakönyvtár naplózás az eredmények megjelenítéséért összegzés, statisztikák Leskó Dániel 7 / 13
Transzformátor-minták Transzformátor rendszerek Statisztika Fordító vs. Értelmező evaltransformer Feldspar interpretert használja a kiértékeléshez compilertransformer Feldspar compilert használja Feldspar függvény -> C függvény! I/O kezelő main() függvényt a transzformátor generálja tc1 = TestCase { tc_name = "example tc", gen = arbitrary, trans = [ evaltransformer foo, compilertransformer foo], prop = strictequality} Leskó Dániel 8 / 13
Transzformátor-minták Transzformátor rendszerek Statisztika Tesztelés referencia implementációkkal refhaskelltransformer Haskell függvényt vár Haskell interpretert használ refctransformer C függvényt vár C fordítót használ I/O megkötések tc_round_float = TestCase { tc_name = "round Float to Int8(eval-comp-ref)", gen = R.genFloat ::> (), trans = [ compilertransformer Feldspar.roundFloat, evaltransformer Feldspar.roundFloat, refhaskelltransformer ((H.round) :: Float -> Int8)], prop = strictequality} Leskó Dániel 9 / 13
Transzformátor-minták Transzformátor rendszerek Statisztika Fixpontos könyvtár tesztelése fixedpointtransformer eddig csak azonos szignatúrájú függvényeket teszteltünk float <-> int erős típusrendszer visszaüt! TestCase { tc_name = "Plus", gen = genfloat ::> genfloat ::> (), trans = [ compilertransformer ((+) :: Data Float -> Data Float -> Data Float), fixedpointtransformer ((+) :: Fix Int32 -> Fix Int32 -> Fix Int32) (-8 ::> -8 ::> -10)], prop = epsilonequality 0.03} Leskó Dániel 10 / 13
Transzformátor-minták Transzformátor rendszerek Statisztika További minták constanttransformer mindig a kapott konstanst adja eredményül unit teszteléshez jó errortransformer mindig hibával tér vissza pl.: elvárt fordítási hibák tesztelése convertertransformer TestCase { tc_name = "(length) with DVectors (eval-refhaskell-comp)", gen = vectorof 256 genint32 ::> (), trans = [ refhaskelltransformer Prelude.length >>> convertertransformer (fromintegral ::> id), evaltransformer length_dv, compilertransformer length_dv], prop = strictequality} Leskó Dániel 11 / 13
Transzformátor-minták Transzformátor rendszerek Statisztika Transzformátor kombinátorok >>> pairt listt +> TestCase{ tc_name = "sys eval-comp", gen = arbitrary, trans = [( evaltransformer sqr pairt (compilertransformer sqr >>> refhaskelltransformer (P.replicate 10) ) ) >>> convertertransformer ((\(a,b) -> (a,p.sum b)) ::> id)], prop = (\i [Result o1 _] opts -> True)} Leskó Dániel 12 / 13
Transzformátor-minták Transzformátor rendszerek Statisztika Számok ~ 500 teszteset 10,100,1000 iterációs futások éjszakai tesztek hónapokon keresztül számos megtalált hiba szemantika pontosítása Leskó Dániel 13 / 13