Ariciul iti va manca toate bug-urile.

Hedgehog este un sistem modern de testare bazat pe proprietati in spiritul QuickCheck, scris initial in Haskell, dar acum disponibil si in R. Unul dintre beneficiile cheie ale Hedgehog este micsorarea integrata a contraexemplelor, care permite gasirea rapida a cauzei erorilor, date exemple evidente atunci cand apare un comportament incorect.

  • Testare bazata pe proprietati expresive.
  • Micsorarea integrata, micsorarea asculta invariantii prin constructie.
  • Generatoarele pot fi combinate pentru a construi structuri complexe si interesante.
  • Testarea masinii in stare abstracta.
  • Compatibilitate completa cu testul care faciliteaza adaugarea testelor bazate pe proprietati, fara a va perturba fluxul de lucru.

Pentru a arata rapid cum se simte Hedgehog, iata un exemplu care arata cateva dintre proprietatile pe care ar trebui sa le aiba o functie care inverseaza un vector. Vom testa functia rev din pachetul: base.

test_that (“Reversul invers este identitate”, forall (gen.c (gen.element (1: 100)), functie (xs) expect_equal (rev (rev (xs)), xs)))

Proprietatea de mai sus testeaza ca, daca inversez un vector de doua ori, rezultatul ar trebui sa fie acelasi cu vectorul cu care am inceput. Hedgehog a generat 100 de exemple si a verificat daca aceasta proprietate este valabila in toate aceste cazuri.

Dupa cum se poate vedea, nu exista un pas mare de la utilizarea testului de vanilie la includerea ariciului in procesul propriu. In interiorul unui bloc test_that, se poate adauga un forall si seta asteptari in cadrul acestuia.

Folosim termenul forall (care provine din logica predicatului) pentru a spune ca dorim ca proprietatea sa fie adevarata indiferent de intrarea in functia testata. Primul argument care trebuie eliminat este functia de a genera valori aleatorii (generatorul); in timp ce a doua este proprietatile pe care dorim sa le testam.

Proprietatea de mai sus nu specifica complet faptul ca functia rev este corecta, deoarece s-ar putea inlocui rev cu functia de identitate si totusi sa se respecte acest rezultat. Prin urmare, vom scrie inca o proprietate pentru a testa cu atentie aceasta functie.

test_that (“Inversat de concatenare este rasturnat concatenare de inversat”, forall (list (as = gen.c (gen.element (1: 100)), bs = gen.c (gen.element (1: 100))), functie (ca, bs) expect_equal (rev (c (ca, bs)), c (rev (bs), rev (ca)))))

Aceasta este acum o functie inversa bine testata. Observati ca functia de proprietate accepta acum doua argumente: as si bs. O lista de generatoare din Hedgehog este tratata ca un generator de liste si micsoreaza independent toti membrii. Cu toate acestea, facem tot posibilul pentru a ne asigura ca proprietatile pot fi specificate in mod natural daca generatorul este specificat in acest mod ca o lista de generatoare.

Acum, sa analizam o afirmatie care nu este adevarata, astfel incat sa putem vedea cum arata contraexemplele noastre

test_that (“Reverse este identitate”, forall (gen.c (gen.element (1: 100)), functie (xs) expect_equal (rev (xs), c (xs))))
## Eroare: Testul a esuat: „Reverse este identitate” ## * Falsificabil dupa 1 teste si 8 se micsoreaza ## rev (xs) care nu este egal cu c (xs). ## 2/2 nepotriviri (diferenta medie: 1) ## [1] 2 – 1 == 1 ## [2] 1 – 2 == -1 ## ## Contraexemplu: ## [1] 1 2

Acest test spune ca inversul unui vector ar trebui sa fie egal cu vectorul, ceea ce in mod evident nu este adevarat pentru toti vectorii. Aici, ariciul a executat aceasta asteptare cu intrari aleatorii si a constatat ca nu este adevarat. In loc sa o raporteze direct, a redus cazul de testare rau la cel mai mic contraexemplu pe care l-ar putea gasi: c (1,2). Hedgehog readuce apoi aceasta eroare de testare la testthat, care o gestioneaza ca de obicei si o afiseaza utilizatorului.

