2011-11-13 28 views
7

Tôi đang viết kiểm tra EUnit cho mã Erlang.EUnit không kiểm tra chức năng riêng tư

Tôi có một mô-đun nguồn:

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

và một module đơn vị kiểm tra:

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

Khi tôi chạy eunit:test(prob_list,[verbose]) nó nói:

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

nhưng khi tôi xuất probability/2 trong mô-đun prob_list của tôi, mọi thứ đều ổn.

Có cách nào để kiểm tra các chức năng riêng tư không?

Trả lời

3

Ok, vì vậy ở đây nó đi:

dclements đã cho tôi một gợi ý tốt đẹp của làm thế nào tôi có thể thực hiện những gì tôi đã hỏi. Tôi không muốn đặt tất cả các thử nghiệm của mình vào mô-đun nguồn, bạn có thể thấy một ví dụ hay về việc giữ nguyên phần này tại đây: Erlang EUnit – introduction

Bây giờ giải pháp của tôi là xuất tất cả các hàm trên biên dịch TEST. Vì vậy, bạn đặt:

-define(NOTEST, true). 

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

Sau đó biên dịch với erlc -DTEST *.erl để chạy kiểm tra và biên dịch thông thường chỉ xuất các chức năng cần thiết.

+1

Đó là một cách tiếp cận hợp lý (mặc dù đáng chú ý là bạn có thể có nhiều dòng xuất, có thể làm sạch mọi thứ), đặc biệt nếu bạn muốn tách riêng các bài kiểm tra đơn vị thành các tệp riêng biệt và kiểm tra các chức năng riêng của bạn. Một nhược điểm của phương pháp này là điều này có thể dẫn đến mã vượt qua kiểm tra nhưng sẽ không chạy nếu bạn vô tình sử dụng các phương thức riêng bên ngoài các tệp thử nghiệm của bạn. –

+1

Để hiển thị mọi thứ cho mô-đun thử nghiệm, bạn có thể sử dụng "-compile (export_all)". thay vì duy trì một tuyên bố xuất khẩu lớn. – goertzenator

8

Cách tiếp cận chung mà tôi sử dụng cho điều này là bao gồm tất cả các bài kiểm tra đơn vị trong cùng một tập tin và tách chúng ra:

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

%% Functions 
[...] 


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

này sẽ cho phép bạn kiểm tra các chức năng riêng của bạn cùng với cộng đồng của bạn chức năng.

+0

tôi đã thực hiện tất cả những gì bạn đã viết, nhưng tôi nhận được kết quả tương tự. Tôi chạy 'erlc -DTEST * .erl' để biên dịch và tôi vẫn nhận được :: undef từ các hàm riêng tư. – Uko

+0

Ok, lỗi của tôi, tôi đã quên xóa tên mô-đun khỏi cuộc gọi hàm trong các thử nghiệm. – Uko

5

Bạn có thể sử dụng các chỉ thị -compile(export_all) có điều kiện xuất khẩu tất cả các chức năng chỉ when compiling for testing:

%% Export all functions for unit tests 
-ifdef(TEST). 
-compile(export_all). 
-endif. 
Các vấn đề liên quan