web-dev-qa-db-ja.com

MiniTestの設定方法は?

私はかなり初心者のテスターですが、RailsのTDDでより良くなるように努めています。

RSpecはうまく機能しますが、私のテストはかなり遅いです。 MiniTestの方がはるかに高速であると聞いたことがあります。MiniTest/ Spec DSLは、RSpecでの作業に慣れている方法とかなり似ているので、試してみようと思いました。

ただし、Minitestのセットアップ方法と実行方法のウォークスルーを提供するものをWeb上で見つけることはできませんでした。 RSpecの本からテストする方法を学びましたが、Test :: UnitまたはMiniTestがどのように機能するはずなのかわかりません。 gemfileにgemがあり、いくつかの簡単なテストを作成しましたが、どこに配置するか、またはどのように実行するかわかりません。これは、誰も気にせずに書き留めておいたことが明らかなものの1つだと思います...

誰かがいくつかのMinitest/specファイルをセットアップして実行する方法を説明して、パフォーマンスをRspecと比較できますか?

[〜#〜]編集[〜#〜]

具体的には、これらは私が最も知っておくべき基本です:

  1. Test_helperファイル(spec_helperなど)が必要ですか?必要な場合、どのように作成しますか?
  2. minitestをどのように実行しますか?rspec specまたはrspec path/to/file_spec.rbに相当するものがないようですが、何が欠けていますか?

ありがとう!

47
Andrew

この質問は minitestですべてのテストを実行する方法に似ていますか?

Ruby 1.9.3およびRake 0.9.2.2を使用すると、次のようなディレクトリレイアウトが与えられます。

Rakefile
lib/alpha.rb
spec/alpha_spec.rb

alpha_spec.rbは次のようになります。

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

そして、これがRakefileです

require 'rake'
require 'rake/testtask'

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

あなたは走ることができます

  • すべてのテスト:rake test
  • 1つのテスト:Ruby -Ilib spec/alpha_spec.rb

ミニテストでspec_helper.rbを使用するのが一般的であるかどうかはわかりません。ロードするための便利な方法はないようです。これをRakefileに追加します。

require 'rake'
require 'rake/testtask'

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

次に、spec/spec_helper.rbには、さまざまな冗長なものを含めることができます。

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

そしてspec/alpha_spec.rbは冗長な部分を次のものに置き換えます:

require 'spec_helper'
  • すべてのテスト:rake test
  • 1つのテスト:Ruby -Ilib -Ispec spec/alpha_spec.rb
40
Patrick

ウォッチャーまたはスポークはテストを実行するための要件ではないことに注意してください。自動テストを行うのに便利です。しかし、MiniTestテストのセットを実行できる最も基本的な方法は、Ruby自体を使用することです。

$ Ruby myfileoftests.rb
4
cczona

Rubyのどのバージョンを使用していますか?

私の理解では、1.9はMiniTestを導入しました。これはTest::Unitを完全に置き換え、下位互換性のあるAPIを備えています。したがって、1.9を使用していて、RailsアプリがTest::Unitを参照している場合、実際にはすでにMiniTestを使用しています。

Ruby source-test/unit.rb for 1.9.2には次の要件があります。

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

また、test/unit/assertionsにはMiniTest::Assertionsが含まれます。


テストをより高速に実行することは、まったく別の暗い芸術です。 sporkwatchr を見てください。前者は、アプリの初期化を維持し、変更されたファイルをリロードし、テストスイートを実行する前にフォークします。後者は、リポジトリ内のファイルの変更を監視し、関連するテストケースを自動的に実行します。

これらを組み合わせることで、かなり平均的なTDD設定が得られます。新しいモデルのテストケースを作成すると、自動的に実行され、失敗します。その後、関連するモデルを保存するたびに、そのテストケースが非常に迅速に再実行されます。赤/緑であるかどうかについて、ほぼ瞬時にフィードバックが得られます。

どちらも設定が簡単で、一緒にうまく動作するので少し難しいので、行き詰まっている場合は、さらにいくつかの質問で確認してください。

がんばって!

4
nfm

この 入門ビデオminitest-Rails を確認してください。 RailsアプリのMinitestを設定するプロセスについて説明します。

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

このチュートリアルでは、ヘルパーファイルを作成する方法と、rakeタスクを使用してテストを実行する方法を示します。特定のテストを実行したい場合は、次のように実行できます。

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

これが私のrakefile全体です。これをトップディレクトリに配置します。

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

すべてのMinitestファイルを一度に実行するには、rakeと入力します。それでおしまい!

require 'minitest/autorun'各ミニテストファイルの上部にあります。 Dir.globは間違いなくMinitestで動作します。

すべてのテストメソッドの名前を含むきれいな色のMinitest出力を取得するには、ファイルminitest_helper.rb私の/ testディレクトリ。 (gem minitest-reportersをインストールする必要がありました):

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

require_relative './minitest_helper'各テストファイルの上部にあります。

1
Raymond Gan

新しいバージョンのRSpec(2012年1月にリリースされた2.8以降)では、速度が劇的に向上しています。 ここ は、パフォーマンスの違いの調査とMiniTestとの比較です。

また、私は this Ryan BatesによるスクリーンキャストがMiniTestの優れた入門書であることを発見しました。これはプロ動画の1つであり、視聴するにはチャンネル登録が必要です。

1
SnapShot

パトリックは本当に良い説明と例を書きました。今後の読者のために、グローバルな期待は現在減価されており、Minitest 6で削除されることに注意してください。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