Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
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
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Motiváció
I
Feldspar fordító, értelmez˝ o összehasonlítása
I
Tesztadatok generálása
I
Nyitott rendszer I I I
kiértékelés - nyelvek generálás tulajdonság
I
Automatizált, regressziós tesztelésre alkalmas legyen
I
Ne kelljen nagy szaktudás egy teszteset megírásához
Leskó Dániel
2 / 13
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet
Tesztel˝ o keretrendszer I
Modell
I I I I
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
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet
Generátor I
Feladata I
I
I I
I
típusosan helyes Haskell tesztadatok generálása
Megvalósítás QuickCheck, SmallCheck generátorok használata továbbiakkal b˝ ovíthet˝ o a rendszer
Er˝ os típusrendszer I
I
legtöbbször nem kell megírni a generátort (arbitrary, serial) kivéve ha speciális generátorunk van az adott típushoz
I
foo :: Data Float -> DVector (Int16) -> Data Bool foo x y = ...
I
gen :: Gen (Float ::> [Int16] ::> ()) gen = genFloat ::> vectorOf 170 genInt16 ::> ()
I
Paraméterek közötti kapcsolat? Megoldható Leskó Dániel
4 / 13
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet
Transzformátor I
Transzformátor = Transzformátor-minta + tesztelend˝ o program, függvény
I
A tesztelend˝ o függvényt, programot értékeli ki
I
Elrejti a kiszámolást, kifelé egy egyszer˝ u Haskell függvénynek látszik
I
A kiszámolás módját a transzformátor-minta határozza meg
I
(evalTransformer foo) :: Transformer (Float ::> [Int16] ::> ()) (Bool ::> ())
Leskó Dániel
5 / 13
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet
Tulajdonság I
Bemenet I I I
transzformátorok végeredménye + extra adatok (futási- fordítási id˝ o, code coverage, eloc) tesztadatok
I
Kimenet: Ok / Hiba
I
Alap típusokra kell elkészíteni (példák) I
I
strictEquality, epsilonEquality, disEquality
Tulajdonság kombinátorok: I I I
elemWise, sumWise and, or, not, imply base, total Leskó Dániel
6 / 13
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Tesztadat-generálás Kiszámítás Értékelés Futtatás, környezet
Operátor
I
Összefogja, összekapcsolja az eddigi egységeket
I
Felel˝ os: I
küls˝ o konfiguráció fogadása I I I I
I I
iterációk száma epsilon, t˝ uréshatár munkakönyvtár naplózás
az eredmények megjelenítéséért összegzés, statisztikák
Leskó Dániel
7 / 13
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Transzformátor-minták Transzformátor rendszerek Statisztika
Fordító vs. Értelmez˝ o I
evalTransformer I
I
Feldspar interpretert használja a kiértékeléshez
compilerTransformer I I I
Feldspar compilert használja Feldspar függvény -> C függvény! I/O kezel˝ o 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
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Transzformátor-minták Transzformátor rendszerek Statisztika
Tesztelés referencia implementációkkal I
refHaskellTransformer I I
I
Haskell függvényt vár Haskell interpretert használ
refCTransformer I I I
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
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Transzformátor-minták Transzformátor rendszerek Statisztika
Fixpontos könyvtár tesztelése I
fixedPointTransformer
I
eddig csak azonos szignatúrájú függvényeket teszteltünk
I
float <-> int
I
er˝ os 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
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Transzformátor-minták Transzformátor rendszerek Statisztika
További minták I
constantTransformer I I
I
errorTransformer I I
I
mindig a kapott konstanst adja eredményül unit teszteléshez jó 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
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Transzformátor-minták Transzformátor rendszerek Statisztika
Transzformátor kombinátorok I
>>>
I
pairT
I
listT
I
|+>
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
Bevezetés Tesztel˝ o keretrendszer A keretrendszer + Feldspar
Transzformátor-minták Transzformátor rendszerek Statisztika
Számok
I
~ 500 teszteset
I
10,100,1000 iterációs futások
I
éjszakai tesztek hónapokon keresztül
I
számos megtalált hiba
I
szemantika pontosítása
Leskó Dániel
13 / 13