Tulajdonságalapú tesztelés

Hasonló dokumentumok
Programozás burritokkal

Tisztán funkcionális adatszerkezetek

Tisztán funkcionális adatszerkezetek (folytatás)

Tisztán funkcionális adatszerkezetek (folytatás)

2016, Funkcionális programozás

Funkcionális Nyelvek 2 (MSc)

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

DSL-eket kétféleképpen szoktak megvalósítani:

A Feldspar fordító, illetve Feldspar programok tesztelése

2018, Funkcionális programozás

2016, Funkcionális programozás

2019, Funkcionális programozás. 5. el adás. MÁRTON Gyöngyvér

Lineáris belsőpontos Newton-iteráció

2018, Funkcionális programozás

2018, Funkcionális programozás

Funkcionális programozás

2018, Funkcionális programozás

HASKELL. Tartalom előadás

Tartalom előadás

Párhuzamos programozás Haskellben (folytatás)

Miskolci Egyetem Gazdaságtudományi Kar Üzleti Információgazdálkodási és Módszertani Intézet. Hypothesis Testing. Petra Petrovics.

FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

2019, Funkcionális programozás. 4. el adás. MÁRTON Gyöngyvér

S2-01 Funkcionális nyelvek alapfogalmai

Funkcioná lis prográmozá s Start

Feldspar: Nyelv digitális jelfeldolgozáshoz

Miskolci Egyetem Gazdaságtudományi Kar Üzleti Információgazdálkodási és Módszertani Intézet Nonparametric Tests

Széchenyi István Egyetem

C# feladatok gyűjteménye

2018, Funkcionális programozás

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Adatbázis-kezelés ODBC driverrel

Miskolci Egyetem Gazdaságtudományi Kar Üzleti Információgazdálkodási és Módszertani Intézet. Nonparametric Tests. Petra Petrovics.

Szkriptnyelvek. 1. UNIX shell

Operációs Rendszerek II. labor. 2. alkalom

Statistical Inference


Felhasználó által definiált adattípus

Attribútumok, constraint-ek

discosnp demo - Peterlongo Pierre 1 DISCOSNP++: Live demo

Doktori értekezés. Diviánszky Péter 2012.

Kifejezések. Kozsik Tamás. December 11, 2016

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Statistical Dependence

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Cluster Analysis. Potyó László

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

Imperatív programozás

C#, OOP. Osztályok tervezése C#-ban

Megoldott feladatok. Informatika





























Az arrow struktúra. Patai Gergely április 1.

Constraint-ek. Fehér Béla Szántó Péter, Lazányi János, Raikovich Tamás BME MIT FPGA laboratórium

4. Példa: Másodfokú egyenlet megoldása (program2_1.vi)

A WEB programozása - JSP1 dr.gál Tibor őszi félév

Programozás C++ -ban 2007/4

Absztrakt adattípus - algebrai specifikáció - Lists (paraméteres) module imports end exports parameters variables sorts operations equations

C# gyorstalpaló. Készítette: Major Péter

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Internet technológiák

Collections. Összetett adatstruktúrák

Egyszabadságfokú grejesztett csillapított lengõrendszer vizsgálata

Az F# nyelv erőforrásanalízise

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Java programozási nyelv 7. rész Java osztálykönyvtár 1.

S z á m í t ó g é p e s a l a p i s m e r e t e k

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

ROS Remote Operations Service

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Átírás:

Tulajdonságalapú tesztelés

