2011-11-13 22 views
7

EUlang testleri için Erlang kod yazıyorum. Ben probability/2 dışa aktardığınızdaEUnit özel işlevlerini test edemiyor

prob_list_tests: probability_test...*failed* 
::undef 

ama: Ben eunit:test(prob_list,[verbose]) koşmak o dediğinde

-module(prob_list_tests). 
-include_lib("eunit/include/eunit.hrl"). 

-define(TEST_LIST,[{3,0.2},{4,0.6},{5,1.0},{6,0.5}]). 
-define(TEST_LIST1,[{2,0.9},{3,0.6},{6,0.1},{8,0.5}]). 
-define(TEST_UNO_LIST,[{2,0.5}]). 

probability_test() -> ?assertNot(prob_list:probability([],3)), 
         ?assertEqual(0.5,prob_list:probability(?TEST_UNO_LIST,2)), 
         ?assertNot(prob_list:probability(?TEST_UNO_LIST,3)), 
         ?assertEqual(0.2,prob_list:probability(?TEST_LIST,3)), 
         ?assertEqual(1.0,prob_list:probability(?TEST_LIST,5)), 
         ?assertNot(prob_list:probability(?TEST_LIST,7)). 
... 
... 
... 

:

-module(prob_list). 
-export([intersection/2,union/2]). 

probability([], _Item) -> false; 
probability([{First,Probability}|Rest], Item) -> 
    if 
     First == Item -> Probability; 
     true   -> probability(Rest, Item) 
    end. 
... 
... 
... 

ve bir birim test modülü:

Bir kaynak modülü var benim prob_list modülünde her şey yolunda.

Özel işlevleri sınamak için herhangi bir yöntem var mı? Bu, kamu yanında özel fonksiyonları test etmek için izin vermelidir

 
-ifdef(TEST). 
-include_lib("eunit/include/eunit.hrl"). 
-endif. 

%% Functions 
[...] 


-ifdef(TEST). 
%% Unit tests go here. 
-endif. 

:

cevap

3

Ok, işte o da: Ben sordum kadarıyla başarmak nasıl

dclements bana güzel bir ipucu verdi. Tüm testlerimi kaynak modülüne koymak istemiyorum, burada ayrı tutmanın güzel bir örneğini görebilirsiniz: Erlang EUnit – introduction

Artık çözümüm tüm fonksiyonları TEST derlemesine aktarmak.

-define(NOTEST, true). 

-export([intersection/2,union/2]). 
-ifdef(TEST). 
-export([intersection/2,union/2,contains/2,probability/2,lesslist/2]). 
-endif. 

Ve sonra testler erlc -DTEST *.erl ile derlemek ve sıradan derleme sadece gerekli işlevleri vermek için: Yani koydu.

+1

Bu özellikle mantıklı bir yaklaşımdır (özellikle birden fazla dışa aktarma hattına sahip olabileceğinize dikkat edin), özellikle de ünite testlerinizi ayrı dosyalara ayırıp özel işlevlerinizi test etmek istiyorsanız. Bu yaklaşımın bir dezavantajı, testten geçen kodlara yol açabileceğidir, ancak test yöntemlerinin dışındaki özel yöntemleri yanlışlıkla kullanırsanız, aksi takdirde çalışmaz. –

+1

Her şeyi test modülüne göstermek için "-compile (export_all)" seçeneğini kullanabilirsiniz. büyük bir ihracat beyanı tutmak yerine. – goertzenator

8

Bunun için kullanmak genel yaklaşım aynı dosyada birim testlerinin hepsini kapsar ve onları ayırmaktır fonksiyonlar.

+0

yaptığım herşeyi size yazdım ama aynı sonucu alabilirsiniz. Çalıştırmak için 'erlc -DTEST * .erl' çalıştırıyorum ve hala özel işlevlerden undef alıyorum. – Uko

+0

Tamam, benim hatam, testler içerisindeki fonksiyon çağrısından modül adını kaldırmayı unuttum. – Uko

5

Sen şartlı tüm fonksiyonları sadece when compiling for testing ihracat yönergesini -compile(export_all) kullanabilirsiniz:

%% Export all functions for unit tests 
-ifdef(TEST). 
-compile(export_all). 
-endif. 
İlgili konular