原因:在 erl 控制台中运行常见测试时 undef [Erlang]

如何解决原因:在 erl 控制台中运行常见测试时 undef [Erlang]

我正在运行应用程序,并在交互式控制台中尝试运行位于 test/common 目录中的常见测试套件:

ct:run("test/common").

但是我得到了一堆错误

Reason: undef

并且所有测试都失败了。 我试图从 linux shell 运行它们

ct_run -dir test/common

或者像这样:

ct_run -boot start_sasl -spec test/common/app_ct.spec -erl_args -config env/dev.config

结果相同。

但是当我使用 rebar(第二个版本,而不是 rebar3)运行它们时

rebar ct

一切正常,测试通过。但是编译应用程序并启动它需要太多时间。

在 rebar.config 我有

{ct_dir,"test/common"}.
{ct_log_dir,"test/logs"}.
{ct_extra_params,"-boot start_sasl -pa deps/*/ebin -pa ebin -spec test/common/app_ct.spec -erl_args -config env/dev.config"}.

在 test/common/app_ct.spec 中我有

{verbosity,100}.
{init,{eval,[{application,ensure_all_started,[app]},{timer,sleep,[30000]}]}}.
{alias,common,"./test/common/"}.
{suites,"",[app_srv_SUITE,app_client_SUITE]}.

如何使用 ct:run("test/common") 从 erl 控制台运行测试?

我的目标是能够单独重新编译单个测试文件并从工作应用程序控制台运行测试,而无需停止和重新编译所有应用程序。

我重新编译了单一的测试模块,没有出现这样的问题:

c("test/common/new_mod_SUITE.erl",[{i,"include"},{i,"deps"},{outdir,"test/common"}]). 

但在那之后我仍然无法运行测试。

解决方法

首先,需要确保所有测试都已编译,并且它们位于作为参数放入 ct:run/1 的文件夹中。如果只需要从特定文件夹运行一个测试,可以使用 ct:run/2。如果需要从特定文件夹运行特定测试用例,可以使用特定文件夹ct:run/3。示例:

1> ct:run("test/common").
2> ct:run("test/common","some_SUITE").

但是我建议使用 rebar3,在 rebar3 中添加了像 --dir 这样的选项,并且可以像这样运行来自特定文件夹的测试:

$ ./rebar3 ct --dir="test/common"
,

这可能无济于事,但这是我使用 rebar3 时发生的情况:

~/erlang_programs/myrebar/myapp$ ls
LICENSE     _build      rebar.lock  test
README.md   rebar.config    src

~/erlang_programs/myrebar/myapp$ cd src
~/erlang_programs/myrebar/myapp/src$ ls
a.erl       myapp_app.erl   rebar.lock
myapp.app.src   myapp_sup.erl

~/erlang_programs/myrebar/myapp/src$ cat a.erl
-module(a).
-compile(export_all).
%%-include("eunit.hrl").


hello() -> io:format("hello").

~/erlang_programs/myrebar/myapp/src$ cd ../test
~/erlang_programs/myrebar/myapp/test$ ls
a_SUITE.erl

~/erlang_programs/myrebar/myapp/test$ cat a_SUITE.erl 
-module(a_SUITE).
-compile(export_all).

all() -> [go].

go(_Config) ->
   1 = 1. 

~/erlang_programs/myrebar/myapp/test$ cd ..
~/erlang_programs/myrebar/myapp$ rebar3 compile
===> Verifying dependencies...
===> Compiling myapp
~/erlang_programs/myrebar/myapp$ rebar3 shell
===> Verifying dependencies...
===> Compiling myapp
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
1> ===> The rebar3 shell is a development tool; to deploy applications in production,consider using releases (http://www.rebar3.org/docs/releases)
===> Booted myapp
 
1> ct:run("test").

Common Test: Running make in test directories...
Recompile: a_SUITE
a_SUITE.erl:2: Warning: export_all flag enabled - all functions will be exported

CWD set to: "/Users/7stud/erlang_programs/myrebar/myapp/ct_run.nonode@nohost.2021-02-14_14.26.08"

TEST INFO: 1 test(s),1 case(s) in 1 suite(s)

Testing myrebar.myapp: Starting test,1 test cases
Testing myrebar.myapp: TEST COMPLETE,1 ok,0 failed of 1 test cases

Updating /Users/7stud/erlang_programs/myrebar/myapp/index.html ... done
Updating /Users/7stud/erlang_programs/myrebar/myapp/all_runs.html ... done
{1,{0,0}}
2> 

然后在退出shell后:

~/erlang_programs/myrebar/myapp$ 

~/erlang_programs/myrebar/myapp$ rebar3 ct
===> Verifying dependencies...
===> Compiling myapp
test/a_SUITE.erl:2: Warning: export_all flag enabled - all functions will be exported

===> Running Common Test suites...
%%% a_SUITE: .
All 1 tests passed.

~/erlang_programs/myrebar/myapp$ 

我没有碰rebar.config,它是rebar3默认生成的:

{erl_opts,[debug_info]}.
{deps,[{eleveldb,"2.2.20"}]
}.

{shell,[
  % {config,"config/sys.config"},{apps,[myapp]}
]}.

当您在 shell 中时,我会尝试打印您当前的工作目录:

2> pwd().
/Users/7stud/erlang_programs/myrebar/myapp
ok

然后尝试使用该目录的完整路径或相对路径,例如:

"./test/common"
"Users/../../test/common"

然后,我会将除一个之外的所有 *_SUITE.erl 文件移动到您的应用程序之外的目录中,并且只处理一个测试文件。然后,我会删除所有配置文件内容并重试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?