make qunit test order shuffling reproducible
shuffle the tests in the rake task instead of the runner. * the specific order used in a test run is preserved in spec/javascripts/tests.js, so it's easy to tell which tests ran before the failing one. * the PRNG seed is displayed in the log output, and can be re-used via the `seed` environment variable, making test failures dependent on run order much easier to reproduce. refs CNVS-20850 Change-Id: I2538789d8b4102976e456ab4b89924bde0c5b709 Reviewed-on: https://gerrit.instructure.com/55530 Tested-by: Jenkins Reviewed-by: Simon Williams <simon@instructure.com> Reviewed-by: Ethan Vizitei <evizitei@instructure.com> Product-Review: Jeremy Stanley <jeremy@instructure.com> QA-Review: Jeremy Stanley <jeremy@instructure.com>
This commit is contained in:
parent
2112542e53
commit
753570d6eb
|
@ -38,6 +38,17 @@ namespace :js do
|
||||||
build_requirejs_config
|
build_requirejs_config
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def generate_prng
|
||||||
|
if ENV["seed"]
|
||||||
|
seed = ENV["seed"].to_i
|
||||||
|
else
|
||||||
|
srand
|
||||||
|
seed = rand(1 << 20)
|
||||||
|
end
|
||||||
|
puts "--> randomized with seed #{seed}"
|
||||||
|
Random.new(seed)
|
||||||
|
end
|
||||||
|
|
||||||
def build_requirejs_config
|
def build_requirejs_config
|
||||||
require 'canvas/require_js'
|
require 'canvas/require_js'
|
||||||
require 'erubis'
|
require 'erubis'
|
||||||
|
@ -52,7 +63,7 @@ namespace :js do
|
||||||
"spec/plugins/*/javascripts/compiled/#{matcher}"
|
"spec/plugins/*/javascripts/compiled/#{matcher}"
|
||||||
].map{ |file| file.sub(/\.js$/, '').sub(/public\/javascripts\//, '') }
|
].map{ |file| file.sub(/\.js$/, '').sub(/public\/javascripts\//, '') }
|
||||||
File.open("#{Rails.root}/spec/javascripts/tests.js", 'w') { |f|
|
File.open("#{Rails.root}/spec/javascripts/tests.js", 'w') { |f|
|
||||||
f.write("window.__TESTS__ = #{JSON.pretty_generate(tests)}")
|
f.write("window.__TESTS__ = #{JSON.pretty_generate(tests.shuffle(random: generate_prng))}")
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -85,7 +96,7 @@ namespace :js do
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_suite(reporter=nil)
|
def test_suite(reporter=nil)
|
||||||
if test_js_with_timeout(300,reporter) != 0 && !ENV['JS_SPEC_MATCHER']
|
if test_js_with_timeout(300,reporter) != 0 && !ENV['JS_SPEC_MATCHER'] && ENV['retry'] != 'false'
|
||||||
puts "--> Karma tests failed." # retrying karma...
|
puts "--> Karma tests failed." # retrying karma...
|
||||||
raise "Karma tests failed on second attempt." if test_js_with_timeout(400,reporter) != 0
|
raise "Karma tests failed on second attempt." if test_js_with_timeout(400,reporter) != 0
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
tests = shuffle(__TESTS__);
|
tests = __TESTS__;
|
||||||
// tests = __TESTS__
|
|
||||||
// tests = tests.slice(0,50);
|
// tests = tests.slice(0,50);
|
||||||
// console.log(tests);
|
// console.log(tests);
|
||||||
|
|
||||||
|
@ -40,16 +39,3 @@ if(window.__karma__) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fisher-Yates shuffle
|
|
||||||
// http://jsperf.com/fisher-yates-compare-shuffle/12
|
|
||||||
function shuffle(array) {
|
|
||||||
var tmp, current, top = array.length;
|
|
||||||
if (top) while (top) {
|
|
||||||
current = (Math.random() * (top--)) | 0;
|
|
||||||
tmp = array[current];
|
|
||||||
array[current] = array[top];
|
|
||||||
array[top] = tmp;
|
|
||||||
}
|
|
||||||
return array;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue