【问题标题】:testing unexported functions测试未导出的函数
【发布时间】:2011-07-06 18:20:55
【问题描述】:

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

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

我知道 eunit 可以轻松测试未导出的函数,但我的 common_test 基础架构已经运行良好,我现在不想更改我的工作流程。

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

    【讨论】:

    • 如果您可以在命令行上覆盖任何配置文件选项,那就太好了,就像您可以将配置参数与 OTP 的应用程序配置系统级联一样。丢人现眼。必须进入并编辑要部署的 rebar.config 文件只是另一件事。我要么必须添加一个脚本来构建我的构建系统,要么还有另一个清单项。它们加起来。
    • 好吧,公平地说,rebar compile 可以做的不仅仅是 erlc 调用。它也为许多其他构建工件(asn1、yecc、erlydtl、...)提供了编译选项,因此将 erlc 参数传递给随机的其他编译器在一般情况下可能没有帮助。
    【解决方案2】:

    编辑:刚刚意识到您使用了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 ... 编译代码。

    【讨论】:

    • 不是erl_opts在你用rebar编译的时候都用到了吗?这意味着在使用 rebar 编译生产时我必须删除该属性?
    【解决方案3】:

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

    {eunit_compile_opts, [export_all]}.
    

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

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      相关资源
      最近更新 更多