[erlang-questions] PropEr after test clean up

Kostis Sagonas <>
Tue May 26 01:44:16 CEST 2015


On 05/25/2015 05:11 PM, Hynek Vychodil wrote:
>
> I bumped in the problem how clean up after property in PropEr. Let's
> have simple property where I make ets table:
>
> prop_ets() ->
>      ?FORALL(V, integer(),
>          begin
>              E = ets:new(),
>              true = ets:insert(T, {V, ok}),
>              equals([{V, ok}], ets:lookup(T, V))
>          end
>      ).
>
> How am I supposed to delete ets table? It is trickier than looks like.
> ... <SNIP>

I am not sure I understand what it is exactly that you are finding 
difficult to do in the simple example above.  Here is how:

=====================================================================
-module(pets).
-include_lib("proper/include/proper.hrl").

-export_type([key/0, val/0]). % shut off compiler warning

-type key() :: a | b | c.
-type val() :: 0..42.

prop_ets() ->
   ?FORALL({K,V}, {key(),val()},
	  begin
	      T = setup(),
	      true = ets:insert(T, {K, V}),
	      Res = ets:lookup(T, K),
	      cleanup(T),
	      [{K, V}] =:= Res
	  end).

setup() ->
    ets:new(?MODULE, [public, named_table]).

cleanup(T) ->
    ets:delete(T).
========================================================================

The pattern of doing a setup, running some commands and getting some 
Result, doing the cleanup you want to do, and the check that the result 
is the one that you expect is a general pattern in property-based testing.

As you can see, the above works:

:~/proper$ erl -pa ~/proper
Erlang/OTP 17 [erts-6.4.1] [source] [64-bit] [smp:8:8] 
[async-threads:10] [hipe] [kernel-poll:false]

Eshell V6.4.1  (abort with ^G)
1> c(pets, [debug_info]).
{ok,pets}
2> proper:quickcheck(pets:prop_ets()).
....................................................................................................
OK: Passed 100 test(s).
true


Change the property to one that does not hold (e.g. [{K, V}] =/= Res) 
and you will also see that shrinking works.


I am not sure I follow what you mean by your nested ?FORALL properties 
but note that, as shown above, you can easily imitate multiple ?FORALLs 
by using complex terms (tuples, lists, etc.).

Hope this helps,
Kostis


More information about the erlang-questions mailing list