我在 Erlang 中有一个模块,它具有 Erlang 未导出的功能。如何使用通用测试框架测试/调用这些函数?
问问题
2256 次
4 回答
14
是不可能的。-ifdef(TEST).
只有在编译测试时,您才能使用预处理器条件导出这些函数。
根据您的工具,您可能需要TEST
在编译模块时显式提供该宏。您可以通过使用 {d,'TEST'} 编译器选项或 -DTEST 编译标志来做到这一点。
于 2013-03-15T13:53:27.893 回答
2
Common Test 很棘手,但可以使用嵌入式EUnit测试用例来测试模块中的私有函数。然后,您可以使用 Common Test 测试公共接口。Rebar将在您运行时自动发现嵌入式测试用例rebar test
。
这是一个例子:
-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 的简要介绍,请参阅 Learn You Some Erlang章节。
于 2013-03-16T16:04:48.497 回答
0
您可以将私有函数放在它们自己的模块中,该模块会导出所有这些函数。原始模块可以导入它们并且它们将保持私有,您的测试框架可以直接调用导入私有模块。
于 2013-03-16T02:28:36.363 回答
0
以防万一有人也遇到这种情况。包含 eunit.hrl 文件会定义 TEST,除非在包含之前定义了 NOTEST。-include_lib("eunit.hrl")。参考:http ://www.erlang.org/download/eunit.hrl
于 2013-11-11T02:01:30.587 回答