【发布时间】:2014-04-11 15:02:31
【问题描述】:
我一直在玩 EUnit,这很好,但我遇到了 dets 问题,当我的测试失败并且没有正确关闭 dets 时,文件仍然在我的 shell 中打开,我无法关闭它,因为它由另一个进程创建(当我运行测试时)。
你遇到过同样的问题吗?我可以有效地尝试在 EUnit 中捕获吗?
感谢您的任何意见!
【问题讨论】:
我一直在玩 EUnit,这很好,但我遇到了 dets 问题,当我的测试失败并且没有正确关闭 dets 时,文件仍然在我的 shell 中打开,我无法关闭它,因为它由另一个进程创建(当我运行测试时)。
你遇到过同样的问题吗?我可以有效地尝试在 EUnit 中捕获吗?
感谢您的任何意见!
【问题讨论】:
使用Common Test。 EUnit 适合测试没有副作用的小功能。
【讨论】:
EUnit完美适合测试多个进程和DETS,不用担心。
我认为测试失败的唯一情况是没有关闭 DETS 文件,这是因为您没有使用夹具。
也就是这样的代码:
wrong_test() ->
setup(),
?assert(false),
cleanup().
不会调用 cleanup(),因为带有 ?assert() 的行会抛出异常。这是预期的行为。所以如果 cleanup() 应该关闭 DETS 文件,它不会关闭它。
EUnit documentation 解释说,无论测试发生什么情况,确保始终执行清理功能的方法是使用“夹具”,setup 或 foreach。例如:
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 网站上找到。
【讨论】: