2011-11-13 13 views
7

Sto scrivendo test EUnit per il codice Erlang.EUnit non riesce a testare le funzioni private

ho un modulo di origine:

-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. 
... 
... 
... 

e un modulo di unità di test:

-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)). 
... 
... 
... 

Quando eseguo eunit:test(prob_list,[verbose]) si dice:

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

ma quando esporto probability/2 nel mio modulo prob_list, tutto è ok.

Esiste un modo per testare le funzioni private?

risposta

3

Ok, quindi qui va:

dclements mi ha dato un buon suggerimento su come posso fare quello che ho chiesto. Non voglio mettere tutti i miei test nel modulo sorgente, puoi vedere un bell'esempio di come tenere qui: Erlang EUnit – introduction

Ora la mia soluzione è di esportare tutte le funzioni nella compilazione TEST. Così si mette:

-define(NOTEST, true). 

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

e quindi compilare con erlc -DTEST *.erl per eseguire test, e compilazione ordinario di esportare solo funzioni necessarie.

+1

Questo è un approccio ragionevole (anche se vale la pena notare che è possibile avere più linee di esportazione, il che potrebbe ripulire un po '), soprattutto se si desidera separare i test dell'unità in file separati e testare le proprie funzioni private. L'unico svantaggio di questo approccio è che questo può portare a un codice che supera il test ma non funzionerà altrimenti se utilizzi accidentalmente i metodi privati ​​al di fuori dei tuoi file di test. –

+1

Per esporre tutto al modulo di test è possibile utilizzare "-compile (export_all)." invece di mantenere una grande dichiarazione di esportazione. – goertzenator

8

L'approccio generale che uso per questo è di includere tutti i test di unità nello stesso file e separarli fuori:

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

%% Functions 
[...] 


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

Ciò dovrebbe consentire di testare le funzioni private accanto al vostro pubblico funzioni.

+0

Ho fatto tutto quello che hai scritto, ma ottengo lo stesso risultato. Eseguo 'erlc -DTEST * .erl' per compilare e ottengo ancora :: undef da funzioni private. – Uko

+0

Ok, colpa mia, ho dimenticato di rimuovere il nome del modulo dalla chiamata di funzione all'interno dei test. – Uko

5

È possibile utilizzare la direttiva -compile(export_all) di esportare tutte le funzioni condizionale solo when compiling for testing:

%% Export all functions for unit tests 
-ifdef(TEST). 
-compile(export_all). 
-endif. 
Problemi correlati