MiniTestのRSpecのbefore(:suite)
とafter(:suite)
に代わるものはありますか?
私はカスタムテストランナーが順調であると思いますが、それが一般的な要件ではないとは思えないので、誰かがおそらく実装しました。:-)
setup()
およびteardown()
メソッドを使用できます。ドキュメントには、before()
およびafter()
も使用可能であると記載されています。
編集:各テストの前、またはスイート全体が完了する前または後に何かを実行することを考えていますか?
上記のCaleyの回答とコメントで述べたように、MiniTest::Unit
には関数after_tests
が含まれています。 before_tests
または同等のものはありませんが、minitest_helper.rb
ファイル内のコードはすべて、テストスイートの前に実行する必要があります。これにより、そのような関数の役割を果たします。
警告:Rubyはまだ比較的新しく、Minitestは非常に新しいので、もし私が間違っていれば、お願い修正してください! :-)
これをMinitestの現在のバージョン(5.0.6)で動作させるには、require 'minitest'
を使用してMinitest.after_run { ... }
を使用する必要があります。
warn "MiniTest::Unit.after_tests is now Minitest.after_run. ..."
https://github.com/seattlerb/minitest/blob/master/lib/minitest.rbhttps://github.com/seattlerb/minitest/blob/master/lib/ minitest/unit.rb
eachテストの前にコードを実行するには、before
を使用します。ここでは、インスタンスのコンテキスト、おそらくdescribe
によって暗黙的に生成されたクラスのコンテキストで操作しているため、before
に設定されたインスタンス変数は、各テストでアクセスできます(例:it
ブロック)。
allテストの前にコードを実行するには、テストをMiniTest::Spec
のサブクラスなどにラップするだけです。これで、テスト自体の前に、クラスまたはモジュールを作成したり、クラス変数を設定したり、クラスメソッドを呼び出したりできます。これらすべてがすべてのテストで利用できます。
例:
require "minitest/autorun"
class MySpec < MiniTest::Spec
class MyClass
end
def self.prepare
puts "once"
@@prepared = "prepared"
@@count = 0
end
prepare
before do
puts "before each test"
@local_count = (@@count += 1)
end
describe "whatever" do
it "first" do
p MyClass
p @@prepared
p @local_count
end
it "second" do
p MyClass
p @@prepared
p @local_count
end
end
end
これが出力です。出力の各行が何を証明するかを説明する中括弧内のコメントと一緒に:
once [this code, a class method, runs once before all tests]
Run options: --seed 29618 [now the tests are about to run]
# Running tests:
before each test [the before block runs before each test]
MySpec::MyClass [the class we created earlier is visible in each test]
"prepared" [the class variable we set earlier is visible in each test]
1 [the instance variable from the before block is visible in each test]
before each test [the before block runs before each test]
MySpec::MyClass [the class we created earlier is visible in each test]
"prepared" [the class variable we set earlier is visible in each test]
2 [the instance variable from the before block is visible each test]
(この出力は、テストが実行される順序に関する保証を意味するものではないことに注意してください。)
別のアプローチは、既存のbefore
を使用することですが、コードをラップして、クラス変数フラグで一度だけ実行します。例:
class MySpec < MiniTest::Spec
@@flag = nil
before do
unless @@flag
# do stuff here that is to be done only once
@@flag = true
end
# do stuff here that is to be done every time
end
# ... tests go here
end
これを行う簡単な方法の1つは、保護されたクラスメソッドを記述し、それをbegin
で呼び出すことです。
Minitest :: Specの例:
describe "my stuff" do
def self.run_setup_code
if @before_flag.nil?
puts "Running the setup code"
@before_flag = true
end
end
before do
self.class.run_setup_code
end
it "will only run the setup code once" do
assert_equal 1, 1
end
it "really only ran it once" do
assert_equal 1,1
end
end
...取得するため
Run options: --seed 11380
# Running:
Running the setup code
..
Finished in 0.001334s, 1499.2504 runs/s, 1499.2504 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
Minitestのいいところは、その柔軟性です。 + before_suite +コールバックを備えたカスタムMiniTest Runnerを使用しています。この例のようなもの- Ruby Minitest:SuiteレベルまたはClassレベルのセットアップ?
そしてミニテストにカスタムランナーを使うように伝えます
MiniTest::Unit.runner = MiniTestSuite::Unit.new
クラスの外にコードを配置するだけです。
これは私がバナーを付けるために行うことです。
require 'Selenium-webdriver'
require 'minitest/test'
require 'minitest/autorun'
class InstanceTest < Minitest::Test
def setup
url = ARGV.first
@url = self.validate_instance(url)
@driver = Selenium::WebDriver.for :firefox
end
次のようにtest_helper.rb(またはspec_helper.rb)を更新して、テスト後のコールバックを追加することもできます
# test_helper.rb
class MyTest < Minitest::Unit
after_tests do
# ... after test code
end
end