Translated by ychung74 based on 0 ratings
En préparation pour l'enseignement de Ruby dans une classe avec d'essai premier enseignement. J'ai décidé d'évaluer un test de quelques cadres. Je pensais d'abord à utiliser Test:: Unit, car il semble facile à comprendre et est livré avec Rails. Wolfram Arnold a fait valoir que Test:: Unit serait charge de la nouvelleles gens avec un héritage. Alex Chaffee a également préconisé RSpec, mais d'autresamis de la Twittervese avait de bonnes choses à dire sur Shoulda. Certaines personnes ne l'ait déclaré être tout simplement une question de goût.
Même ainsi, je voulais prendre une décision éclairée et d'affiner ma palette d'outils Ruby, j'ai donc écrit un simple exercice de chacune de Test:: Unit, Shoulda et RSpec.
require 'test/unit'
require 'pig_latin'
class PigLatinTest < Test::Unit::TestCase
include PigLatinTranslator
def test_simple_word
s = translate("nix")
assert_equal("ixnay", s)
end
def test_word_beginning_with_vowel
s = translate("apple")
assert_equal("appleay", s)
end
def test_two_consonant_word
s = translate("stupid")
assert_equal("upidstay", s)
end
end
Avec le code ci-dessus enregistré en tant que "test_pig_latin.rb" vous l'exécutez simplement en exécutant avec Ruby.
$ ruby test_pig_latin.rb
Loaded suite test_pig_latin
Started
FFF
Finished in 0.01091 seconds.
1) Failure:
test_simple_word(PigLatinTest) [test_pig_latin.rb:9]:
<"ixnay"> expected but was
<"translation">.
2) Failure:
test_two_consonant_word(PigLatinTest) [test_pig_latin.rb:19]:
<"upidstay"> expected but was
<"translation">.
3) Failure:
test_word_beginning_with_vowel(PigLatinTest) [test_pig_latin.rb:14]:
<"appleay"> expected but was
<"translation">.
3 tests, 3 assertions, 3 failures, 0 errors
Remarquez dans le code ci-dessous qui est tout simplement Shoulda et extension à Test:: Unit. Le sous-classes PigLatinTest aussi Test:: Unit:: TestCase, tout comme l'exemple ci-dessus, mais le code à l'intérieur du scénario de test ressemble sensiblement différent (et plus lisible à mon avis). Vous pouvez réellement mix essais Shoulda (ci-dessous) avec les autres méthodes de test TestCase (ci-dessus) dans le TestCase même. Ceci est un avantage pour Shoulda plus RSpec si vous avez une base de code qui est déjà beaucoup de tests unitaires, mais j'ai aussiutilisé RSpec et test:: Unité dans le même projet (vous avez juste à vous rappeler de 'test râteau »et« spec râteau »).
require 'rubygems'
require 'shoulda'
require 'pig_latin'
class PigLatinTest < Test::Unit::TestCase
include PigLatinTranslator
context "#translate" do
should "translate a simple word: nix" do
s = translate("nix")
assert_equal("ixnay", s)
end
should "translate a word beginning with a vowel: apple" do
s = translate("apple")
assert_equal("appleay", s)
end
should "translate a two consonent word: stupid" do
s = translate("stupid")
assert_equal("upidstay", s)
end
end
end
Avec le code ci-dessus enregistré en tant que "test_shoulda_pig_latin.rb" que vous utilisez le même procédé que ci-dessus en exécutant simplement le fichier avec Ruby.
$ ruby test_shoulda_pig_latin.rb
Loaded suite test_shoulda_pig_latin
Started
FFF
Finished in 0.008268 seconds.
1) Failure:
test: #translate should translate a simple word. (PigLatinTest)
[test_shoulda_pig_latin.rb:12:in `__bind_1251676444_52936'
/Library/Ruby/Gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:351:in `call'
/Library/Ruby/Gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:351:in `test: #translate should translate a simple word. ']:
<"ixnay"> expected but was
<"translation">.
2) Failure:
test: #translate should translate a two consonent word. (PigLatinTest)
[test_shoulda_pig_latin.rb:22:in `__bind_1251676444_58860'
/Library/Ruby/Gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:351:in `call'
/Library/Ruby/Gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:351:in `test: #translate should translate a two consonent word. ']:
<"upidstay"> expected but was
<"translation">.
3) Failure:
test: #translate should translate a word beginning with a vowel. (PigLatinTest)
[test_shoulda_pig_latin.rb:17:in `__bind_1251676444_59935'
/Library/Ruby/Gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:351:in `call'
/Library/Ruby/Gems/1.8/gems/thoughtbot-shoulda-2.10.2/lib/shoulda/context.rb:351:in `test: #translate should translate a word beginning with a vowel. ']:
<"appleay"> expected but was
<"translation">.
3 tests, 3 assertions, 3 failures, 0 errors
require "pig_latin"
describe "#translate" do
include PigLatinTranslator
it "should translate a simple word" do
s = translate("nix")
s.should == "ixnay"
end
it "should translate a word beginning with a vowel" do
pending
s = translate("apple")
s.should == "appleay"
end
it "should translate a two consonent word: stupid" do
pending
s = translate("stupid")
s.should == "upidstay"
end
end
Le code ci-dessus est enregistré dans un fichier appelé "pig_latin_spec.rb" et exécutez-le en utilisant la 'spec' de commande. Vous aurez besoin d'avoir installé le joyau rspec (sudo gem install rspec).
$ spec pig_latin_spec.rb
F**
Pending:
#translate should translate a word beginning with a vowel (TODO)
./pig_latin_spec.rb:11
#translate should translate a two consonent word: stupid (TODO)
./pig_latin_spec.rb:17
1)
'#translate should translate a simple word' FAILED
expected: "ixnay",
got: "translation" (using ==)
./pig_latin_spec.rb:8:
Finished in 0.035728 seconds
3 examples, 1 failure, 2 pending
J'aime RSpec meilleur depuis que j'ai trouver la sortie d'être plus lisible. J'aime le mot-clé attente, ce qui me permet de mettre en place les tests comme un exercice de la classe avec un seul essai défaillant. Je trouve cela contribue à mettre l'accent sur exactement un essai et d'un échec. J'ai pensé aller avec Shoulda parce que les tests sont tout aussi lisible que RSpec, même si la production prend un certain apprentissage de la lecture, à cause de ma pensée initiale que Test:: Unit détenait moins de magie. Toutefois, à regarder de plus près, j'ai réalisé que Test:: Unitdispose d'une incantation magique significative: vous déclarez simplement d'une classe et quand cette classe est définie, elle exécute le test. Cela semblait pas le genre de sujet que je voudrais enseigner dans une classe d'intro. Même certains programmeurs expérimentés pourrait avoir des difficultés à comprendre le mécanisme qui permet une telle construction de fonctionner. J'en ai conclu que tous les cadres d'essais nécessitent magie grave, et ramassa RSpec depuis que j'ai trouvé qu'elle soit la plus utilisable pour l'écriture d'essais et d'analyse de la sortie.
Attention: cet exercice a été pure Ruby. Dans des rails, je me demande si les tests Shoulda serait plus concis, les rendant plus faciles à écrire et à lire et, par conséquent, il la peine d'être plus raide de la courbe d'apprentissage à la lecture de la sortie.