我在Erlang中有一个模块,其中的函数不是由Erlang导出的。 如何使用通用测试框架测试/调用这些函数?
答案 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