开发者

run eunit test from console using erl -noshell

I wanted to run the following eunit test command from console

eunit:test([test_module, [verbose]).

I tried this, but seems not working erl -noshell -pa ./ebin -s eunit test test_module verbose -init stop

~/uid_server$erl -noshell -pa ./ebin -s eunit test test_module verbose -init stop
undefined
*** test module not found **开发者_StackOverflow社区*
::test_module

=======================================================
  Failed: 0.  Skipped: 0.  Passed: 0.
One or more tests were cancelled.

Do you know how to pass not a simple arguments properly from console?


Your parameters look wrong. This should work:

erl -noshell -pa ebin -eval "eunit:test(test_module, [verbose])" -s init stop

-s can only run functions without arguments by specifying the module and function name (for example init and stop to execute init:stop()).

You can also pass one list to a function of arity 1 like this:

-s foo bar a b c

would call

foo:bar([a,b,c])

All the parameters are passed as a list of atoms only (even when you try to use some other characters, such as numbers, they are converted to atoms).

So since you want to pass two params and not only atoms if you want to run eunit:test/2 you'd have to use -eval which takes a string containing Erlang code as an argument. All -eval and -s functions are executed sequentially in the order they are defined.

Also, make sure you have your test code in ./ebin as well (otherwise write -pa ebin test_ebin where test_ebin is where your test code is).


You can also use rebar...

  • Get rebar by cd'ing to your project directory and typing the following:

    curl http://cloud.github.com/downloads/basho/rebar/rebar -o rebar

    chmod u+x rebar

  • Add the following to your module under test, right after last export:

    -ifdef(TEST).

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

    -endif.

  • Next, add your tests at the bottom of your module, wrapped in an ifdef like so:

    -ifdef(TEST).

    simple_test() ->

        ?assertNot(true).

    -endif.

  • Lastly, run rebar from your shell like so:

    ./rebar compile eunit


you can try quote parameters instead of listing. erl -noshell -pa ./ebin -s eunit test "test_module verbose" -init stop


More than eight years passed since the question, but there's still a nice solution not mentioned in the previous answers.

Once you are using EUnit, you can leverage from some of it's "automagic" features. One of them is an automatic export of the test/0 function, containing all the tests for the module.

So, if you are writing your tests alongside with the source code in the same module, all you have to do is:

$ erl -noshell -run your_module test -run init stop

If you are writing the tests in a separated, dependent module (as you should), you have to point to that module:

$ erl -noshell -run your_module_tests test -run init stop

All this will work fine, but the test won't be run in verbose mode as the OP required, but this is simple to solve with the EUNIT environment variable set to verbose.

Final version:

$ EUNIT=verbose erl -noshell -run your_module_tests test -run init stop

Have fun with Erlang and EUnit!


I use this script: https://github.com/lafka/dotconfig/blob/master/bin/eunit-module to run eunit on specific modules.

Example:

eunit-module <module> src ebin -I deps   

That will do a couple of things:

  • Arg #2 is the directory where .erl resides
  • Arg #3 is the directory to output the compiled .beam
  • Arg #4++ is all the additional paths to add to your code path
  • Using -I specifies additional code paths AND where to look for files referenced with -include_lib
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