diff --git a/src/rebar.erl b/src/rebar.erl index b213e6c..833e397 100644 --- a/src/rebar.erl +++ b/src/rebar.erl @@ -369,6 +369,8 @@ eunit [suite[s]=foo] Run eunit tests in foo.erl and no such test exists, run the test whose name starts with bar in the suite's _tests module + [random_suite_order=true] Run tests in a random order, either with + [random_suite_order=Seed] a random seed for the PRNG, or a specific one. ct [suite[s]=] [case=] Run common_test suites diff --git a/src/rebar_eunit.erl b/src/rebar_eunit.erl index e04b28e..3fe1280 100644 --- a/src/rebar_eunit.erl +++ b/src/rebar_eunit.erl @@ -126,6 +126,9 @@ info_help(Description) -> " name starts with bar and, if no such test exists,~n" " run the test whose name starts with bar in the~n" " suite's _tests module)~n" + " random_suite_order=true (Run tests in random order)~n" + " random_suite_order=Seed (Run tests in random order,~n" + " with the PRNG seeded with Seed)~n" " compile_only=true (Compile but do not run tests)", [ Description, @@ -150,7 +153,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 +236,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 == %%