#!/bin/bash # # If you suspect that a spec becomes flaky on slow machines: # # ./script/rspec-slow-repeat 10 spec/system/some_flaky_spec.rb # # You can use the resulting pass rate to asses if your code changes fixed it # or not. In the end I would run a spec 100 times to be sure it's stable. function finish() { echo "Exiting..." pkill -P $$ if [ "$pass_rate" -lt 100 ]; then echo "Check tmp/rspec.log for details." exit 1 else exit 0 fi } trap finish SIGINT if [ "$#" -lt 1 ]; then echo "Usage: $0 [rspec params]" echo "Example: $0 30 spec/system/admin/order_cycles/simple_spec.rb:202" exit 1 fi n="$1" passed=0 # Check via uname the environment we are running in to get the number of cores if [[ "`uname`" == "Darwin" ]]; then processors="`sysctl -n hw.ncpu.`" else processors="`cat /proc/cpuinfo | grep -c processor`" fi echo "Running $n times with $processors cores" # The purpose here is to occupy the CPU (yes command is not multi-threaded and it occupies only one core) # Start one process for each core, and then simulating a very busy CI environment with a 100% CPU load # increasing the chance of race conditions when executing specs. for i in `seq $processors`; do yes > /dev/null & done export RUBY_DEBUG_ENABLE=0 export SPRING_QUIET=true for i in `seq "$n"`; do if ./bin/rspec "${@:2}" >> tmp/rspec.log; then echo "Pass." (( passed++ )) else echo " !!! Fail !!!" fi done pass_rate="$(( passed * 100 / n))" echo "$passed of $n passed ($pass_rate%)" finish