QuickCheck A QuickCheck Haskell programok automatikus, tulajdonságalapú tesztelésére használható. Programspecifikáció: program által teljesítendő tulajdonságok Nagy számú, a tulajdonságok alapján generált tesztesetek A specifikáció Haskellben adható meg, kombinátorokkal További kombinátorok: tulajdonságok definiálása, eredmények elemzése, tesztadatok előállítása Megvalósítás: beágyazott szakterületspecifikus nyelv (embedded domain-specific language), amely viszont tetszőleges nyelven írt program teszteléséhez használható! "The coolest example of type classes that I know" Simon Peyton Jones ("Adventure with Types in Haskell", https://www.youtube.com/watch?v=6covd8oynmi) [2..16]

A QuickCheck (Test.QuickCheck) használata flicksort :: Ord α [α] [α] flicksort [] = [] flicksort (x : y : xs) = (y : x : xs) flicksort xs = sort xs -- prop_idempotent :: [Int] Bool prop_idempotent xs = flicksort (flicksort xs) flicksort xs Tesztelés: -- quickcheck :: Testable prop => prop -> IO () GHCi> quickcheck prop_idempotent +++ OK, passed 100 tests. További tulajdonságok: prop_ordered xs = ordered (flicksort xs) where ordered xs = and (zipwith (<) xs (tail xs)) prop_sortmodel xs = (sort xs) (flicksort xs) prop_append xs ys = not (null xs) not (null ys) head (flicksort (xs ++ ys)) (minimum xs) min (minimum ys) Bővebben: http://hackage.haskell.org/package/quickcheck [3..16]

Tesztelés tetszőleges adattípussal data Ternary = Yes No Unknown deriving (Show, Eq) instance Arbitrary Ternary where -- arbitrary = elements [Yes, No, Unknown] arbitrary = do n choose (0, 2) :: Gen Int return $ case n of 0 Yes 1 No _ Unknown [4..16]

Tesztelés tetszőleges adattípussal (folytatás) data Tree α = Node α (Tree α) (Tree α) Leaf deriving (Show, Eq) instance Arbitrary α Arbitrary (Tree α) where arbitrary = sized tree where tree 0 = return Leaf tree n = do elem arbitrary lt tree (n div 2) rt tree (n div 2) return (Node elem lt rt) shrink Leaf = [] shrink (Node x l r) = [Leaf ] ++ [l, r] ++ [Node x l r (x, (l, r )) shrink (x, (l, r))] [5..16]

Nem üres listák generáltatása (példa) Kipróbálás: newtype NonEmptyList α = NEL [α] deriving (Eq, Ord, Show) instance Arbitrary α Arbitrary (NonEmptyList α) where arbitrary = do xs arbitrary suchthat (not null) return (NEL xs) GHCi> sample (arbitrary :: Gen (NonEmptyList Int)) Alternatív megoldás: instance Arbitrary α Arbitrary (NonEmptyList α) where arbitrary = sized list where list n = do xs form [0..n] (λ _. arbitrary) return (NEL xs) [6..16]

Implementáció: A Gen monád -- StdGen, Random, randomr, split: System.Random newtype Gen α = G (StdGen Int α) rungen :: Gen α StdGen Int α rungen (G f ) r n = f r n instance Functor Gen where fmap f x = G $ λ r n. f (rungen x r n) instance Applicative Gen where pure x = G $ λ. x f < > x = G $ λ r n. (rungen f r n) (rungen x r n) instance Monad Gen where x >>= f = G $ λ r n. let (r 1, r 2 ) = split r in let x = f (rungen x r 1 n) in rungen x r 2 n choose :: Random α (α, α) Gen α choose rng = G $ λ r _. fst (randomr rng r) [7..16]

Implementáció: A Gen monád (folytatás) oneof :: [Gen α] Gen α oneof [] = error Empty list oneof gs = do i choose (0, (length gs) 1) gs!! i elements :: [α] Gen α elements xs = oneof (map return xs) sized :: (Int Gen α) Gen α sized f = G $ λ r n.r rungen (f n) r n sample :: Gen α IO [α] sample m = do rnd 0 newstdgen let rnds rnd = rnd 1 : rnds rnd 2 where (rnd 1, rnd 2 ) = split rnd return [ rungen m r n (r, n) (rnds rnd 0 ) zip [0, 2... 20] ] sample :: (Show α) Gen α IO () sample g = do samples sample g form_ samples print [8..16]

Implementáció: Az Arbitrary osztály class Arbitrary α where arbitrary :: Gen α arbitrary = error No default generator shrink :: α [α] shrink _ = [] instance Arbitrary () where arbitrary = return () instance Arbitrary Bool where arbitrary = choose (False, True) shrink True = [False] shrink False = [] [9..16]

Implementáció: Az Arbitrary osztály (egészek) instance Arbitrary Integer where arbitrary = sized $ λ n. do let n = tointeger n choose ( n, n ) shrink x = nub ([ x x < 0, x > x ] ++ others) where others = takewhile (<< x) approx approx = (0 : [x i i tail (iterate ( quot 2) x)]) a << b = case (a 0, b 0) of (True, True) a < b (False, False) a > b (True, False) a + b < 0 (False, True) a + b > 0 [10..16]

Implementáció: Az Arbitrary osztály (párok és listák) instance (Arbitrary α, Arbitrary β) Arbitrary (α, β) where arbitrary = do x arbitrary y arbitrary return (x, y) shrink (x, y) = [ (x, y) x shrink x ] ++ [ (x, y ) y shrink y ] instance Arbitrary α Arbitrary [α] where arbitrary = sized $ λ n. do k choose (0, n) form [1..k] (λ _. arbitrary) shrink [] = [] shrink (x : xs) = [xs] ++ [ x : xs xs shrink xs ] ++ [ x : xs x shrink x ] [11..16]

Függvények generálása A Gen bővítése: promote :: Monad µ µ (Gen α) Gen (µ α) promote m = G $ λ r n. do g m return (rungen g r n) variant :: Integer Gen α Gen α variant k 0 g = G (λ r n. rungen g (var k 0 r) n) where var k r k k = r otherwise = var k r where (r 1, r 2 ) = split r r even k = r 1 otherwise = r 2 k = k div 2 Az Arbitrary bővítése: class CoArbitrary α where coarbitrary :: α Gen γ Gen γ (><) :: (Gen α Gen α) (Gen α Gen α) (Gen α Gen α) (><) f g gen = do n arbitrary (g variant n f ) gen [12..16]

Függvények generálása (folytatás) Például: instance (CoArbitrary α, Arbitrary β) Arbitrary (α β) where arbitrary = promote ( coarbitrary arbitrary) instance CoArbitrary Bool where coarbitrary False = variant 0 coarbitrary True = variant ( 1) instance CoArbitrary Integer where coarbitrary = variant instance (CoArbitrary α, CoArbitrary β) CoArbitrary (α, β) where coarbitrary (x, y) = coarbitrary x >< coarbitrary y instance CoArbitrary α CoArbitrary [α] where coarbitrary [] = variant 0 coarbitrary (x : xs) = variant ( 1) coarbitrary (x, xs) GHCi> fs <- sample (arbitrary :: Gen (Integer -> Integer)) GHCi> map (\f -> f 0) fs [0,0,-4,-1,7,10,10,5,6,-6,-1] [13..16]

Implementáció: A Property típus type Result = Maybe Bool -- Nothing: discarded type LGen = WriterT String Gen type Property = LGen Result runproperty :: Property Gen (Result, String) runproperty = runwritert class Testable π where property :: π Property instance Testable () where property _ = return Nothing instance Testable Bool where property b = return (Just b) instance Testable Result where property = return [14..16]

Implementáció: A Property típus (folytatás) instance (Testable π) Testable (LGen π) where property p = do x p property x instance (Arbitrary α, Show α, Testable π) Testable (α π) where property f = do x lift arbitrary tell (show x) property (f x) infixr 0 ( ) :: (Testable π) Bool π Property False _ = property () True p = property p togen :: (Testable π) π Gen (Result, String) togen = runproperty property [15..16]

Implementáció: A meghajtó (driver) check :: (Testable π) π IO () check p = do rnd newstdgen let (maxrun, maxdiscarded) = (100, 100) (n, d) test (maxrun, maxdiscarded, 0, rnd) (rungen (togen p)) let (run, discarded) = (100 n, 100 d) putstrln (show run ++ tests run, ++ show discarded ++ discarded. ) test :: (Int, Int, Int, StdGen) (StdGen Int (Result, String)) IO (Int, Int) test (0, d, _, _) _ = return (0, d) test (n, 0, _, _) _ = return (n, 0) test (n, d, s, seed) f = do let (rnd 1, rnd 2 ) = split seed let (p, t) = f rnd 1 s case p of Nothing test (n, d 1, s + 1, rnd 2 ) f Just True test (n 1, d, s + 1, rnd 2 ) f Just False do putstrln ( Failed : ++ t) return (n, d) [16..16]