测试未导出的功能

时间:2011-03-01 19:18:02

标签: erlang

我想使用rebar和common_test测试一些未导出的函数。什么是干净有效的方法呢?

我倾向于在编译/测试时设置宏,并在模块中打开/关闭export_all,具体取决于它是生产还是测试版本。我希望它很简单 - 例如,我不想在从生产切换到测试之前编辑配置文件,反之亦然。但是,我没有看到使用rebar将参数传递给erl编译器的方法。我错过了吗?

我知道eunit可以轻松测试未导出的功能,但我已经为common_test提供了基础设施,我现在不想改变我的工作流程。

3 个答案:

答案 0 :(得分:2)

在为测试运行构建模块时,您可以在+export_all选项中添加erlc。您可以在{erl_opts, [export_all]}.文件中使用rebar.config执行此操作。我不认为你可以在运行时向rebar传递额外的erlc个参数(例如你不能rebar compile +export_all)。

答案 1 :(得分:1)

编辑:刚刚意识到您使用了common_test。如果不适用,请忽略此回复!

我有一种更先进的方法来测试未导出的函数,这些函数具有不导出它们的优点,从而使生产代码保持尽可能完整(可能只有在某些函数未导出时才会出现故障,但是如果导出所有功能,则在测试期间未检测到。)

这是使用Rebar和EUnit的工作原理。

在源文件中,添加以下行:

-ifdef(TEST).
-include("yourmodule_tests.hrl").
-endif.

test文件夹中,添加名为yourmodule_tests.hrl的文件(例如,正常情况下为yourmodule_tests.erl)并添加以下内容:

-include_lib("eunit/include/eunit.hrl").

some_test() ->
    ?assertEqual(ok, internal_function()).

将以下配置添加到rebar.config(如果您已经有erl_opts,只需将新元组添加到该列表中):

{erl_opts, [{i, "test"}]}.

当你运行rebar eunit时,Rebar将定义TEST环境变量,你的代码将被“测试编译”。也就是说,将测试包括在您的模块中,测试将能够访问内部函数。

如果您使用除Rebar以外的任何其他内容,请确保在编译测试时使用erlc -DTEST ...编译代码。

答案 2 :(得分:1)

您可以在编译eunit时添加rebar使用的其他编译选项。如archaelus所述,您需要+export_all选项erlc。添加行

{eunit_compile_opts, [export_all]}.

到您的rebar.config文件。这在rebar.config.sample文件中有提及。