новости сообщество форум вики полезно

Простая и бесплатная альтернатива QuickCheck'у

27/04/2010 15:08

Автор проекта 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'а, где выполнялась ненужная конвертация кодировки передаваемых строк.


 
 
 
 

так же

Ссылки

См. также

Сюда ссылаются

сообщество

http://groups.google.com/group/erlang-russian/feed/rss_v2_0_msgs.xml