[{"data":1,"prerenderedAt":308},["ShallowReactive",2],{"term-p\u002Fproperty-based-testing":3,"related-p\u002Fproperty-based-testing":294},{"id":4,"title":5,"acronym":6,"body":7,"category":277,"description":278,"difficulty":279,"extension":280,"letter":16,"meta":281,"navigation":81,"path":282,"related":283,"seo":288,"sitemap":289,"stem":292,"subcategory":6,"__hash__":293},"terms\u002Fterms\u002Fp\u002Fproperty-based-testing.md","Property-Based Testing",null,{"type":8,"value":9,"toc":271},"minimark",[10,15,19,23,26,30,260,264,267],[11,12,14],"h2",{"id":13},"eli5-the-vibe-check","ELI5 — The Vibe Check",[16,17,18],"p",{},"Instead of writing specific test cases (add(2,3)=5), property-based testing generates thousands of random inputs automatically and checks that certain properties always hold true — like 'add is always commutative: add(a,b) always equals add(b,a)'. You write rules, the computer tests them at scale.",[11,20,22],{"id":21},"real-talk","Real Talk",[16,24,25],{},"Property-based testing defines properties (invariants) that must hold for all valid inputs, then generates random test cases to try to falsify those properties. When a failure is found, it shrinks the input to the minimal failing case. Libraries: fast-check (JS), Hypothesis (Python), QuickCheck (Haskell).",[11,27,29],{"id":28},"show-me-the-code","Show Me The Code",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import * as fc from 'fast-check';\n\ntest('sort is idempotent', () => {\n  fc.assert(\n    fc.property(fc.array(fc.integer()), (arr) => {\n      const sorted = arr.sort();\n      expect(sorted.sort()).toEqual(sorted);\n    })\n  );\n});\n","javascript","",[38,39,40,76,83,113,129,178,203,233,242,250],"code",{"__ignoreMap":36},[41,42,45,49,53,56,60,63,66,70,73],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"s7zQu","import",[41,50,52],{"class":51},"sMK4o"," *",[41,54,55],{"class":47}," as",[41,57,59],{"class":58},"sTEyZ"," fc ",[41,61,62],{"class":47},"from",[41,64,65],{"class":51}," '",[41,67,69],{"class":68},"sfazB","fast-check",[41,71,72],{"class":51},"'",[41,74,75],{"class":51},";\n",[41,77,79],{"class":43,"line":78},2,[41,80,82],{"emptyLinePlaceholder":81},true,"\n",[41,84,86,90,93,95,98,100,103,106,110],{"class":43,"line":85},3,[41,87,89],{"class":88},"s2Zo4","test",[41,91,92],{"class":58},"(",[41,94,72],{"class":51},[41,96,97],{"class":68},"sort is idempotent",[41,99,72],{"class":51},[41,101,102],{"class":51},",",[41,104,105],{"class":51}," ()",[41,107,109],{"class":108},"spNyl"," =>",[41,111,112],{"class":51}," {\n",[41,114,116,119,122,125],{"class":43,"line":115},4,[41,117,118],{"class":58},"  fc",[41,120,121],{"class":51},".",[41,123,124],{"class":88},"assert",[41,126,128],{"class":127},"swJcz","(\n",[41,130,132,135,137,140,142,145,147,150,152,154,156,159,162,164,167,171,174,176],{"class":43,"line":131},5,[41,133,134],{"class":58},"    fc",[41,136,121],{"class":51},[41,138,139],{"class":88},"property",[41,141,92],{"class":127},[41,143,144],{"class":58},"fc",[41,146,121],{"class":51},[41,148,149],{"class":88},"array",[41,151,92],{"class":127},[41,153,144],{"class":58},[41,155,121],{"class":51},[41,157,158],{"class":88},"integer",[41,160,161],{"class":127},"())",[41,163,102],{"class":51},[41,165,166],{"class":51}," (",[41,168,170],{"class":169},"sHdIc","arr",[41,172,173],{"class":51},")",[41,175,109],{"class":108},[41,177,112],{"class":51},[41,179,181,184,187,190,193,195,198,201],{"class":43,"line":180},6,[41,182,183],{"class":108},"      const",[41,185,186],{"class":58}," sorted",[41,188,189],{"class":51}," =",[41,191,192],{"class":58}," arr",[41,194,121],{"class":51},[41,196,197],{"class":88},"sort",[41,199,200],{"class":127},"()",[41,202,75],{"class":51},[41,204,206,209,211,214,216,218,220,222,225,227,229,231],{"class":43,"line":205},7,[41,207,208],{"class":88},"      expect",[41,210,92],{"class":127},[41,212,213],{"class":58},"sorted",[41,215,121],{"class":51},[41,217,197],{"class":88},[41,219,161],{"class":127},[41,221,121],{"class":51},[41,223,224],{"class":88},"toEqual",[41,226,92],{"class":127},[41,228,213],{"class":58},[41,230,173],{"class":127},[41,232,75],{"class":51},[41,234,236,239],{"class":43,"line":235},8,[41,237,238],{"class":51},"    }",[41,240,241],{"class":127},")\n",[41,243,245,248],{"class":43,"line":244},9,[41,246,247],{"class":127},"  )",[41,249,75],{"class":51},[41,251,253,256,258],{"class":43,"line":252},10,[41,254,255],{"class":51},"}",[41,257,173],{"class":58},[41,259,75],{"class":51},[11,261,263],{"id":262},"when-youll-hear-this","When You'll Hear This",[16,265,266],{},"\"Use property-based testing for the parser — we can't think of all the edge cases manually.\" \u002F \"fast-check found a crash with an empty string we never would have written a test for.\"",[268,269,270],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":36,"searchDepth":78,"depth":78,"links":272},[273,274,275,276],{"id":13,"depth":78,"text":14},{"id":21,"depth":78,"text":22},{"id":28,"depth":78,"text":29},{"id":262,"depth":78,"text":263},"testing","Instead of writing specific test cases (add(2,3)=5), property-based testing generates thousands of random inputs automatically and checks that certain prop...","advanced","md",{},"\u002Fterms\u002Fp\u002Fproperty-based-testing",[284,285,286,287],"Fuzzing","Edge Case","Unit Test","Mutation Testing",{"title":5,"description":278},{"changefreq":290,"priority":291},"weekly",0.7,"terms\u002Fp\u002Fproperty-based-testing","PkAJ6y70mWzm30quUY9R2jckyS1S_cjXPs3OwO5S5M4",[295,299,302,305],{"title":285,"path":296,"acronym":6,"category":277,"difficulty":297,"description":298},"\u002Fterms\u002Fe\u002Fedge-case","beginner","Edge cases are the weird, extreme, or unexpected inputs that trip up your code. What if someone types 0 for age?",{"title":284,"path":300,"acronym":6,"category":277,"difficulty":279,"description":301},"\u002Fterms\u002Ff\u002Ffuzzing","Fuzzing is throwing completely random, malformed, or garbage inputs at your program to see if it crashes.",{"title":287,"path":303,"acronym":6,"category":277,"difficulty":279,"description":304},"\u002Fterms\u002Fm\u002Fmutation-testing","Mutation testing is a way to test your tests.",{"title":286,"path":306,"acronym":6,"category":277,"difficulty":297,"description":307},"\u002Fterms\u002Fu\u002Funit-test","A unit test is like checking that one single LEGO brick isn't broken before you use it in your big castle.",1776518304254]