Erlang Eunit 测试套件的通用设置和拆卸方法
A common setup and teardown method for Erlang Eunit test suites
我正在尝试检查我在 MongoDB 中定义的所有索引是否都被我的应用程序使用,并且没有额外的索引。我有一个实用程序可以为单个 Eunit
测试套件执行此操作。但是,我的一些组件有多个 Eunit
测试套件,我想知道是否有一种方法可以在调用任何测试套件之前 运行 公共代码,然后 运行 一个所有测试套件完成后的通用拆解代码。我正在使用 rebar
调用 Eunit
.
提前致谢。
您可以查看灯具,尤其是 setup
的灯具:http://erlang.org/doc/apps/eunit/chapter.html#Fixtures
只要 eunit documentation for test representations 说明,测试集可以是深层列表。下面是一个示例模块,显示了外部 setup
夹具的使用,其测试是生成器,每个生成器提供一个内部 setup
夹具。内部 setup
fixtures 对应于您现有的测试套件,每个都有自己的设置和清理功能。外部 setup
夹具为内部套件提供通用设置和清理。
-module(t).
-compile(export_all).
-include_lib("eunit/include/eunit.hrl").
top_setup() ->
?debugMsg("top setup").
top_cleanup(_) ->
?debugMsg("top cleanup").
test_t1() ->
{setup,
fun() -> ?debugMsg("t1 setup") end,
fun(_) -> ?debugMsg("t1 cleanup") end,
[fun() -> ?debugMsg("t1 test 1") end,
fun() -> ?debugMsg("t1 test 2") end,
fun() -> ?debugMsg("t1 test 3") end]}.
test_t2() ->
{setup,
fun() -> ?debugMsg("t2 setup") end,
fun(_) -> ?debugMsg("t2 cleanup") end,
[fun() -> ?debugMsg("t2 test 1") end,
fun() -> ?debugMsg("t2 test 2") end,
fun() -> ?debugMsg("t2 test 3") end]}.
t_test_() ->
{setup,
fun top_setup/0,
fun top_cleanup/1,
[{generator, fun test_t1/0},
{generator, fun test_t2/0}]}.
编译此模块,然后 运行 从 Erlang shell 生成预期输出:
1> c(t).
{ok,t}
2> eunit:test(t).
/tmp/t.erl:7:<0.291.0>: top setup
/tmp/t.erl:14:<0.293.0>: t1 setup
/tmp/t.erl:16:<0.295.0>: t1 test 1
/tmp/t.erl:17:<0.295.0>: t1 test 2
/tmp/t.erl:18:<0.295.0>: t1 test 3
/tmp/t.erl:15:<0.293.0>: t1 cleanup
/tmp/t.erl:22:<0.293.0>: t2 setup
/tmp/t.erl:24:<0.300.0>: t2 test 1
/tmp/t.erl:25:<0.300.0>: t2 test 2
/tmp/t.erl:26:<0.300.0>: t2 test 3
/tmp/t.erl:23:<0.293.0>: t2 cleanup
/tmp/t.erl:10:<0.291.0>: top cleanup
All 6 tests passed.
ok
首先运行公共设置,然后每个套件运行自己的设置和清理,最后运行公共清理。
我正在尝试检查我在 MongoDB 中定义的所有索引是否都被我的应用程序使用,并且没有额外的索引。我有一个实用程序可以为单个 Eunit
测试套件执行此操作。但是,我的一些组件有多个 Eunit
测试套件,我想知道是否有一种方法可以在调用任何测试套件之前 运行 公共代码,然后 运行 一个所有测试套件完成后的通用拆解代码。我正在使用 rebar
调用 Eunit
.
提前致谢。
您可以查看灯具,尤其是 setup
的灯具:http://erlang.org/doc/apps/eunit/chapter.html#Fixtures
只要 eunit documentation for test representations 说明,测试集可以是深层列表。下面是一个示例模块,显示了外部 setup
夹具的使用,其测试是生成器,每个生成器提供一个内部 setup
夹具。内部 setup
fixtures 对应于您现有的测试套件,每个都有自己的设置和清理功能。外部 setup
夹具为内部套件提供通用设置和清理。
-module(t).
-compile(export_all).
-include_lib("eunit/include/eunit.hrl").
top_setup() ->
?debugMsg("top setup").
top_cleanup(_) ->
?debugMsg("top cleanup").
test_t1() ->
{setup,
fun() -> ?debugMsg("t1 setup") end,
fun(_) -> ?debugMsg("t1 cleanup") end,
[fun() -> ?debugMsg("t1 test 1") end,
fun() -> ?debugMsg("t1 test 2") end,
fun() -> ?debugMsg("t1 test 3") end]}.
test_t2() ->
{setup,
fun() -> ?debugMsg("t2 setup") end,
fun(_) -> ?debugMsg("t2 cleanup") end,
[fun() -> ?debugMsg("t2 test 1") end,
fun() -> ?debugMsg("t2 test 2") end,
fun() -> ?debugMsg("t2 test 3") end]}.
t_test_() ->
{setup,
fun top_setup/0,
fun top_cleanup/1,
[{generator, fun test_t1/0},
{generator, fun test_t2/0}]}.
编译此模块,然后 运行 从 Erlang shell 生成预期输出:
1> c(t).
{ok,t}
2> eunit:test(t).
/tmp/t.erl:7:<0.291.0>: top setup
/tmp/t.erl:14:<0.293.0>: t1 setup
/tmp/t.erl:16:<0.295.0>: t1 test 1
/tmp/t.erl:17:<0.295.0>: t1 test 2
/tmp/t.erl:18:<0.295.0>: t1 test 3
/tmp/t.erl:15:<0.293.0>: t1 cleanup
/tmp/t.erl:22:<0.293.0>: t2 setup
/tmp/t.erl:24:<0.300.0>: t2 test 1
/tmp/t.erl:25:<0.300.0>: t2 test 2
/tmp/t.erl:26:<0.300.0>: t2 test 3
/tmp/t.erl:23:<0.293.0>: t2 cleanup
/tmp/t.erl:10:<0.291.0>: top cleanup
All 6 tests passed.
ok
首先运行公共设置,然后每个套件运行自己的设置和清理,最后运行公共清理。