【问题标题】:Dets leaves open process when test fails with EUnit当 EUnit 测试失败时,Dets 离开开放进程
【发布时间】:2014-04-11 15:02:31
【问题描述】:

我一直在玩 EUnit,这很好,但我遇到了 dets 问题,当我的测试失败并且没有正确关闭 dets 时,文件仍然在我的 shell 中打开,我无法关闭它,因为它由另一个进程创建(当我运行测试时)。

你遇到过同样的问题吗?我可以有效地尝试在 EUnit 中捕获吗?

感谢您的任何意见!

【问题讨论】:

    标签: erlang eunit dets


    【解决方案1】:

    使用Common Test。 EUnit 适合测试没有副作用的小功能。

    【讨论】:

    • 虽然 Common Test 完全可行,但这种关于 EUnit 的说法是完全错误的。 EUnit 可以完美地测试 OP 所询问的内容,以及更多。
    【解决方案2】:

    EUnit完美适合测试多个进程和DETS,不用担心。

    我认为测试失败的唯一情况是没有关闭 DETS 文件,这是因为您没有使用夹具。

    也就是这样的代码:

    wrong_test() ->
        setup(),
        ?assert(false),
        cleanup().
    

    不会调用 cleanup(),因为带有 ?assert() 的行会抛出异常。这是预期的行为。所以如果 cleanup() 应该关闭 DETS 文件,它不会关闭它。

    EUnit documentation 解释说,无论测试发生什么情况,确保始终执行清理功能的方法是使用“夹具”,setupforeach。例如:

    correct_test_() ->
        {setup,
            % Setup
            fun() ->
                ?assertMatch({ok, Table}, dets:open_file("hello", [])),
                Table
            end,
            % Cleanup
            fun(Table) ->
                ?assertMatch(ok, dets:close(Table)).
            end,
            % Tests
            [
                % This will fail, but the cleanup WILL be called
                ?_assert(false)
            ]
        }.
    

    因此,对于这种特殊情况,无需在 Erlang 中“捕获”异常。您可以使用夹具获得相同的效果。

    关于您无法从 shell 关闭 DETS 文件的事实,这不会发生在夹具上。另外,你的buggy测试也没有问题,因为从Erlang shell退出时文件会正确关闭。唯一没有正确关闭 DETS 文件的情况是 Erlang 运行时系统本身崩溃。

    其他有用的文档来源,比我之前提到的非常简洁的官方文档更容易理解,是 LYSE chapter on Eunit 和两个关于 Eunit 的演示文稿,您可以在 Erlang Factory 网站上找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2016-08-26
      相关资源
      最近更新 更多