C'est comme ça que ça doit marcher!
Chaque test doit être complètement isolé du reste, de sorte que les méthodes setup
et tear_down
sont exécutées une fois pour chaque cas de test. Il y a des cas, cependant, où vous pouvez vouloir plus de contrôle sur le flux d'exécution. Vous pouvez ensuite grouper les cas de test dans suites.
Dans votre cas, vous pouvez écrire quelque chose comme ce qui suit:
require 'test/unit'
require 'test/unit/ui/console/testrunner'
class TestDecorator < Test::Unit::TestSuite
def initialize(test_case_class)
super
self << test_case_class.suite
end
def run(result, &progress_block)
setup_suite
begin
super(result, &progress_block)
ensure
tear_down_suite
end
end
end
class MyTestCase < Test::Unit::TestCase
def test_1
puts "test_1"
assert_equal(1, 1)
end
def test_2
puts "test_2"
assert_equal(2, 2)
end
end
class MySuite < TestDecorator
def setup_suite
puts "setup_suite"
end
def tear_down_suite
puts "tear_down_suite"
end
end
Test::Unit::UI::Console::TestRunner.run(MySuite.new(MyTestCase))
Le TestDecorator
définit une suite spéciale qui fournit une méthode setup
et tear_down
qui exécuté qu'une seule fois avant et après le fonctionnement de l'ensemble de test- cas qu'il contient.
L'inconvénient de ceci est que vous devez dire Test :: Unité comment exécuter les tests dans l'unité. Dans le cas où votre appareil contient de nombreux cas-tests et vous avez besoin d'un décorateur pour un seul d'entre eux vous aurez besoin de quelque chose comme ceci:
require 'test/unit'
require 'test/unit/ui/console/testrunner'
class TestDecorator < Test::Unit::TestSuite
def initialize(test_case_class)
super
self << test_case_class.suite
end
def run(result, &progress_block)
setup_suite
begin
super(result, &progress_block)
ensure
tear_down_suite
end
end
end
class MyTestCase < Test::Unit::TestCase
def test_1
puts "test_1"
assert_equal(1, 1)
end
def test_2
puts "test_2"
assert_equal(2, 2)
end
end
class MySuite < TestDecorator
def setup_suite
puts "setup_suite"
end
def tear_down_suite
puts "tear_down_suite"
end
end
class AnotherTestCase < Test::Unit::TestCase
def test_a
puts "test_a"
assert_equal("a", "a")
end
end
class Tests
def self.suite
suite = Test::Unit::TestSuite.new
suite << MySuite.new(MyTestCase)
suite << AnotherTestCase.suite
suite
end
end
Test::Unit::UI::Console::TestRunner.run(Tests.suite)
La documentation fournit une bonne explication sur le fonctionnement des suites.
Deux méthodes d'essai avec le même nom conduit à la première méthode ne en cours d'exécution. Vous pourriez mettre un flunk dans le premier test, et les tests passeraient toujours. Un effet secondaire de la programmation couper-coller. –
Oui, et c'est facile. Ceci est finalement implémenté dans TestUnit. Voir mon message waaaay sur cette page. – jpgeek