edurne follando mi vecina desnuda
porno incesto real peliculas porno travestis
tv porno peliculas porno de incesto en español
mamas cachondas maduras impresionantes
viejas tetonas maduras latex
escenas porno en cine convencional porno flash
porno con abuelas mamadas en el cine
videos gays argentinos guarras masturbandose
penes grandes se corre dentro de su prima
se follan a su mujer orgias abuelas
videos de zofilia fotos de poyas
videos travestis española pillada
putas en vic obliga a su hermana a follar
tetudas españolas cerdas com gratis
maduras españolas masturbandose maduras españolas sexo
porno sub viendo como se follan a mi mujer
taboo.com orgasmosxxx
gitanas xxx hombres corriendose
videosdeincesto se deja follar
pelis porno españolas incesto abuela y nieto

Hedgehog exporta cateva generatoare de baza si o multime de combinatoare pentru fabricarea de noi generatoare. Iata un exemplu care produce o valoare in virgula mobila intre -10 si 10, micsorandu-se la 0 mediana.

gen.unif (de la = -10, la = 10)
## Generator de arici: ## Un generator este o functie care produce copaci aleatori ## folosind un parametru de dimensiune pentru a-l scala. ## ## Exemplu: ## [1] -2.085815 ## Se micsoreaza: ## [1] 0 ## [1] -0.08581477 ## [1] -1.085815

Desi mai sus sunt prezentate doar trei posibile contractii, acestea sunt de fapt doar primul strat al unui trandafir de posibile contractii. Aceasta proprietate de micsorare integrata este o componenta cheie a ariciului si ne ofera o sansa excelenta de a reduce la minimum contraexemplul posibil.

test_that (“a este mai mic decat b + 1”, forall (list (a = gen.element (1: 100), b = gen.element (1: 100)), functie (a, b) expect_lt (a, b + 1)))
## Eroare: Testul a esuat: „a este mai mic decat b + 1” ## * Falsificabil dupa 2 teste si 10 se micsoreaza ## 2 nu este strict mai mic decat b + 1. Diferenta: 0 ## ## Contraexemple: ## $ a ## [1] 2 ## ## $ b ## [1] 1

Generatoarele gen.c, gen.element si gen.unif sunt legate de functiile standard R: c, pentru a crea un vector; esantion, pentru esantionare dintr-o lista sau vector; si runif, pentru a preleva dintr-o distributie uniforma. Incercam sa mentinem o relatie cu functiile binecunoscute ale lui R in Hedgehog.

Generatoarele pot fi, de asemenea, secventiate impreuna, folosind iesirea unui generator pentru a crea unul nou, mai complex. Un exemplu in acest sens este un generator de liste, care alege mai intai aleatoriu o lungime, apoi genereaza o lista cu lungimea respectiva.

O modalitate de a crea generatoare mai mari in functia de generare, care actioneaza pe o bucla idiomatica. De exemplu, se poate crea un generator de patrate de pana la 100; si un generator de vectori cu lungimi de patrate cu

gen_squares <- generate (for (i in gen.int (10)) i ^ 2) gen_sq_digits <- generate (for (i in gen_squares) {gen.c (of = i, gen.element (1: 9))} )

In exemplul urmator, vom crea un generator care creeaza doua liste de lungime n, apoi le vom transforma intr-un cadru data.frame cu gen.with.

gen.df.of <- function (n) generate (for (x in list (as = gen.c (of = n, gen.element (1:10)), bs = gen.c (of = n, gen .element (10:20))))) ca.data.frame (x)) test_that (“Numarul de randuri este 5”, pentru toate (gen.df.of (5), functie (df) expect_equal (nrow (df) , 5)))

Desi acest lucru este bun, dar am dori, de asemenea, sa putem crea date.frames cu un numar diferit de randuri. Aici vom testa din nou o proprietate care este falsa pentru a arata cum ariciul va gasi reducerea minima.

gen.df <- generate (for (e in gen.element (1: 100)) {gen.df.of (e)}) test_that (“Toate cadrele de date au lungimea 1”, forall (gen.df, functie (x) expect_equal (nrow (x), 1)))
## Eroare: Testul a esuat: „Toate cadrele de date au lungimea 1” ## * Falsificabil dupa 1 teste si 9 se micsoreaza ## nrow (x) nu este egal cu 1. ## 1/1 nepotriviri ## [1] 2 – 1 == 1 ## ## Contraexemplu: ## ca bs ## 1 1 10 ## 2 1 10

Din punct de vedere tehnic, faptul ca putem genera secvente generatoare inseamna ca acest lucru inseamna ca sunt monade si oferim un numar de combinatori pentru manipularea lor in acest mod. Intr-adevar, generarea este pur si simplu zahar sintactic pentru legarea monadica, uneori denumita „si apoi”.

Functia gen.with poate fi utilizata pentru a aplica o functie arbitrara la iesirea unui generator, in timp ce gen.and_then este util in inlantuirea rezultatelor unui generator.