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: , ,

Un commentaire pour “MTest, un microframework de Test”

  1. ChromiumOxide » Archive du blog » MTest : des nouvelles dit :

    [...] ChromiumOxide « MTest, un microframework de Test [...]

Laisser un commentaire