2013-07-10 65 views
8

Khi sử dụng Python, tôi thực hiện kiểm tra mã với các công cụ như vùng phủ python và đặc biệt đối với django gói djaango-mũi, tôi đang tìm kiếm tương đương trong Erlang. Tôi đã làm thử nghiệm với eunit và tạo báo cáo của tôi với surefire nhưng tôi không tìm thấy cách để thực hiện bảo vệ mã, có ai biết công cụ hoặc phương pháp để thực hiện việc này không?Cách thực hiện kiểm tra đơn vị trong Erlang

Trả lời

10

Nếu bạn rebar chỉ cần thêm:

{cover_enabled, true}. 

để kiểm tra chung rebar.config

+0

tôi không sử dụng cốt thép vì nó chưa đóng gói trong Debian, thích không cài đặt nó mà không cần gói, cảm ơn vì câu trả lời của bạn – Rodolphe

+0

Tôi tìm thấy câu trả lời này cố gắng để kích hoạt bảo hiểm mã cho các bài kiểm tra phổ biến. Nếu bạn đang ở trong cùng một chiếc thuyền, bạn có thể phải tạo một tệp bổ sung để thử nghiệm phổ biến để hoạt động: http://stackoverflow.com/a/28969406/301857 –

10

Tôi đã sử dụng để điều khiển các dãy phòng thử nghiệm, sau đó trong spec kiểm tra bạn có thể tuyên bố một spec bìa với tuple {bìa, "coverspec path"}:

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

bìa đặc tả chủ yếu là xác định mức độ chi tiết và danh sách các mô-đun bạn muốn phân tích:

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

sau đó khi bạn chạy thử nghiệm bạn nhận được một trang web gia tăng, với tất cả các lần lặp kiểm tra rằng nơi thực hiện, và cho mỗi kết quả và liên kết đến các bản tóm tắt vùng phủ sóng và sau đó mã nguồn của bạn chú thích với các số lượng thời gian là một dòng được đánh giá.

incremental web page result summary coverage summary

và nguồn chú thích:

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

Xin chào, chúng tôi đang thực sự chạy thử nghiệm EUnit với rebar2 và, bạn có biết nếu có thể nhận dữ liệu về vùng phủ sóng mà không có ** thử nghiệm phổ biến ** không? –

+0

Tôi chưa từng nghe về rebar2. Nếu bạn đang nói về rebar3, một tính năng kiểm tra có sẵn bằng cách sử dụng tùy chọn '{cover_enabled, true}' và chạy các thử nghiệm với lệnh 'rebar3 eunit --cover'. Xem [rebar3] (https://www.rebar3.org/docs/running-tests). Nhưng tôi đã không sử dụng nó. – Pascal

+0

Cảm ơn bạn! Đó là lo lắng. :) –

Các vấn đề liên quan