6 Stimmen

EUnit kann private Funktionen nicht testen

Ich schreibe EUnit-Tests für Erlang-Code.

Ich habe ein Quellmodul:

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

und ein Modul für Einheitstests:

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

Wenn ich laufe eunit:test(prob_list,[verbose]) heißt es:

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

aber wenn ich exportiere probability/2 in meinem prob_list Modul, ist alles in Ordnung.

Gibt es eine Möglichkeit, private Funktionen zu testen?

6voto

David H. Clements Punkte 3490

Der allgemeine Ansatz, den ich hierfür verwende, besteht darin, alle Unit-Tests in dieselbe Datei aufzunehmen und sie dann zu trennen:

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

%% Functions
\[...\]

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

Dies sollte es Ihnen ermöglichen, Ihre privaten Funktionen neben den öffentlichen Funktionen zu testen.

6voto

Phil Calvin Punkte 4987

Sie können die Richtlinie -compile(export_all) um nur bedingt alle Funktionen zu exportieren beim Kompilieren für Tests :

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

3voto

Uko Punkte 12834

Ok, also los geht's:

dclements gab mir einen guten Hinweis darauf, wie ich das erreichen kann, worum ich gebeten habe. Ich möchte nicht alle meine Tests in Source-Modul setzen, können Sie ein schönes Beispiel für die Beibehaltung der auseinander hier sehen: Erlang EUnit - Einführung

Meine Lösung besteht nun darin, alle Funktionen bei der TEST-Kompilierung zu exportieren. Also setzen Sie:

-define(NOTEST, true).

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

Und kompilieren Sie dann mit erlc -DTEST *.erl um Tests durchzuführen, und gewöhnliches Kompilieren, um nur die benötigten Funktionen zu exportieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X