View Source Makina Library
Makina is a testing library that provides a DSL (domain specific language) for writing PBT (property-based testing models) models for stateful systems.
Note: the word model is used in PBT to refer to properties to be checked on the system under test.
Makina has been designed to address principles of modularity and
model reuse. Similar to other PBT libraries, Makina uses the Elixir
metaprogramming facilities to generate a model in your favourite PBT
library (like PropCheck
or eqc_ex
).
using-makina
Using Makina
- Add Makina to your dependencies in
mix.exs
def deps do [ {:makina, "~> 0.2.2"} ] end
- Configure your preferred PBT compatible library (e.g.
PropCheck
) in your testing environment config fileconfig/test.exs
:config :makina, checker: PropCheck
write-your-model
Write your model
To write your tests you will need to write a model. Let's assume you
need to test a counter system, i.e. a module Counter
with
functions put
, ìnc
and get
. A model of such of a system is:
defmodule Counter.Model do
use Makina, implemented_by: Counter
state value: 0 :: integer
invariants greater_than_0: value >= 0
command inc :: :ok | :error do
next value: value + 1
end
command put(n :: integer) :: :ok | :error do
args n: integer(0, :inf)
next value: n
end
command get() :: integer do
post result == value
end
end
write-the-test
Write the test
The boilerplate to write the property is like this:
defmodule MakinaExamplesTest do
use PropCheck
use ExUnit.Case, async: true
describe "Counter" do
property "Correctness" do
forall cmds <- commands(Counter.Model.Behaviour) do
{:ok, _pid} = Counter.start_link(0)
r = {_, _, result} = run_commands(model, cmds)
Counter.stop()
(result == :ok)
|> when_fail(print_report(r, cmds))
|> aggregate(command_names(cmds))
end
end
end
end