af83

Optimiser ses tests unitaires en ruby

Avec Ruby On Rails, il est assez aisé de faire des test unitaires. Il est donc encore plus fortement conseillé de faire des tests dans toutes ses applications Ruby On Rails.

Le soucis quand on teste beaucoupses applications est outre d'avoir moins de bugs, c'est d'avoir des temps de tests qui sont de plus en plus long.

En théorie, il est dit que tant que tous les tests ne font pas plus de 10 minutes, il n'est pas nécessaire de refactorer sont code de tests. Mais il peux quand même être intéressant de suivre le temps d'exécution de chaque tests pour limiter le temps d'un test.

Avec le framework Rspec, il est très simple de découvrir les tests qui sont les plus lent. Le formatteur "profile"

 spec --format profile spec/*_spec.rb

retourne les 10 tests ( exemples ) qui prennent le plus de temps. Il est donc facile de savoir quels tests refactorer pour améliorer les performances globale de ceux-ci.

Mais avec Test::Unit, la partie était plus compliquée. Heureusement test_benchmarker est là pour nous aider. Grâce à ce gems, un simple require dessus et tout vos tests seront benchmarcké et trié par temps d'execution, par class et surtout par test.

Voici un exemple de sortie de test_benchmarker :

  === Class Benchmark Results ====
  1.    0.027 secs avg time, 1.193 secs total time, 45 tests for: FinderTest
  2.    0.005 secs avg time, 0.166 secs total time, 35 tests for: ViewTest
  3.    0.001 secs avg time, 0.001 secs total time, 1 tests for: ActiveRecordTestCase
  4.    0.000 secs avg time, 0.004 secs total time, 12 tests for: ArrayPaginationTest
  5.    0.000 secs avg time, 0.000 secs total time, 1 tests for: WillPaginate::ViewTestCase
  ================================

  ==== Test Benchmark Results ====
  1.    0.084 secs total time for: test_ability_to_use_with_custom_finders(FinderTest)
  2.    0.071 secs total time for: test_paginate_associations(FinderTest)
  3.    0.060 secs total time for: test_paginate_with_group(FinderTest)
  4.   0.000 secs total time for: test_total_entries_has_precedence(ArrayPaginationTest)
  ================================

Chaque test est listé avec le temps d'exécution ordonné par ordre décroissant. Il est ainsi très facile de connaitre le test a refactorer.

blog comments powered by Disqus