Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to automate module reloading when unit testing with Erlang?

I'm using Emacs and trying to get my unit testing work flow as automated as possible. I have it set up so it is working but I have to manually compile my module under test or the module containing the tests before the Erlang Shell recognizes my changes.

I have two files mymodule.erl and mymodule_tests.erl. What I would like to be able to do is:

  1. Add test case to mymodule_tests
  2. Save mymodule_tests
  3. Switch to the Erlang Shell
  4. Run tests with one line, like eunit:test(mymodule) or mymodule_tests:test()
  5. Have Erlang reload mymodule and mymodule_tests before actually performing the tests

I have tried writing my own test method but it doesn't work.

-module (mytests).
-export([test/0]).

-import(mymodule).
-import(mymodule_tests).
-import(code).

test() ->
    code:purge(mymodule),
    code:delete(mymodule),
    code:load_file(mymodule),
    code:purge(mymodule_tests),
    code:delete(mymodule_tests),
    code:load_file(mymodule_tests),
    mymodule_tests:test().

I have also tried by putting -compile(mymodule). into mymodule_tests to see if I could get mymodule to automatically reload when updating mymodule_tests but to no avail.

I have also googled quite a bit but can't find any relevant information. As I'm new to Erlang I'm thinking that I'm either searching for the wrong terms, e.g. erlang reload module, or that you are not supposed to be able reload other modules when compile another module.

like image 679
Robert Höglund Avatar asked Dec 05 '10 11:12

Robert Höglund


Video Answer


2 Answers

Maybe the Erlang make can help you.

make:all([load]).

Reading from the doc:

This function first looks in the current working directory for a file named Emakefile (see below) specifying the set of modules to compile and the compile options to use. If no such file is found, the set of modules to compile defaults to all modules in the current working directory.

And regarding the "load" option:

Load mode. Loads all recompiled modules.

There's also a make:files/1,2 which allows you to specify the list of modules to check.

like image 81
Roberto Aloi Avatar answered Oct 01 '22 00:10

Roberto Aloi


Have you tried using l(mymodule). to reload the module after it's been compiled?

like image 27
OJ. Avatar answered Sep 30 '22 23:09

OJ.