【问题标题】:Examples of using Eunit to test clustered application使用 Eunit 测试集群应用的例子
【发布时间】:2014-12-19 12:08:49
【问题描述】:

我发现 Eunit 上的 documentation 缺少关于如何测试多节点应用程序的内容。我找到了这个example,但是当我跑的时候很遗憾:

cluster_test_() ->  
    {node, foo,
     fun (Node) ->
        [?_assertEqual(pong, net_adm:ping(Node))]
     end
    }.

我明白了:

undefined
*** context setup failed ***
** in function slave:start/5 (slave.erl, line 197)
**exit:not_alive

我在这里做错了吗?

作为旁注,我还查看了 gproc 的分布式测试 here,但它是 manually starting 多个从节点,而不是使用内置的 Eunit 功能。

谁能给我一些如何使用node 测试夹具的例子?

谢谢,

【问题讨论】:

    标签: unit-testing erlang distributed eunit


    【解决方案1】:

    Common Test 专为测试更大的系统而编写。

    其他官方文档你可以找到很好的主题介绍here。最后一章以small snippet 如何将现有的 eunit 测试集成到 Common Test 中结束。

    【讨论】:

    • 谢谢,我希望用 Eunit 来做,会尝试普通测试。
    【解决方案2】:

    嗯,我从来没有让从节点功能正常工作,所以它不应该是一个记录的功能。我猜它最终出现在文档中,而我仍然认为它正在工作。我可能需要修复文档。

    【讨论】:

    • 哈,过早的功能文档,我也犯过几次罪:-P
    【解决方案3】:

    如果您要进行多节点测试并记住 eunit,那么模块中的 eunit ifdefs 将更改它的校验和,如果您说有一个模块使用 ifdef eunit 编译而另一个不是,则尝试调用时会出错远程功能。

    【讨论】:

      【解决方案4】:

      我的建议是您在禁用分发的情况下运行您的主节点。使用-sname 键启用它(我假设,您的示例代码位于模块node_test):

      > erl -sname master
      (master@hostname)1> c(node_test).
      > node_test:test().
      

      但这还不是全部。要在新版本的 erlang 中运行此代码,您应该进行一些更改:

      cluster_test_() ->  
          {node, foo,
           fun ({Node, StopNet}) ->
              ?debugFmt("Node ~p", [Node]),
              ?debugFmt("StopNet ~p", [StopNet]),
              [?_assertEqual(pong, net_adm:ping(Node))]
           end
          }.
      

      注意,函数参数现在不包含节点名称,而是包含两个元素的元组。第一个元素是远程节点名称,第二个元素是布尔标志,它总是假的(至少现在是这样)。更多详情请参考eunit sources

      【讨论】:

        猜你喜欢
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        • 2012-04-06
        • 1970-01-01
        • 2020-01-08
        • 1970-01-01
        • 2015-01-21
        • 2012-10-29
        相关资源
        最近更新 更多