Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EUnit vs. Common Test

Tags:

erlang

I am new to Erlang. It has 2 test frameworks: EUnit and Common Test. I am confused when to use one over another. Can someone explain to me what are the advantages of EUnit over Common Test, and vice versa. Seem Common Test can do everything EUnit can do and much more, not sure what I should use EUnit. Thanks!

like image 442
user342673 Avatar asked Aug 03 '13 09:08

user342673


People also ask

What is a common test?

The common test approach relies upon the examinations being compared having been taken by a sample of students, who have also all taken some other common test. The common test results are used as the basis for comparing the standards of different examinations.

What is EUnit?

EUnit is an unit testing framework specifically designed to test model management tasks, based on EOL and the Ant workflow tasks. It provides assertions for comparing models, files and directories.


2 Answers

Learn you some erlang (one of the best online resources for erlang, besides the official doc) explains both methods quite well:

  • EUnit
  • Common Test

As Pascal pointed out, EUnit is best used in white-box testing, more like internal function-by-function unit testing, light integration tests.

Common Test does the more heavy lifting: integration & system testing, black-box kind of stuff. It's also more complex, of course, and much more powerful.

While you're at it, you might try Dialyzer, another integrated testing tool in Erlang/OTP , which is great in locating dead or unreachable code, logical & type errors (it's a static type analyser). Again, learn you some erlang provides a nice introduction to it: Dialyzer.

Oh, by the way, if you chose to put the EUnit tests in separate files (which is perfectly possible), you won't be able to test unexported functions (that's expected). What's also expected is that Common Test does not test unexported functions: otherwise it wouldn't be a black-box testing tool (maybe a cheating one).

like image 66
Berzemus Avatar answered Oct 22 '22 11:10

Berzemus


Eunit is really simple and fit very well for module test or library test at white box level. It is integrated to rebar.

Common Test is more oriented for black box testing and application and system of application test. It comes with test coverage very easily.

Edit (after Andy comment):

It is right that you can use Common test for unitary white box test, as well as it is right that you can leverage eunit to some application test using fixtures.

However eUnit is very handy for simple unitary test: you write a function myFun, you add a test function myFun_test or a test generator myFun_test_ (useful to test many patterns even is some test fails in the middle) in your test module and that's it. You can run it as often as you want (no history of test).

Common test asks you to list each test case in the all function or in a group. As far as I know it has not test generator so it is less easy to go through all test patterns of each function. It is why I think it is less adapted to unitary white box tests. On the other hand, the init_per_testcase, init_per_group ... are much more flexible than eunit fixtures to organize the tests when they need some application context to run. Common Test also keeps an history of all tests done in the log directory, It is nice, but I suggest to limit the number of run to keep it useful.

EDIT:

To avoid the problem of not exported functions, for both eunit and common test, it is possible to use defines. for example in rebar.config (because I use separate files for eunit tests):

{eunit_compile_opts, [{d,'EUNIT_TEST',true}]}.
{erl_opts, [debug_info, warn_export_all]}.

and in a module, if it is necessary:

%% export all functions when used in eunit context
-ifdef(EUNIT_TEST).
-compile(export_all).
-endif.

You can verify that it only modify the compiled code for eunit

D:\git\helper>rebar clean eunit compile
==> helper (clean)
==> helper (eunit)
Compiled test/help_list_tests.erl
Compiled test/help_ets_tests.erl
Compiled test/help_num_tests.erl
Compiled src/help_ets.erl
Compiled src/help_list.erl
Compiled src/helper.erl
src/help_num.erl:6: Warning: export_all flag enabled - all functions will be exported
Compiled src/help_num.erl
Compiled src/help_code.erl
  All 31 tests passed.
Cover analysis: d:/git/helper/.eunit/index.html
==> helper (compile)
Compiled src/help_ets.erl
Compiled src/help_list.erl
Compiled src/helper.erl
Compiled src/help_num.erl
Compiled src/help_code.erl
like image 41
Pascal Avatar answered Oct 22 '22 11:10

Pascal