wake-up-neo.com

Wie richte ich MiniTest ein?

Ich bin ein relativ unerfahrener Tester, habe aber versucht, mich bei TDD in Rails zu verbessern.

RSpec funktioniert gut, aber meine Tests sind ziemlich langsam. Ich habe gehört, dass MiniTest viel schneller ist, und der MiniTest/Spec DSL sieht ziemlich ähnlich aus, wie ich es gewohnt bin, mit RSpec zu arbeiten, also dachte ich, ich würde es versuchen.

Im Web konnte ich jedoch keine Anleitung zum Einrichten und Ausführen von Minitest finden. Ich habe aus dem RSpec-Buch gelernt, wie man testet, und ich habe keine Ahnung, wie Test :: Unit oder MiniTest funktionieren sollen. Ich habe das Juwel in meiner Gemdatei, ich habe ein paar einfache Tests geschrieben, aber ich habe keine Ahnung, wo ich sie ablegen soll oder wie ich sie ausführen soll. Ich denke, dies ist eines dieser Dinge, die so offensichtlich sind, dass sich niemand die Mühe gemacht hat, es aufzuschreiben ...

Kann mir jemand erklären, wie man einige Minitest-/Spezifikationsdateien einrichtet und zum Laufen bringt, damit ich die Leistung mit Rspec vergleichen kann?

EDIT

Im Einzelnen sind dies die Grundlagen, die ich am meisten wissen muss:

  1. Benötigen Sie eine test_helper-Datei (wie spec_helper) und wenn ja, wie erstellen Sie sie?
  2. Wie läufst du minitest? Es scheint kein Äquivalent zu rspec spec oder rspec path/to/file_spec.rb zu geben. Was fehle ich?

Vielen Dank!

47
Andrew

Diese Frage ähnelt Wie werden alle Tests mit Minitest ausgeführt?

Verwenden Sie Ruby 1.9.3 und Rake 0.9.2.2, und geben Sie ein Verzeichnis wie folgt an:

Rakefile
lib/alpha.rb
spec/alpha_spec.rb

So könnte alpha_spec.rb aussehen:

require 'minitest/spec'
require 'minitest/autorun'  # arranges for minitest to run (in an exit handler, so it runs last)

require 'alpha'

describe 'Alpha' do
  it 'greets you by name' do
    Alpha.new.greet('Alice').must_equal('hello, Alice')
  end
end

Und hier ist Rakefile

require 'rake'
require 'rake/testtask'

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

Du kannst rennen

  • alle Tests: rake test
  • ein Test: Ruby -Ilib spec/alpha_spec.rb

Ich weiß nicht, ob es üblich ist, einen spec_helper.rb mit Minitest zu verwenden. Es scheint keine bequeme Methode zu geben, eine zu laden. Fügen Sie dies dem Rakefile hinzu:

require 'rake'
require 'rake/testtask'

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

Dann kann spec/spec_helper.rb verschiedene redundante Dinge enthalten:

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

Und spec/alpha_spec.rb ersetzt die überflüssigen Teile durch:

require 'spec_helper'
  • alle Tests: rake test
  • ein Test: Ruby -Ilib -Ispec spec/alpha_spec.rb
40
Patrick

Beachten Sie, dass watchr oder spork keine Voraussetzungen für die Durchführung von Tests sind. Sie sind eine bequeme Möglichkeit, Autotests durchzuführen. Die grundlegendste Möglichkeit, eine Reihe von MiniTest-Tests auszuführen, ist Ruby selbst:

$ Ruby myfileoftests.rb
4
cczona

Welche Version von Ruby verwendest du?

In meinem Verständnis hat 1.9 MiniTest eingeführt, das Test::Unit vollständig durch eine abwärtskompatible API ersetzt. Wenn Sie also auf 1.9 sind und Ihre Rails-App auf Test::Unit verweist, wird MiniTest bereits verwendet.

Schauen Sie sich Ihre Ruby-Quelle an - test/unit.rb für 1.9.2 hat folgende Anforderungen:

require 'minitest/unit'
require 'test/unit/assertions'
require 'test/unit/testcase'

Und test/unit/assertions enthält MiniTest::Assertions.


Ihre Tests schneller laufen zu lassen, ist eine ganz andere dunkle Kunst. Schau dir spork und watchr an. Erstere hält Ihre App initialisiert, lädt vor jeder Ausführung Ihrer Testsuite geänderte Dateien und Gabeln neu. Letztere überwacht Dateien in Ihrem Repo auf Änderungen und führt automatisch die zugehörigen Testfälle aus.

Zusammen ergeben sie ein ziemlich mittleres TDD-Setup. Sie schreiben einen Testfall für Ihr neues Modell, der automatisch ausgeführt wird und fehlschlägt. Wenn Sie dann das zugehörige Modell speichern, wird der Testfall sehr schnell erneut ausgeführt. Sie erhalten nahezu sofort Feedback darüber, ob Sie rot/grün sind.

Sie sind beide ein bisschen schwierig, sich zusammen zu stellen und sich gut zu benehmen. Wenn Sie also nicht weiterkommen, sollten Sie noch ein paar Fragen beantworten.

Viel Glück!

4
nfm

Schauen Sie sich das an - Video zum Einstieg für Minitest-Rails . Es durchläuft den Prozess zum Einrichten von Minitest für eine Rails-App.

http://www.youtube.com/watch?v=xA2f2zBNvsc

Die exemplarische Vorgehensweise zeigt, wie eine Hilfedatei erstellt wird und wie die Tests mithilfe einer Rake-Task ausgeführt werden. Wenn Sie einen bestimmten Test ausführen möchten, können Sie Folgendes tun:

Ruby -Itest test/models/user_test.rb
3
blowmage

Hier ist meine gesamte rakefile, die 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 Minitest-Dateien gleichzeitig auszuführen, tippe ich einfach rake. Das ist es!

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

Um eine hübsche, farbige Minitest-Ausgabe mit den Namen aller meiner Testmethoden zu erhalten, habe ich die Datei minitest_helper.rb in meinem/test-Verzeichnis. (Musste die Juwel-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.

1
Raymond Gan

Neuere Versionen von RSpec (seit Version 2.8 im Januar 2012 veröffentlicht) haben eine drastische Geschwindigkeitssteigerung zur Folge. Hier ist eine Untersuchung der Leistungsunterschiede und ein Vergleich mit MiniTest.

Ich fand auch this screencast von Ryan Bates eine hervorragende Einführung in MiniTest. Beachten Sie, dass dies eines der Profivideos ist, und Sie müssen es abonnieren, um es anzusehen.

1
SnapShot

Patrick schrieb eine wirklich gute Erklärung und ein gutes Beispiel. Für zukünftige Leser ist nur zu beachten, dass die globalen Erwartungen jetzt abgeschrieben und in Minitest 6 entfernt werden. Dies erfordert eine fast triviale Änderung der Verpackung der von Ihnen getesteten Sache in einem Aufruf an expect.

require 'minitest/spec'
require 'minitest/autorun'  # arranges for minitest to run (in an exit handler, so it runs last)

require 'alpha'

describe 'Alpha' do
  it 'greets you by name' do
    expect(Alpha.new.greet('Alice')).must_equal('hello, Alice')
  end
end
0
Chris McAnally