class Minitest::TestTask
Minitest::TestTask
is a rake helper that generates several rake tasks under the main test task's name-space.
task <name> :: the main test task task <name>:cmd :: prints the command to use task <name>:deps :: runs each test file by itself to find dependency errors task <name>:slow :: runs the tests and reports the slowest 25 tests.
Examples:
Minitest::TestTask.create
The most basic and default setup.
Minitest::TestTask.create :do_the_thing
The most basic/default setup, but with a custom name
Minitest::TestTask.create :spec do |t| t.test_globs = ["spec /*_spec.rb"] t.libs << "../dependency/lib" end
Customize the name, dependencies, and use a spec directory instead of test.
Attributes
Extra arguments to pass to the tests. Defaults empty but gets populated by a number of enviroment variables:
+ N (-n flag) a string or regexp of tests to run. + X (-e flag) a string or regexp of tests to exclude. + TESTOPTS - extra stuff. For compatibility? I guess? + A (arg) - quick way to inject an arbitrary argument (eg A=–help)
The code to load the framework. Defaults to requiring minitest/autorun…
Why do I have this as an option?
Extra library directories to include. Defaults to %w[lib test .]. Also uses $MT_LIB_EXTRAS allowing you to dynamically override/inject directories for custom runs.
The name of the task and base name for the other tasks generated.
File
globs to find test files. Defaults to something sensible to find test files under the test directory.
Optional: Additional ruby to run before the test framework is loaded.
Print out commands as they run. Defaults to Rake's trace (-t flag) option.
Turn on ruby warnings (-w flag). Defaults to true.
Public Class Methods
Create several test-oriented tasks under name
. Takes an optional block to customize variables.
# File lib/minitest/test_task.rb, line 41 def self.create name = :test, &block task = new name task.instance_eval(&block) if block task.process_env task.define task end
Public Instance Methods
Create the tasks.
# File lib/minitest/test_task.rb, line 147 def define default_tasks = [] desc "Run the test suite. Use N, X, A, and TESTOPTS to add flags/args." task name do ruby make_test_cmd, verbose:verbose end desc "Print out the test command. Good for profiling and other tools." task "#{name}:cmd" do puts "ruby #{make_test_cmd}" end desc "Show which test files fail when run alone." task "#{name}:deps" do tests = Dir[*self.test_globs].uniq null_dev = WINDOWS ? "> NUL 2>&1" : "> /dev/null 2>&1" tests.each do |test| cmd = make_test_cmd test if system "ruby #{cmd} #{null_dev}" then puts "# good: #{test}" else puts "# bad: #{test}" puts " ruby #{cmd}" end end end desc "Show bottom 25 tests wrt time." task "#{name}:slow" do sh ["rake #{name} TESTOPTS=-v", "egrep '#test_.* s = .'", "sort -n -k2 -t=", "tail -25"].join " | " end default_tasks << name desc "Run the default task(s)." task :default => default_tasks end
Generate the test command-line.
# File lib/minitest/test_task.rb, line 195 def make_test_cmd globs = test_globs tests = [] tests.concat Dir[*globs].shuffle tests.map! { |f| %(require "#{f}") } runner = [] runner << framework runner << test_prelude if test_prelude runner.concat tests runner = runner.join "; " args = [] args << "-I#{libs.join(File::PATH_SEPARATOR)}" unless libs.empty? args << "-w" if warning args << '-e' args << "'#{runner}'" args << '--' args << extra_args.map(&:shellescape) args.join " " end
Extract variables from the environment and convert them to command line arguments. See extra_args
.
Environment Variables:
+ MT_LIB_EXTRAS - Extra libs to dynamically override/inject for custom runs. + N - Tests to run (string or regexp) + X - Tests to exclude (string or regexp) + TESTOPTS - deprecated, use A + A - Any extra arguments. Honors shell quoting.
# File lib/minitest/test_task.rb, line 126 def process_env warn "TESTOPTS is deprecated in Minitest::TestTask. Use A instead" if ENV["TESTOPTS"] lib_extras = (ENV["MT_LIB_EXTRAS"] || "").split File::PATH_SEPARATOR self.libs.prepend lib_extras extra_args << "-n" << ENV["N"] if ENV["N"] extra_args << "-e" << ENV["X"] if ENV["X"] extra_args.concat Shellwords.split(ENV["TESTOPTS"]) if ENV["TESTOPTS"] extra_args.concat Shellwords.split(ENV["A"]) if ENV["A"] # TODO? RUBY_DEBUG = ENV["RUBY_DEBUG"] # TODO? ENV["RUBY_FLAGS"] extra_args.compact! end