Add random_suite_order option to eunit command

Option takes either 'true' or a numeric seed value. If true is passed, a
random seed is generated and used. The numeric seed value is for
repeatability.

The idea here is to root out test suites that are order dependant, or
that fail in the presence of certain orderings.
This commit is contained in:
Andrew Thompson 2014-02-05 14:41:25 -05:00
parent fa679b4343
commit 03da5e0be0

View file

@ -150,7 +150,7 @@ run_eunit(Config, CodePath, SrcErls) ->
AllBeamFiles),
OtherBeamFiles = TestBeamFiles --
[filename:rootname(N) ++ "_tests.beam" || N <- AllBeamFiles],
ModuleBeamFiles = BeamFiles ++ OtherBeamFiles,
ModuleBeamFiles = randomize_suites(Config, BeamFiles ++ OtherBeamFiles),
%% Get modules to be run in eunit
AllModules = [rebar_utils:beam_to_mod(?EUNIT_DIR, N) || N <- AllBeamFiles],
@ -233,6 +233,33 @@ get_suites(Config) ->
Suites
end.
%%
%% == randomize suites ==
%%
randomize_suites(Config, Modules) ->
case rebar_config:get_global(Config, random_suite_order, undefined) of
undefined ->
Modules;
"true" ->
Seed = crypto:rand_uniform(1, 65535),
randomize_suites1(Modules, Seed);
String ->
try list_to_integer(String) of
Seed ->
randomize_suites1(Modules, Seed)
catch
error:badarg ->
?ERROR("Bad random seed provided: ~p~n", [String]),
?FAIL
end
end.
randomize_suites1(Modules, Seed) ->
random:seed(35, Seed, 1337),
?CONSOLE("Randomizing suite order with seed ~b~n", [Seed]),
[X||{_,X} <- lists:sort([{random:uniform(), M} || M <- Modules])].
%%
%% == get matching tests ==
%%