Class: Minitest::TestTask
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Class Chain: 
          self,
          Rake::TaskLib
         | |
| Instance Chain: 
          self,
          Rake::TaskLib
         | |
| Inherits: | Rake::TaskLib 
 | 
| Defined in: | lib/minitest/test_task.rb | 
Overview
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.createThe most basic and default setup.
Minitest::TestTask.create :my_testsThe most basic/default setup, but with a custom name
Minitest::TestTask.create :unit do |t|
  t.test_globs = ["test/unit/**/*_test.rb"]
  t.warning = false
endCustomize the name and only run unit tests.
NOTE: To hook this task up to the default, make it a dependency:
task default: :unitConstant Summary
- 
    WINDOWS =
    Internal use only
    
 # File 'lib/minitest/test_task.rb', line 44RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ 
Class Method Summary
- 
    
      .create(name = :test, &block)  
    
    Create several test-oriented tasks under #name. 
- 
    
      .new(name = :test)  ⇒ TestTask 
    
    constructor
    Internal use only
    Use .create instead. 
Instance Attribute Summary
- 
    
      #extra_args  
    
    rw
    Extra arguments to pass to the tests. 
- 
    
      #framework  
    
    rw
    The code to load the framework. 
- 
    
      #libs  
    
    rw
    Extra library directories to include. 
- 
    
      #name  
    
    rw
    The name of the task and base name for the other tasks generated. 
- 
    
      #test_globs  
    
    rw
    File globs to find test files. 
- 
    
      #test_prelude  
    
    rw
    Optional: Additional ruby to run before the test framework is loaded. 
- 
    
      #verbose  
    
    rw
    Print out commands as they run. 
- 
    
      #warning  
    
    rw
    Turn on ruby warnings (-w flag). 
Instance Method Summary
- 
    
      #make_test_cmd(globs = test_globs)  
    
    Generate the test command-line. 
- 
    
      #process_env  
    
    Extract variables from the environment and convert them to command line arguments. 
- #define Internal use only
Constructor Details
    .new(name = :test)  ⇒ TestTask 
  
  Use .create instead.
# File 'lib/minitest/test_task.rb', line 115
def initialize name = :test # :nodoc: self.extra_args = [] self.framework = %(require "minitest/autorun") self.libs = %w[lib test .] self.name = name self.test_globs = ["test/**/test_*.rb", "test/**/*_test.rb"] self.test_prelude = nil self.verbose = Rake.application..trace || Rake.verbose == true self.warning = true end
Class Method Details
.create(name = :test, &block)
Create several test-oriented tasks under #name. Takes an optional block to customize variables.
# File 'lib/minitest/test_task.rb', line 50
def self.create name = :test, &block task = new name task.instance_eval(&block) if block task.process_env task.define task end
Instance Attribute Details
#extra_args (rw)
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. 
- A (arg)
- 
quick way to inject an arbitrary argument (eg A=–help). 
See #process_env
# File 'lib/minitest/test_task.rb', line 68
attr_accessor :extra_args
#framework (rw)
The code to load the framework. Defaults to requiring minitest/autorun…
Why do I have this as an option?
# File 'lib/minitest/test_task.rb', line 76
attr_accessor :framework
#libs (rw)
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.
# File 'lib/minitest/test_task.rb', line 83
attr_accessor :libs
#name (rw)
The name of the task and base name for the other tasks generated.
# File 'lib/minitest/test_task.rb', line 88
attr_accessor :name
#test_globs (rw)
File globs to find test files. Defaults to something sensible to find test files under the test directory.
# File 'lib/minitest/test_task.rb', line 94
attr_accessor :test_globs
#test_prelude (rw)
Optional: Additional ruby to run before the test framework is loaded.
# File 'lib/minitest/test_task.rb', line 104
attr_accessor :test_prelude
#verbose (rw)
Print out commands as they run. Defaults to Rake’s trace (-t flag) option.
# File 'lib/minitest/test_task.rb', line 110
attr_accessor :verbose
#warning (rw)
Turn on ruby warnings (-w flag). Defaults to true.
# File 'lib/minitest/test_task.rb', line 99
attr_accessor :warning
Instance Method Details
#define
# File 'lib/minitest/test_task.rb', line 169
def define # :nodoc: 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 in isolation." task "#{name}:isolated" do tests = Dir[*self.test_globs].uniq # 3 seems to be the magic number... (tho not by that much) bad, good, n = {}, [], (ENV.delete("K") || 3).to_i file = ENV.delete "F" times = {} tt0 = Time.now n.threads_do tests.sort do |path| t0 = Time.now output = `#{Gem.ruby} #{make_test_cmd path} 2>&1` t1 = Time.now - t0 times[path] = t1 if $?.success? $stderr.print "." good << path else $stderr.print "x" bad[path] = output end end puts "done" puts "Ran in %.2f seconds" % [ Time.now - tt0 ] if file then require "json" File.open file, "w" do |io| io.puts JSON.pretty_generate times end end unless good.empty? puts puts "# Good tests:" puts good.sort.each do |path| puts "%.2fs: %s" % [times[path], path] end end unless bad.empty? puts puts "# Bad tests:" puts bad.keys.sort.each do |path| puts "%.2fs: %s" % [times[path], path] end puts puts "# Bad Test Output:" puts bad.sort.each do |path, output| puts puts "# #{path}:" puts output end exit 1 end end task "#{name}:deps" => "#{name}:isolated" # now just an alias desc "Run the test suite and report the slowest 25 tests." task "#{name}:slow" do sh ["rake #{name} A=-v", "egrep '#test_.* s = .'", "sort -n -k2 -t=", "tail -25"].join " | " end end
#make_test_cmd(globs = test_globs)
Generate the test command-line.
# File 'lib/minitest/test_task.rb', line 259
def make_test_cmd globs = test_globs tests = [] tests.concat Dir[*globs].sort.shuffle # TODO: SEED -> srand first? tests.map! { |f| %(require "#{f}") } runner = [] runner << test_prelude if test_prelude runner << framework 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
#process_env
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/). 
- A
- 
Any extra arguments. Honors shell quoting. 
Deprecated:
- TESTOPTS
- 
For argument passing, use A.
- N
- 
For parallel testing, use MT_CPU.
- FILTER
- 
Same as TESTOPTS.
# File 'lib/minitest/test_task.rb', line 144
def process_env warn "TESTOPTS is deprecated in Minitest::TestTask. Use A instead" if ENV["TESTOPTS"] warn "FILTER is deprecated in Minitest::TestTask. Use A instead" if ENV["FILTER"] warn "N is deprecated in Minitest::TestTask. Use MT_CPU instead" if ENV["N"] && ENV["N"].to_i > 0 lib_extras = (ENV["MT_LIB_EXTRAS"] || "").split File::PATH_SEPARATOR self.libs[0, 0] = 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["FILTER"]) if ENV["FILTER"] extra_args.concat Shellwords.split(ENV["A"]) if ENV["A"] ENV.delete "N" if ENV["N"] # TODO? RUBY_DEBUG = ENV["RUBY_DEBUG"] # TODO? ENV["RUBY_FLAGS"] extra_args.compact! end