Erlang的TestKit

egb*_*kul 2 testing erlang

是否有任何类型的Erlang测试框架,类似于Akka中的TestKit

目标是在集成环境中测试进程,例如,在一端向一组进程发送一些消息,并在另一端发出结果消息.Akka Testkit使这些类型的测试相当简单,但我还没能在Erlang中找到相应的.

编辑:作为我正在寻找的最简单的例子,假设我们有一个进程A,它应该向进程B发送一条消息,我想测试这种行为.

在Akka中,我可以基于TestKit类实例化一个actor,它有一个内置方法expectMsg.所以我的测试看起来像这样:

  • 实例化一个模拟B演员
  • 实例化A actor(以某种方式获取对B的引用)
  • 发送B消息
  • 调用B.expectMsg来验证它是否收到了消息(请注意
    • 这会自动确保没有其他类型的消息发送到B,和
    • 你可以选择提供超时)

在Erlang中是否有支持此类工作流的库?据我所知,EUnit和CT都不支持这种测试.

要了解更复杂的断言,请参阅此页面:http://doc.akka.io/api/akka/2.0/akka/testkit/TestKit.html

Hyn*_*dil 5

Erlang本身使这些测试相当简单.ErlangeunitLightweight Unit Testing Framework,还有用于高规模集成测试的通用测试框架.

编辑:对于这些简单的事情你不需要比Erlang更多:

$ cat echo.erl 
-module(echo).

-export([start/0, send/3]).

start() ->
    spawn_link(fun() ->
                      receive
                          {To, Msg} -> To ! Msg
                      end
              end).

send(Echo, To, Msg) ->
    Echo ! {To, Msg}.

-include_lib("eunit/include/eunit.hrl").

echo_test_() ->
    Msg =  "Hello world!",
    {timeout, 0.1, fun() ->
                           Echo = echo:start(),
                           echo:send(Echo, self(), Msg),
                           ?assertEqual(Msg, receive X -> X end)
                   end}.
$ erlc echo.erl 
$ erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
1> eunit:test(echo, [verbose]).
======================== EUnit ========================
echo: echo_test_ (module 'echo')...ok
=======================================================
  Test passed.
ok
2>
Run Code Online (Sandbox Code Playgroud)

过程A是通过启动echo:start/0和处理B是测试过程本身.如果你想要模拟现有的模块meck.如果您只想在两个进程之间观看消息而不会弄乱接收器代码,您当然可以使用Erlang VM本身的跟踪功能.