使用通用测试的模块的Erlang测试(非导出/私有)功能

时间:2013-03-15 13:21:43

标签: testing erlang otp rebar common-test

我在Erlang中有一个模块,其中的函数不是由Erlang导出的。 如何使用通用测试框架测试/调用这些函数?

4 个答案:

答案 0 :(得分:13)

这是不可能的。只有在编译测试时,才能使用-ifdef(TEST).预处理器条件导出这些函数。

根据您的工具,您可能需要在编译模块时明确提供TEST宏。您可以使用{d,'TEST'}编译器选项或-DTEST编译标志来完成此操作。

答案 1 :(得分:1)

使用Common Test很棘手,但可以使用嵌入式EUnit测试用例来测试模块中的私有函数。然后,您可以使用Common Test测试公共接口。当您运行rebar test时,Rebar会自动发现嵌入式测试用例。

以下是一个例子:

-module(example).

-export([public/1]).

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

%% This function will be tested externally using Common Test
public(Foo) ->
    private(Foo + 42).

%% This function is not reachable to CT, so it will be tested using EUnit.
private(Bar) ->
    Bar * 2.

%%% Tests
-ifdef(TEST).

private_test() ->
    ?assertEqual(10, private(5)),
    ?assertEqual(0, private(0)).

-endif.

在旁注中,如果您在使用EUnit进行测试时需要模拟一个模块(或其中的一部分),您可能会发现Meck

有关EUnit的温和介绍,请参阅“了解你一些Erlang chapter

答案 2 :(得分:0)

您可以将私有函数放在自己的模块中,然后导出所有这些函数。原始模块可以导入它们并且它们将保持私有,并且您的测试框架可以直接调用导入私有模块。

答案 3 :(得分:0)

以防有人遇到这个问题。包括eunit.hrl文件定义TEST,除非在include之前定义了NOTEST。 -include_lib( “eunit.hrl”)。 参考:http://www.erlang.org/download/eunit.hrl