{"id":26531,"date":"2020-07-29T00:00:00","date_gmt":"2020-07-28T22:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=26531"},"modified":"2021-01-13T09:39:59","modified_gmt":"2021-01-13T08:39:59","slug":"un-modo-diverso-di-pensare-al-testing-property-based-test","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/","title":{"rendered":"Un modo diverso di pensare al testing: Property Based Test"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"26535\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/attachment\/93d45811-c894-43d4-966e-330770b66b71-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"93d45811-c894-43d4-966e-330770b66b71\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-26535\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nel mio precedente articolo, abbiamo visto come testare e rifattorizzare un progetto legacy utilizzando il Golden Master Pattern. Stavolta, continueremo a parlare di testing, introducendo un nuovo paradigma attraverso un semplice esempio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Siamo abituati a scrivere test basandoli su esempi. In letteratura si parla di &#8220;<em>Example test<\/em>&#8220;: dato un input abbiamo un output atteso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La diffusione di tecniche come il TDD e la crescente importanza assunta in generale dai test nella realizzazione di un prodotto software rischiano di creare un grosso fraintendimento, ossia che una buona suite di test \u00e8 tale se massimizza la coverage. Scrivere test per ogni statement non rende la nostra codebase esente da errori. Anzi, il tempo di sviluppo dei test diventa troppo lungo, rendendo difficile la loro manutenzione quando si aggiunga o modifichi una feature.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sull&#8217;argomento \u00e8 intervenuto Kent Beck su<a href=\"https:\/\/stackoverflow.com\/questions\/153234\/how-deep-are-your-unit-tests\/\" target=\"_blank\" rel=\"noreferrer noopener\">&nbsp;Stack Overflow<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prendiamo un piccolo caso di studio. La nostra azienda sta svolgendo molti colloqui per una figura di programmatore e, per effettuare una prima scrematura, assegniamo ai candidati un kata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il controllo manuale dei risultati comporta un grosso sforzo e, quindi, sviluppiamo una suite di test che controlli in automatico le soluzioni proposte, in modo da ridurre quanto pi\u00f9 possibile il nostro lavoro. Si sa che la pigrizia \u00e8 una delle virt\u00f9 dello sviluppatore:<a href=\"http:\/\/threevirtues.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">&nbsp;Laziness is a virtue!<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il kata che assegniamo ai nostri candidati \u00e8 un classico: il FizzBuzz. Si tratta di scrivere un algoritmo che, assegnato un numero, stampi in output:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&#8220;Fizz&#8221; per i multipli di tre<\/li><li>&#8220;Buzz&#8221; per i multipli di cinque<\/li><li>&#8220;FizzBuzz&#8221; per i multipli di tre e cinque<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La semplicit\u00e0 di questo esercizio ci consente di focalizzarci sui concetti, senza preoccuparci troppo dei problemi di implementazione. Nel branch fsharp della&nbsp;<a href=\"https:\/\/github.com\/ntonjeta\/FizzBuzz\" target=\"_blank\" rel=\"noreferrer noopener\">repository<\/a>&nbsp;trovate una possibile soluzione scritta in F#.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Scriviamo una suite di test che abbia il 100% di coverage usando TDD con test basati su esempi.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;&lt;Tests&gt;]\nlet tests =\n      testList &quot;Example tests&quot; &#x5B;\n      testCase &quot;Three should be Fizz&quot; &lt;| fun _ -&gt;\n      Expect.equal (FizzBuzz.fizzbuzz 3) &quot;Fizz&quot; &quot;Is not Fizz.&quot;\n      ]\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">L&#8217;implementazione semplice:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nmodule FizzBuzz\u00a0 =\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let fizzbuzz (x:int) = &quot;Fizz&quot;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Andiamo ad aggiungere altri test:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ntestCase &quot;Five should be Buzz&quot; &lt;| fun _ -&gt;\n      Expect.equal (FizzBuzz.fizzbuzz 5) &quot;Buzz&quot; &quot;Is not Buzz.&quot;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">E l&#8217;implementazione diventa:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nlet fizzbuzz (x:int) =\n      match x with\n      | 3 -&gt; &quot;Fizz&quot;\n      | 5 -&gt; &quot;Buzz&quot;\n      | _ -&gt; string x \/\/ Complete pattern matching\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Procediamo pi\u00f9 velocemente ed andiamo ad aggiungere i restanti test che coprono tutti i possibili casi.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ntestCase &quot;Nine should be Fizz&quot; &lt;| fun _ -&gt;\n      Expect.equal (FizzBuzz.fizzbuzz 9) &quot;Fizz&quot; &quot;Is not Fizz.&quot;\n \ntestCase &quot;Twentyi-Five should be Buzz&quot; &lt;| fun _ -&gt;\n      Expect.equal (FizzBuzz.fizzbuzz 25) &quot;Buzz&quot; &quot;Is not Buzz.&quot;\n \ntestCase &quot;Fifteen should be FizzBuzz&quot; &lt;| fun _ -&gt;\n      Expect.equal (FizzBuzz.fizzbuzz 15) &quot;FizzBuzz&quot; &quot;Is not FizzBuzz.&quot;\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">In questo modo abbiamo coperto il 100% degli statement!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Consegniamo gli esercizi ai candidati e, al termine, lanciamo la suite sugli elaborati ricevuti. Tra le varie soluzioni proposte, ci balza all&#8217;occhio la seguente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nmodule FizzBuzz  =\n      let fizzbuzz (x:int) =\n      match x with\n      | 3 -&gt; &quot;Fizz&quot;\n      | 5 -&gt; &quot;Buzz&quot;\n      | 9 -&gt; &quot;Fizz&quot;\n      | 15 -&gt; &quot;FizzBuzz&quot;\n      | 25 -&gt; &quot;Buzz&quot;\n      | _ -&gt; string x\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La soluzione \u00e8 evidentemente errata, eppure tutti i test sono superati.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobbiamo quindi rendere i nostri test pi\u00f9 robusti. Aggiungiamo un test con numeri casuali generati a runtime. Ecco una possibile implementazione:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nlet actualList =\n      randomList |&gt; List.map (FizzBuzz.fizzbuzz)\n \nlet expectedList =\n      randomList\n      |&gt; List.map (fun i -&gt;\n      match i with\n      | n when i % 3 = 0 &amp;&amp; i % 5 = 0 -&gt; &quot;FizzBuzz&quot;\n      | n when i % 3 = 0 -&gt; &quot;Fizz&quot;\n      | n when i % 5 = 0 -&gt; &quot;Buzz&quot;\n      | _ -&gt; string i)\n \ntestCase &quot;Random number test&quot;\n      &lt;| fun _ -&gt; Expect.sequenceEqual actualList expectedList &quot;Not equal&quot;\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il problema di utilizzare numeri casuali nei test si presenta quando dobbiamo generare la lista dei risultati attesi. Per riuscirci, abbiamo introdotto l&#8217;implementazione dell&#8217;algoritmo nei test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Introduciamo il concetto di&nbsp;<strong>Property Based Testing<\/strong>, divenuto famoso nell&#8217;ambito della programmazione funzionale con&nbsp;<strong>QuickCheck<\/strong>&nbsp;per Haskell. L&#8217;idea di base \u00e8 semplice: anzich\u00e9 utilizzare test basati su un esempio, andiamo a testare le&nbsp;<em>propriet\u00e0<\/em>&nbsp;dell&#8217;algoritmo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una propriet\u00e0 pu\u00f2 essere testata con input random andando a coprire anche i casi limite. Se la risoluzione \u00e8 corretta, rimarr\u00e0 sempre valida; in questo modo non abbiamo bisogno di generare dei risultati attesi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per implementare i test delle propriet\u00e0, utilizziamo&nbsp;<strong>FsCheck,<\/strong>&nbsp;il porting in F# di QuickCheck. In FsCheck i dati per i test vengono generati da un modulo&nbsp;<strong>Generator<\/strong>, in grado di generare dati random. Come vedremo, \u00e8 possibile definire un Generator personalizzato e utilizzarlo nei test.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oltre ai Generator, un\u2019altra feature di FsCheck \u00e8 lo&nbsp;<strong>Shrinker<\/strong>&nbsp;che entra in gioco quando un test fallisce. Lo Shrinker \u00e8 in grado di restituire il minor input possibile per cui il test potrebbe fallire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per implementare la suite di test, il primo passo \u00e8 definire le propriet\u00e0 dell\u2019algoritmo:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>I multipli di 3 devono contenere Fizz.<\/li><li>I multipli di 5 devono contenere Buzz.<\/li><li>I multipli di entrambi devono essere FizzBuzz.<\/li><li>I non multipli di 3 e 5 devono rimanere uguali.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Definite le propriet\u00e0, possiamo sviluppare i nostri Generator. Vediamo come definire un generatore di multipli di tre.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nlet multipleOfThree n = n * 3\n \nlet gen3 =\n      Arb.generate&lt;NonNegativeInt&gt;\n      |&lt; Gen.map (fun (NonNegativeInt n) -&gt; multipleOfThree n)\n      |&lt; Arb.fromGen\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il modulo&nbsp;<strong>Arb<\/strong>&nbsp;consente di generare automaticamente una sequenza di numeri casuali: specificando il tipo&nbsp;<em>NonNegativeInt<\/em>&nbsp;il modulo genera numeri non negativi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con il modulo&nbsp;<strong>Gen,<\/strong>&nbsp;possiamo eseguire operazioni sui generatori: inizializzazioni, filtraggi, conversioni, etc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo utilizzato la funzione Gen.map per mappare i numeri casuali generati da Arb per ottenere multipli di tre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A questo punto, il nostro generatore deve essere registrato prima di poterlo utilizzare nei test. Per farlo, dobbiamo definire un nuovo tipo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ntype ThreeGenerator =\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0static member ThreeMultiple() =\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Arb.generate&lt;NonNegativeInt&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|&gt; Gen.map (fun (NonNegativeInt n) -&gt; multipleOfThree n)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|&gt; Gen.filter(fun n-&gt;\u00a0 n&gt; 0)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0|&gt; Arb.fromGen\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">e registrarlo usando ad esempio la libreria<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/haf\/expecto\" target=\"_blank\">&nbsp;Expecto<\/a>&nbsp;(usata spesso assieme a FsCheck)<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nlet multipleOfThreeConfig =\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ FsCheckConfig.defaultConfig with\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arbitrary = &#x5B; typeof&lt;ThreeGenerator&gt; ] }\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">A questo punto possiamo scrivere il test utilizzando il nostro Generator<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nlet tests =\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0testList &quot;Property based tests&quot;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#x5B; testPropertyWithConfig multipleOfThreeConfig &quot;Multiple of three should contain Fizz&quot;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;| fun x -&gt; Expect.containsAll (FizzBuzz.fizzbuzz x) &quot;Fizz&quot; &quot;Not contain Fizz&quot; ]\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Allo stesso modo possiamo scrivere i restanti generatori.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nlet multipleOfFive n = n * 5\nlet multipleOfBoth n = n * 15\nlet noMultiple n = (multipleOfBoth n) - 1\n \ntype FiveGenerator =\n      static member FiveMultiple() =\n      Arb.generate&lt;NonNegativeInt&gt;\n      |&gt; Gen.map (fun (NonNegativeInt n) -&gt; multipleOfFive n)\n      |&gt; Gen.filter (fun n -&gt; n &gt; 0)\n      |&gt; Arb.fromGen\n \ntype BothGenerator =\n      static member BothMultiple() =\n      Arb.generate&lt;NonNegativeInt&gt;\n      |&gt; Gen.map (fun (NonNegativeInt n) -&gt; multipleOfBoth n)\n      |&gt; Arb.fromGen\n \ntype NoMultipleGenerator =\n      static member BothMultiple() =\n      Arb.generate&lt;NonNegativeInt&gt;\n      |&gt; Gen.map (fun (NonNegativeInt n) -&gt; noMultiple n)\n      |&gt; Arb.fromGen\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Testare le propriet\u00e0 consente di utilizzare input randomici, che andranno a coprire anche i casi limite e senza necessit\u00e0 di dover generare dei valori attesi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo visto come, cambiando il paradigma con cui testiamo il codice, riusciamo ad ottenere delle suite di test robuste a prova di sviluppatori pigri!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trovate qui i riferimenti<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-handler-delloggetto-incorporato wp-block-embed-handler-delloggetto-incorporato\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/fsharpforfunandprofit.com\/posts\/property-based-testing\/\" rel=\"nofollow\">https:\/\/fsharpforfunandprofit.com\/posts\/property-based-testing\/<\/a>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-handler-delloggetto-incorporato wp-block-embed-handler-delloggetto-incorporato\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/fsharpforfunandprofit.com\/posts\/property-based-testing-2\/\" rel=\"nofollow\">https:\/\/fsharpforfunandprofit.com\/posts\/property-based-testing-2\/<\/a>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-handler-delloggetto-incorporato wp-block-embed-handler-delloggetto-incorporato\"><div class=\"wp-block-embed__wrapper\">\n<a href=\"https:\/\/fscheck.github.io\/FsCheck\/TestData.html\" rel=\"nofollow\">https:\/\/fscheck.github.io\/FsCheck\/TestData.html<\/a>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Spero di avervi incuriosito.<br>Al prossimo articolo!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Vediamo insieme perch\u00e9 un coverage del 100% non basta a farci dormire tranquilli<\/p>\n","protected":false},"author":196716249,"featured_media":26535,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637408,688637409],"class_list":["post-26531","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-f","tag-testing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Un modo diverso di pensare al testing: Property Based Test - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Un modo diverso di pensare al testing: Property Based Test - Blexin\" \/>\n<meta property=\"og:description\" content=\"Vediamo insieme perch\u00e9 un coverage del 100% non basta a farci dormire tranquilli\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-28T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:39:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Antonio Tammaro\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonio Tammaro\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/\"},\"author\":{\"name\":\"Antonio Tammaro\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6e574a2e13d47c9167c5cfb475d9bfc5\"},\"headline\":\"Un modo diverso di pensare al testing: Property Based Test\",\"datePublished\":\"2020-07-28T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:39:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/\"},\"wordCount\":847,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"F#\",\"Testing\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/\",\"name\":\"Un modo diverso di pensare al testing: Property Based Test - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2020-07-28T22:00:00+00:00\",\"dateModified\":\"2021-01-13T08:39:59+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6e574a2e13d47c9167c5cfb475d9bfc5\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/un-modo-diverso-di-pensare-al-testing-property-based-test\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Un modo diverso di pensare al testing: Property Based Test\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6e574a2e13d47c9167c5cfb475d9bfc5\",\"name\":\"Antonio Tammaro\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddb88ac3dfb067ae6f1592d451eab3587e41bbbe98325961161cc286844e8d0d?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddb88ac3dfb067ae6f1592d451eab3587e41bbbe98325961161cc286844e8d0d?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddb88ac3dfb067ae6f1592d451eab3587e41bbbe98325961161cc286844e8d0d?s=96&d=identicon&r=g\",\"caption\":\"Antonio Tammaro\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/antonio-tammaroblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Un modo diverso di pensare al testing: Property Based Test - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/","og_locale":"it_IT","og_type":"article","og_title":"Un modo diverso di pensare al testing: Property Based Test - Blexin","og_description":"Vediamo insieme perch\u00e9 un coverage del 100% non basta a farci dormire tranquilli","og_url":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/","og_site_name":"Blexin","article_published_time":"2020-07-28T22:00:00+00:00","article_modified_time":"2021-01-13T08:39:59+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608","type":"image\/png"}],"author":"Antonio Tammaro","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Antonio Tammaro","Tempo di lettura stimato":"6 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/"},"author":{"name":"Antonio Tammaro","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6e574a2e13d47c9167c5cfb475d9bfc5"},"headline":"Un modo diverso di pensare al testing: Property Based Test","datePublished":"2020-07-28T22:00:00+00:00","dateModified":"2021-01-13T08:39:59+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/"},"wordCount":847,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1","keywords":["F#","Testing"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/","url":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/","name":"Un modo diverso di pensare al testing: Property Based Test - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1","datePublished":"2020-07-28T22:00:00+00:00","dateModified":"2021-01-13T08:39:59+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6e574a2e13d47c9167c5cfb475d9bfc5"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/un-modo-diverso-di-pensare-al-testing-property-based-test\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Un modo diverso di pensare al testing: Property Based Test"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6e574a2e13d47c9167c5cfb475d9bfc5","name":"Antonio Tammaro","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/ddb88ac3dfb067ae6f1592d451eab3587e41bbbe98325961161cc286844e8d0d?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ddb88ac3dfb067ae6f1592d451eab3587e41bbbe98325961161cc286844e8d0d?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ddb88ac3dfb067ae6f1592d451eab3587e41bbbe98325961161cc286844e8d0d?s=96&d=identicon&r=g","caption":"Antonio Tammaro"},"url":"https:\/\/blexin.com\/it\/author\/antonio-tammaroblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/93d45811-c894-43d4-966e-330770b66b71-1.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-6TV","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716249"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=26531"}],"version-history":[{"count":8,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26531\/revisions"}],"predecessor-version":[{"id":27761,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26531\/revisions\/27761"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/26535"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=26531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=26531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=26531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}