Wie führe ich alle Tests mit minitest aus?

70

Ich habe den Quellcode für ein Projekt heruntergeladen, einen Fehler gefunden und ihn behoben.

Jetzt möchte ich Tests durchführen, um herauszufinden, ob ich etwas kaputt gemacht habe.

Die Tests sind in kleinstem DSL.

Wie führe ich sie alle gleichzeitig aus?

Ich habe nach geeigneten Rechenaufgaben usw. gesucht, aber keine gefunden.

Guai
quelle
1
Haben Sie einzelne Tests durchgeführt? Wenn das so ist, wie?
Andrew Grimm

Antworten:

93

Hier ist ein Link zu Rake :: TestTask .

Auf der Seite finden Sie ein Beispiel für den Einstieg.
Ich werde einen anderen posten, den ich gerade für einen Edelstein verwende:

require 'rake/testtask'

Rake::TestTask.new do |t|
  t.pattern = "spec/*_spec.rb"
end

Wie Sie sehen können, gehe ich davon aus, dass meine Dateien alle enthalten sind /libund dass meine Spezifikationen enthalten sind /specund benannt sindwhatever_spec.rb

Ich hoffe es hilft.

Schlösser
quelle
3
Wenn Sie das, was Sie @locks erwähnen, in ein Rakefile einfügen, können Sie einfach laufenrake test
Nick
Ist es möglich, alle in verschiedenen Verzeichnissen verteilten Tests mit Minitest-Metadaten-Tags auszuführen?
Buurkeey
29

Die Antwort von locks ist besser, aber ich wollte auch darauf hinweisen, dass Sie minitest auch direkt vom Befehl aus ausführen können, wie mit dem Befehl ruby. So führen Sie die Tests in der Datei spec / calculator_spec.rb aus:

$ ruby spec/calculator_spec.rb 

Denken Sie daran, den folgenden Code in die Datei calculator_spec.rb aufzunehmen:

require 'minitest/spec'
require 'minitest/autorun'

Verwenden Sie den folgenden Befehl, um alle Tests im Verzeichnis spec / auszuführen (weitere Informationen finden Sie in diesem Beitrag. Globbing funktioniert nicht mit Minitest - Es wird nur eine Datei ausgeführt ).

$ for file in spec/*.rb; do ruby $file; done 
Befugnisse
quelle
19

Das Rake::TestTaskmacht mehr oder weniger unter der Haube:

ruby -Ilib -e 'ARGV.each { |f| require f }' ./test/test*.rb

Hinweis: lib& test/test*.rb(oben) sind die Standardeinstellungen, aber test& test/*_test.rbsind typischer.

Quelle: rake / testtask.rb in Zeile 169 von c34d9e0

Wenn Sie JRuby verwenden und die Startkosten nicht zweimal bezahlen möchten (einmal für Rake und dann einmal für den von Rake gestarteten Unterprozess), verwenden Sie einfach diesen Befehl.

Das Ö
quelle
Der Dokumentationslink ist hier defekt.
Adam Spires
So komisch wie ./test/*_test.rbdas geht aber nicht test/*_test.rb. Sie können auch verwenden, ruby -I lib -e 'ARGV.each { |f| load f }' test/*_test.rbdie mit beiden ./test/*_test.rbund test/*_test.rb
mbigras
14

Hier ist mein gesamtes rakefile, das ich in mein oberstes Verzeichnis gestellt habe:

task :default => :test
task :test do
  Dir.glob('./test/*_test.rb').each { |file| require file}
end

Um alle meine Testdateien gleichzeitig auszuführen, tippe ich einfach rake. Das ist es!

require 'minitest/autorun'Stellen Sie sicher, dass sich oben in jeder Ihrer Minitest-Dateien befindet. Dir.glob funktioniert definitiv mit Minitest.

Um eine hübsche, farbige Minitest-Ausgabe mit Namen aller meiner Testmethoden zu erhalten, habe ich die Datei minitest_helper.rbin meinem Verzeichnis / test. (Musste die Edelstein-Minitest-Reporter installieren):

require 'minitest/reporters'
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
require 'minitest/autorun'

Ich musste nur require_relative './minitest_helper'oben in jeder meiner Testdateien.

Raymond Gan
quelle
Dies ist schön, bis auf die Tatsache, dass Sie Bundler verwenden ... in diesem Fall wird jede erforderliche Anweisung gefüllt, da sich die Edelsteine ​​nicht auf dem befinden $LOAD_PATH.
Pablo Olmos de Aguilera C.
6

Dies kann auch über ein Makefile erfolgen.

default:
  echo "Dir.glob('./test/*_test.rb').each { |file| require file}" | ruby

Beim Ausführen makewerden alle Ihre Tests ausgeführt.

dkinzer
quelle
4

$ rake test lief aus der Schienen 5.0 Box.

thedanotto
quelle
1
Dies führt nicht meine Systemtests aus, sondern nur die Komponententests.
Taylored Websites
3

Eine andere Möglichkeit, dies nur mit Rubys Standardbibliothek zu tun, ist mit Dir.glob. In einer Ruby-Datei würde dies folgendermaßen aussehen:

require "minitest/autorun"

Dir.glob("**/*Test.rb") { |f| require_relative(f) }

Oder über die Befehlszeile können Sie diesen Befehl verwenden:

ruby -I . -e "require 'minitest/autorun'; Dir.glob('**/*Test.rb') { |f| require(f) }"

Dir.glob('**/*Test.rb')Durchsucht rekursiv das aktuelle Verzeichnis nach passenden Dateien *Test.rb, sodass wir einfach alle diese Dateien und / requireoder require_relativesie nehmen. Über die Befehlszeile require_relativeschlägt fehl, daher verwenden wir require, fügen aber zuerst das aktuelle Verzeichnis zum $LOAD_PATHThrough hinzu-I .

Justin
quelle
1

Mir ist klar, dass dies eine sehr alte Frage ist, die jedoch rake testin Rails 4.2 für mich funktioniert, einschließlich der zu testenden Dateien / sowie der getesteten / integrierten /, test / unit / usw.

David Hempy
quelle
-1

Wenn Sie keinen Rechen haben, versuchen Sie Folgendes:

http://blog.gingergriffis.com/post/85871430778/ruby-how-to-run-all-tests-in-a-directory

# run_all_tests.rb

require 'find'
require 'optparse'

options = {
  :exclude => [],
}

OptionParser.new do |opts|
  opts.on('--exclude Comma Separated String',
          'Test scripts to exclude') do |css|
    options[:exclude] = css.split(',')
  end
end.parse!

commands = []

Find.find(File.dirname(__FILE__)) do |path|
  Find.prune if path =~ /#{__FILE__}$/
    if !File.directory?(path) && (path =~ /(.*)\.rb$/)
      if options[:exclude].none? {|e| path.include?(e)}
        commands << "ruby #{path}"
      end
    end
end
command_string = commands.join(" && ")
exec(command_string)
Sedona
quelle
Dies ist sehr kostspielig, da für jeden Test, den Sie ausführen möchten, ein Ruby-Interpreter erforderlich ist. Es ist auch viel Code für eine sehr einfache Sache. Schauen Sie sich Theos Lösung an. Es macht genau das Gleiche, effizienter und Sie brauchen es auch nicht rake.
Overbryd