MTest, un microframework de Test
- RSpec 1.1.4: 8083 lignes ;
- Test::Unit : 3571 lignes ;
- MTest : 32 lignes.
Je suis tombé récemment sur un article de Paul Barry qui a confectionné un "framework" de test en Ruby, le tout sur une seule ligne.
J'ai trouvé ça assez marrant du coup je me suis pris à en faire un y ressemblant fortement, mais légèrement amélioré.
module Format def self.included(parent) {:_r => '31', :_g => '32', :_p => "35", :_w => "1;37"}.each do |m, c| parent.class_eval { define_method(m) { "\e[#{c}m#{self}\e[00m" } } end end end String.send(:include, Format) def MTest(tests) if tests[0].is_a?(String) then puts tests.shift end threads = []; results = {:pass => 0, :fail => 0, :err => 0} tests.each do |t| e,p,v = *t threads << Thread.new do begin puts(if (r = p.call) == v results[:pass] += 1 ". #{e}"._g else results[:fail] += 1 "! #{e} was #{r}, expected #{v}"._r end) rescue => x results[:err] += 1 puts "@ #{x.class} at line #{x.backtrace[0].split(':')[1]}"._p end end end threads.join results end
L'écriture des tests change par rapport à la version de Paul, on utilise plus un hash mais un tableau (ce qui permet de faire les tests dans l'ordre), on peut nommer les tests, et on utilise des proc à la place de ce vilain eval. Et si le premier élément du tableau est un chaîne, elle est simplement affichée, ce qui permet de faire des "groupes" visuels de tests.
Un petit exemple d'utilisation
tests = [ "= Some Basic Tests =", ['true', proc { true }, true], ['true', proc { false }, true], ['sum(2,5)', proc { sum(2,5) }, 7] ] MTest(tests)
Et dans une console, ça nous donne :
= Some Basic Tests = . true ! true was false, expected true @ NoMethodError at line 6
On notera que les erreurs sont affichées au lieu de faire quitter le programme
C'est pas aussi utilisable que les gros outils que j'ai cités au début, mais je pense que pour des petits projets c'est le genre de trucs qui peut marcher !
Me reste plus qu'a mettre ça sur GitHub et faire une gem.
Tags: microframework, Ruby, test
6 juin 2008 à 11:01
[...] ChromiumOxide « MTest, un microframework de Test [...]