2011-11-13 13 views
7

मैं एरलांग कोड के लिए ईयूनिट परीक्षण लिख रहा हूं। जब मैं चलाने eunit:test(prob_list,[verbose]) यह कहता हैईयूनीट निजी कार्यों का परीक्षण करने में विफल रहता है

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

:

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

लेकिन जब मैं probability/2 निर्यात

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

और एक इकाई के परीक्षण मॉड्यूल:

मैं एक स्रोत मॉड्यूल है मेरे prob_list मॉड्यूल में, सबकुछ ठीक है।

निजी कार्यों का परीक्षण करने का कोई तरीका है?

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

%% Functions 
[...] 


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

यह आपको अपनी सार्वजनिक के साथ ही आपकी निजी कार्यों के परीक्षण करने की अनुमति चाहिए:

उत्तर

3

ठीक है, इसलिए यहाँ यह जाता है:

dclements मैं कैसे पूरा कर सकते हैं कि मैं क्या कहा है मुझे का एक अच्छा संकेत दिया था। मैं अपने सभी परीक्षणों को स्रोत मॉड्यूल में नहीं रखना चाहता हूं, आप यहां अलग रखने का एक अच्छा उदाहरण देख सकते हैं: Erlang EUnit – introduction

अब मेरा समाधान टेस्ट संकलन पर सभी कार्यों को निर्यात करना है। तो तुम रख:

-define(NOTEST, true). 

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

और फिर परीक्षण चलाने के लिए erlc -DTEST *.erl साथ संकलन, और साधारण संकलन केवल जरूरत कार्यों निर्यात करने के लिए।

+1

यह एक उचित दृष्टिकोण है (हालांकि यह ध्यान देने योग्य है कि आपके पास कई निर्यात लाइनें हो सकती हैं, जो चीजों को थोड़ा सा साफ कर सकती हैं), खासकर यदि आप दोनों को अपने यूनिट परीक्षण अलग फाइलों में अलग करना चाहते हैं और अपने निजी कार्यों का परीक्षण करना चाहते हैं। इस दृष्टिकोण के लिए एक नकारात्मक पक्ष यह है कि यह उस कोड को जन्म दे सकता है जो परीक्षण पास करता है लेकिन अन्यथा नहीं चलाएगा यदि आप गलती से अपनी परीक्षण फ़ाइलों के बाहर निजी विधियों का उपयोग करते हैं। –

+1

परीक्षण मॉड्यूल में सब कुछ बेनकाब करने के लिए आप "-compile (export_all) का उपयोग कर सकते हैं।" एक बड़ा निर्यात विवरण बनाए रखने के बजाय। – goertzenator

8

सामान्य तरीके को मैं इस के लिए उपयोग एक ही फाइल में इकाई परीक्षण के सभी शामिल करने के लिए और उन्हें अलग से बाहर है कार्य करता है।

+0

मेरे द्वारा की गई है कि आप ने लिखा है, लेकिन मैं एक ही परिणाम मिलता है। मैं संकलन के लिए 'erlc -DTEST * .erl' चलाता हूं और मुझे अभी भी निजी कार्यों से :: undef मिलता है। – Uko

+0

ठीक है, मेरी गलती, मैं परीक्षण के भीतर फ़ंक्शन कॉल से मॉड्यूल नाम को निकालना भूल गया हूं। – Uko

5

आप निर्देश -compile(export_all) का उपयोग सशर्त सभी कार्यों केवल when compiling for testing निर्यात करने के लिए कर सकते हैं: सब कुछ

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