From 03da5e0be061dfed832ca7eaaf5998fa7cf27640 Mon Sep 17 00:00:00 2001 From: Andrew Thompson Date: Wed, 5 Feb 2014 14:41:25 -0500 Subject: [PATCH] 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. --- src/rebar_eunit.erl | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/rebar_eunit.erl b/src/rebar_eunit.erl index e04b28e..323e199 100644 --- a/src/rebar_eunit.erl +++ b/src/rebar_eunit.erl @@ -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 == %%