Generative testing with Spec and Spec Testλ︎
Clojure spec has been used so far to create specifications for both data and functions.
Now spec and spec test libraries are used not just validity checking, but also to generate random samples of the data that can be used for extensive testing.
Generative testing provides a far more effective alternative to unit testing.
clojure.spec.test/check/instrument
verifies that calls to a function satisfy the function's specification, the :arg
in fdef
.
clojure.spec.test/check
function generates 1000 data values to be used as the inputs to a function, checks that the invocation of the function satisfies its specification, the :ret
and :fn
in fdef
. The argument specification, :arg
in fdef
is used to generate a wide range of results, which are more capable of finding edge cases that fail.
Example: card gameλ︎
practicalli/spec-generative-testing is a simple card game with specifications that are used for basic generative testing.