Простая и бесплатная альтернатива QuickCheck'у
Автор проекта Erjang создал собственную бесплатную альтернативу фреймворку для тестирования QuickCheck. Проект называется triq и на данный момент располагается в директории triq/src Erjang'а. Несмотря на то, что triq написан для Erjang'а, его можно использовать, как в этом проекте, так и в «ванильном» Эрланге.
Например, мы хотим проверить, что одно и то же действие возвращет одинаковое значение в Эрланге (локально) и в Erjang'е (удаленно):
Для любых двух A и B и оператора OP из множества ['>', '<', '==', '=:=', '/=', '++'] резельтат выполнения выражения "A OP B" должен быть одинаковым для BEAM'а и Erjang'а.
Мы используем тот факт, что, например, 1 < 2 в Эрланге можно представить как erlang:apply('<',[1,2]). Для описания этого создадим функцию prop_binop:
prop_binop() ->
?FORALL({A,B,OP},
{any(),any(),
elements(['>', '<', '==', '=:=', '/=', '++'])},
begin
Here = here(erlang,OP,[A,B]),
There = there(erlang,OP,[A,B]),
Here == There
end).Функция here просто выполняет apply, а функция there выполняет код на удаленной ноде:
there(Mod,Fun,Args) when is_atom(Mod), is_atom(Fun), is_list(Args) ->
call(server(), Mod,Fun,Args).
call(Node,Mod,Fun,Args) ->
case rpc:call(Node, Mod,Fun,Args) of
{badrpc,{'EXIT',{Reason,[FirstTraceElement|_]}}} ->
{badrpc, {'EXIT',{Reason,[FirstTraceElement]}}};
Value -> Value
end.Результат выполнения такого теста может выглядеть, например, так:
1> triq:check(prop_binop()).
..............Failed!
Failed after 15 tests
Simplified:
{ A , B , OP } = {['\x80'],'','++'}
falseВ этом случае triq помог автору найти ошибку в Java-коде Erjang'а, где выполнялась ненужная конвертация кодировки передаваемых строк.
