Erlang Eunit测试套件的通用设置和拆卸方法

Erlang Eunit测试套件的通用设置和拆卸方法,erlang,eunit,Erlang,Eunit,我试图检查我在MongoDB中定义的所有索引是否都被我的应用程序使用,并且没有额外的索引。我有一个实用程序可以为单个Eunit测试套件实现这一点。但是,我的一些组件有多个Eunit测试套件,我想知道是否有一种方法可以在调用任何测试套件之前运行公共代码,然后在所有测试套件完成后运行公共拆卸代码。我正在使用rebar调用Eunit 提前感谢。您可以查看夹具,尤其是设置一:只要说明,测试集可以是深度列表。下面是一个示例模块,展示了外部设置夹具的使用,该夹具的测试是生成器,每个生成器提供一个内部设置夹具

我试图检查我在MongoDB中定义的所有索引是否都被我的应用程序使用,并且没有额外的索引。我有一个实用程序可以为单个
Eunit
测试套件实现这一点。但是,我的一些组件有多个
Eunit
测试套件,我想知道是否有一种方法可以在调用任何测试套件之前运行公共代码,然后在所有测试套件完成后运行公共拆卸代码。我正在使用
rebar
调用
Eunit


提前感谢。

您可以查看夹具,尤其是
设置
一:

只要说明,测试集可以是深度列表。下面是一个示例模块,展示了外部
设置
夹具的使用,该夹具的测试是生成器,每个生成器提供一个内部
设置
夹具。内部
设置
夹具与现有测试套件相对应,每个套件都有自己的设置和清理功能。外部
设置
夹具为内部套件提供公共设置和清理

-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
1>c(t)。
{好的,t}
2> eunit:测试(t)。
/tmp/t.erl:7::顶部设置
/tmp/t.erl:14::t1设置
/tmp/t.erl:16::t1测试1
/tmp/t.erl:17::t1测试2
/tmp/t.erl:18::t1测试3
/tmp/t.erl:15::t1清理
/tmp/t.erl:22::t2设置
/tmp/t.erl:24::t2测试1
/tmp/t.erl:25::t2测试2
/tmp/t.erl:26::t2测试3
/tmp/t.erl:23::t2清理
/tmp/t.erl:10::顶部清理
6项测试全部通过。
好啊

首先运行公共安装程序,然后每个套件都运行,并由其自己的安装和清理程序括起来,最后运行公共清理程序。

您的代码示例是探索
eunit
文档的良好起点。非常有用。