我有许多带有单元测试的模块。有没有办法只在单个模块中运行单元测试?
这是模块的相关部分的样子:
-export([ ..... ])
-include_lib("eunit/include/eunit.hrl").
...
...
...
first_test() ->
...
...
second_test() ->
...
...
Run Code Online (Sandbox Code Playgroud) 我正在与Erlang和EUnit一起进行单元测试,我想编写一个测试运行器来自动运行单元测试.问题是eunit:test/1似乎只返回"错误"或"确定"而不是测试列表以及它们返回的内容是通过还是失败.
那么有没有办法运行测试并返回某些形式的测试运行的数据结构及其通过/失败状态?
我知道使用ruby/rspec,您可以执行以下操作,以便为对该方法进行的不同调用接收不同的返回值:
allow(double).to receive(:msg).and_return(value1, value2, value3)
Run Code Online (Sandbox Code Playgroud)
我只能使meck存储一个带有一个返回值的方法,如下所示:
meck:expect(module, some_method, fun() -> ok end)
Run Code Online (Sandbox Code Playgroud)
有没有办法让它ok在第一次通话时返回,然后ok2在第二次通话时返回?
我release用rebar3(beta-4)创建了一个应用程序.添加了一些eunit测试并编写了一些代码.
现在我必须调试一个测试用例,看看我必须添加什么才能使实现正常工作.
我发现了一些关于在erlang控制台中使用dbg的文章,我发现了如何从eunit编写调试信息.但我需要从我必须测试的代码中获取信息(实际的实现(逻辑)).
当rebar3与eunit参数一起使用时,有没有办法调试erlang代码(实际的源代码,而不是测试代码)?
谢谢
目前我在终端中使用跟踪:https://aloiroberto.wordpress.com/2009/02/23/tracing-erlang-functions/
我正在尝试检查我在 MongoDB 中定义的所有索引是否正在被我的应用程序使用,并且没有额外的索引。我有一个实用程序可以为单个Eunit测试套件执行此操作。但是,我的一些组件有多个Eunit测试套件,我想知道是否有办法在调用任何测试套件之前运行通用代码,然后在所有测试套件完成后运行通用拆卸代码。我rebar用来调用Eunit.
提前致谢。
作为梅克的新手,我一直在进行一个测试来显示各种功能。但是,我无法理解为什么开发人员可能会调用 meck:validate。这是我的例子:
-module(meck_demo).
-include_lib("eunit/include/eunit.hrl").
validate_is_of_limited_use_test_() ->
{ foreach, fun setup_mock/0, fun cleanup_mock/1,
[fun validate_does_not_fail_if_a_function_is_not_called/0,
fun validate_does_not_fail_if_a_function_is_called_with_wrong_arity/0,
fun validate_does_not_fail_if_an_undefined_function_is_called/0,
fun validate_does_fail_if_a_function_was_called_with_wrong_argument_types/0,
fun validate_does_fail_if_expectation_throws_an_unexpected_exception/0 ]}.
validate_does_not_fail_if_a_function_is_not_called() ->
meck:expect(womble, name, fun() -> "Wellington" end),
?assert(meck:validate(womble)).
validate_does_not_fail_if_a_function_is_called_with_wrong_arity() ->
meck:expect(womble, name, fun() -> "Madame Cholet" end),
?assertError(undef, womble:name(unexpected_arg)),
?assert(meck:validate(womble)).
validate_does_not_fail_if_an_undefined_function_is_called() ->
?assertError(undef, womble:fly()),
?assert(meck:validate(womble)).
validate_does_fail_if_a_function_was_called_with_wrong_argument_types() ->
meck:expect(womble, jump, fun(Height) when Height < 1 ->
ok
end),
?assertError(function_clause, womble:jump(999)),
?assertNot(meck:validate(womble)).
validate_does_fail_if_expectation_throws_an_unexpected_exception() ->
meck:expect(womble, jump, fun(Height) -> 42 = Height end),
?assertError({badmatch, 999}, womble:jump(999)),
?assertNot(meck:validate(womble)).
setup_mock() -> …Run Code Online (Sandbox Code Playgroud) 在我的启动脚本中,我使用以下命令启动 erlang:
erl -args_file vm.args
Run Code Online (Sandbox Code Playgroud)
目前,在尝试运行单元测试时,rebar eunit是否有一种方法可以将自定义运行时参数(例如 -args_file 选项)传递给 rebar 启动的 erlang 进程?我到处搜索文档都无济于事......
我很感激你的帮助。
我有一个 eunit 测试,它生成一个唯一的节点名称并开始分发:
{A,B,C} = now(),
Nodename = list_to_atom(lists:flatten(io_lib:format(
"test-~b-~b-~b@localhost", [A, B, C]))),
{ok, _} = net_kernel:start([Nodename, shortnames]),
Run Code Online (Sandbox Code Playgroud)
只要分布式 Erlang 节点之前在机器上运行过,因此 epmd 仍在运行,这就可以正常工作,但在构建服务器上,我不能假设是这种情况。
我通过将其添加到我的测试中解决了这个问题:
_ = os:cmd("epmd -daemon"),
Run Code Online (Sandbox Code Playgroud)
但感觉就像一个黑客。有没有更好/更好的方法来确保在运行之前启动 epmd net_kernel:start?
我在这个工作项上花了一点时间(这里,我称之为工作项).---如何在哈德森中集成erlang单元测试?
在做了一些研究之后,我觉得我找到了解决这个问题的方法:
请看出这个问题的出口商,请对这些步骤提出一些建议或向我展示合理的方法.
非常感谢 :)
免责声明:这个问题的作者主要具有 Erlang/OTP 的理论知识。
我有一个小型 OTP 应用程序,它myapp/ebin通过open_port(). 当我运行应用程序本身时,一切顺利,可执行文件的端口已成功打开。
但是,当我尝试为应用程序运行单元测试时,依赖于失败的单元测试open_port(),因为当启动EUnit应用程序时尝试在myapp/.eunit/ebin.
如何在不更改应用程序本身的代码的情况下更改该行为?如何使用与运行应用程序本身相同的当前目录来运行 EUnit 测试?(我的意思是,为了能够运行 EUnit 而更改提供可执行文件路径的代码并不是一个好主意)。
编辑:我遵循了 Erlang邮件列表中的建议,但code:priv_dir(myapp_name)返回了{error, bad_name}。
编辑:我可以看到.eunit/包含modulename.beam文件并且ebin/包含modulename.beam文件和modulename_tests.beam文件。现在我完全迷失了。当我运行时make test,rebar运行eunit命令,该命令调用目录modulename_tests.beam中的每个文件,该文件调用目录中的ebin/相应文件(清楚地显示文件是在测试期间执行的)。为什么会这样呢?为什么我们需要从目录运行文件而不是?modulename.beam.eunit/filename:absname("")modulename.beam.eunit/modulename.beam.eunit/ebin/
myapp/ebin为什么我们实际上需要在和中拥有完全相同的 .beam 文件myapp/.eunit/ebin?
PS我看了官方文档,没有找到解决办法。
在调用回调函数后,是否可以检查gen_server的内部状态?我宁愿不在这里更改我的服务器的API.
erlang ×11
eunit ×11
meck ×2
rebar ×2
debugging ×1
erlang-otp ×1
erlang-ports ×1
gen-server ×1
hudson ×1
unit-testing ×1
xml ×1