2013-07-10 9 views
8

Podczas korzystania z Pythona testuję zasięg kodu za pomocą narzędzi takich jak python-coverage, a szczególnie dla django pakietu djaango-nose, szukam odpowiednika w Erlang. Już testuję z eunit i generuję raporty z surefire, ale nie znalazłem sposobu na wykonanie kodu, czy ktoś zna narzędzia lub metodologię, aby to zrobić?Jak wykonać test testu jednostkowego w Erlang

Odpowiedz

10

Jeśli rebar tylko dodać:

{cover_enabled, true}. 

do rebar.config

+0

nie używam zbrojenie, gdyż jeszcze nie pakuje się w Debianie, wolą nie zainstalować go bez opakowania, dzięki za odpowiedź – Rodolphe

+0

Znalazłem tę odpowiedź, próbując włączyć zakres kodu dla typowych testów. Jeśli znajdujesz się w tej samej łodzi, być może będziesz musiał utworzyć dodatkowy plik, aby uruchomić testy: http://stackoverflow.com/a/28969406/301857 –

10

użyłem wspólnej próbie kontrolowania zestawów testów, a następnie w specyfikacji testowej można zadeklarować spec przykryć krotka {okładka „coverspec ścieżka”}:

{include, ["../include"]}. 
{suites,"../test", all}. 
{logdir,"../results"}. 
{cover,"../test/reduce.coverspec"}. 

spec pokrywa głównie określenie poziomu szczegółów oraz listę modułów, które chcesz analizować:

{level, details}. 
{incl_mods, [calc,calc_store]}. 

następnie po uruchomieniu testu otrzymasz przyrostową stronę internetową, z całą iteracji testową, gdzie zrobić, a za każde wyników i linkiem do podsumowania pokrycia, a następnie kodu źródłowego, z dopiskiem liczba czasu została oceniona linia.

incremental web page result summary coverage summary

i uwagami źródło:

File generated from d:/documents and Settings/xxxxxxx/My Documents/git/calc/ebin/../src/calc_store.erl by COVER 2012-06-01 at 10:23:45 

**************************************************************************** 

     | -module(calc_store). 
     | 
     | -behaviour(gen_server). 
     | 
     | -record(state,{var,func}). 
     | -define(SERVER,?MODULE). 
     | 
     | %% gen_server call back 
     | -export([code_change/3,handle_call/3,handle_cast/2,handle_info/2,init/1,terminate/2]). 
     | 
     | %% api 
     | -export([start_link/0,storevar/2,storefunc/4,getvalue/1,getfunc/1,stop/0]). 
     | 
     | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
     | 
     | storevar(Name,Value) -> 
    1..|  gen_server:cast(?MODULE,{storevar,Name,Value}). 
     | 
     | storefunc(Name,Par,Desc,Text) -> 
    3..|  gen_server:cast(?MODULE,{storefunc,Name,Par,Desc,Text}). 
     | 
     | getvalue(Name) -> 
    67..|  gen_server:call(?MODULE,{readvar,Name}). 
     | 
     | getfunc(Name) -> 
    10..|  gen_server:call(?MODULE,{readfunc,Name}). 
     | 
     | stop() -> 
    0..| gen_server:cast(?MODULE,stop). 
     | 
     | start_link() -> 
    1..|  gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). 
     | 
     | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
     | 
     | init([]) -> 
     |  %% register(?MODULE,self()), 
    1..|  {ok,#state{var=dict:new(),func=dict:new()}}. 
     | 
     | handle_call({readvar,Name}, _From, State = #state{var=D}) -> 
    67..|  Reply = dict:find(Name,D), 
    67..|  {reply, Reply, State}; 
     | handle_call({readfunc,Name}, _From, State = #state{func=F}) -> 
    10..|  Reply = dict:find(Name,F) , 
    10..|  {reply, Reply, State}; 
     | handle_call(Request, From, State) -> 
    0..|  io:format("calc_store received call: ~p from ~p~n",[Request,From]), 
    0..|  Reply = ok, 
    0..|  {reply, Reply, State}. 
     | 
     | handle_cast(stop,State) -> 
    0..| {stop,State}; 
     | handle_cast({storevar,Name,Value}, State = #state{var=D}) -> 
    1..|  NewD= dict:store(Name,Value,D), 
    1..|  {noreply, State#state{var=NewD}}; 
     | handle_cast({storefunc,Name,Par,Desc,Text}, State = #state{func=F}) -> 
    3..|  NewF= dict:store(Name,{Par,Desc,Text},F), 
    3..|  {noreply, State#state{func=NewF}}; 
     | handle_cast(Msg, State) -> 
    0..|  io:format("calc_store received cast: ~p~n",[Msg]), 
    0..|  {noreply, State}. 
     | 
     | handle_info({'EXIT',_P,shutdown},State) -> 
    0..|  {stop,State}; 
     | handle_info(Msg,State) -> 
    0..|  io:format("calc_state received info: ~p~n",[Msg]), 
    0..|  {noreply,State}. 
     | 
     | terminate(_Reason, _State) -> 
    0..|  ok. 
     | 
     | code_change(_OldVsn, State, _Extra) -> 
    0..|  {ok, State}. 
+0

Hej, faktycznie próbujemy uruchomić nasze testy EUnit z prętem zbrojeniowym2 i czy wiesz, czy można uzyskać dane pokrycia bez ** testów ogólnych **? –

+0

Nigdy nie słyszałem o zbrojeniu2. Jeśli mówisz o rebar3, funkcja pokrycia testowego jest dostępna za pomocą opcji '{cover_enabled, true}' i uruchamia testy za pomocą polecenia 'rebar3 eunit --cover'. Zobacz [rebar3] (https://www.rebar3.org/docs/running-tests). Ale jeszcze go nie używałem. – Pascal

+0

Dziękujemy! To jest woriking. :) –

Powiązane problemy