Triq QuickCheck for Erlang
Triq (Term Reductive Invariant Questant) is an Apache licensed QuickCheck library for Erlang. It is a continuation and community fork of Trifork QuickCheck. This fork is in no way affiliated with, or a product of, Trifork.
Homepage | https://triq.gitlab.io |
Hex.pm | https://hex.pm/packages/triq |
By and large, the Triq API is modeled closely after QuviQ eqc
,
except you want to replace any occurrence of eqc
with triq
. The
main supporting module is called triq_dom
, corresponding to eqc’s
eqc_gen
.
To write properties with triq
, include the triq.hrl
header file:
-include_lib("triq/include/triq.hrl").
Modules compiled with the triq.hrl
header auto-export all functions
named prop_*
, and have a function added called check/0
which runs
triq:check/1
on all the properties in the module. Further, adding
the attribute -triq(eunit)
will generate EUnit tests for all
properties, turning the module into a regular EUnit test suite.
If you use erlang.mk, you will typically want to use the built-in Triq plugin to check properties. Otherwise we highly recommend letting Triq generate EUnit tests, thus arriving at a demo module like this:
-module(triq_demo). -include_lib("triq/include/triq.hrl"). -triq(eunit). prop_append() -> ?FORALL({Xs,Ys},{list(int()),list(int())}, lists:reverse(Xs++Ys) == lists:reverse(Ys) ++ lists:reverse(Xs)).
Now, all you have to do is run rebar3 eunit
:
$ rebar3 eunit -v ===> Verifying dependencies... ===> Compiling triq_demo ===> Performing EUnit tests... ======================== EUnit ======================== file "triq_demo.app" application 'triq_demo' triq_demo:5: append_test_ (module 'triq_demo')...[0.262 s] ok [done in 0.269 s] [done in 0.274 s] ======================================================= Test passed.
If you use -triq({eunit, [{runs, N}]})
, then Triq will do N
runs for each
property in the module, which is equivalent to calling triq:check(Module, N)
.
This can be useful to make Triq try more (or less) cases than the default.
For advanced features, please consult the API docs.
To use triq
, you can add it as a project dependency and let your
package manager of choice handle it:
rebar.config | {deps, [triq]} |
erlang.mk | DEPS = triq |
mix.exs | {:triq, "~> 1.*"} |
If you want to make triq
available globally, you can install it from
source into your Erlang installation by adding it in one of your
$ERL_LIBS
paths. So, it’s either somewhere like
/usr/lib/erlang/lib
or $HOME/.erl
.
You can either download a tagged release
and extract that or clone the git repo in the
target directory. Once that’s done, cd into the directory and run make
.
Now, if you start erl
, you should be able to call functions from the
triq
module.
$ erl 1> code:which(triq). "/usr/lib/erlang/lib/triq/ebin/triq.beam" 2>