web-dev-qa-db-fra.com

JUnit est-il le bon outil pour écrire des tests de performances?

Au cours de la dernière semaine, j'ai créé deux classes au sujet desquelles mon équipe a exprimé des inquiétudes concernant leurs performances. Pour évaluer mon code, j'ai écrit quelques tests JUnit simples qui ont exercé ces classes en créant de riches ensembles de données de test, puis en alimentant ces données par les méthodes pertinentes pendant des milliers d'itérations. J'ai enregistré le temps d'exécution de chaque itération, puis je me suis déconnecté des temps hauts, bas et moyens en utilisant des boucles et System.nanoTime(). Enfin, JUnit a affirmé que les temps élevés et moyens étaient dans des limites acceptables. Cette approche de test a donné à mon équipe confiance en ce code.

JUnit est-il le bon outil pour tester les performances de cette manière? Existe-t-il de meilleurs outils pour tester les performances au niveau de l'unité (méthode et classe)?

41
Freiheit

Il peut y avoir de meilleures approches, mais il existe également des cadres qui aident à implémenter l'analyse comparative avec JUnit. Certaines pratiques utiles sont les échauffements, les évaluations statistiques. Jetez un oeil à JUnitBenchmarks et JUnitPerf

[~ # ~] edit [~ # ~] semble que JUnitBenchmarks est obsolète depuis que la question a été posée. Les responsables du projet recommandent de passer à JMH . Merci, Barry NL pour l'avertissement.

41
kostja

Non. JUnit est conçu pour les tests unitaires. Il y a beaucoup de choses à prendre en compte lors de l'écriture de tests de performances en Java. Utilisez Google Caliper qui est spécialement conçu pour écrire des tests de micro-benchmark.

Regardez Comment puis-je écrire un micro-benchmark correct en Java?

21
Aravind R. Yarram

Vos tests devraient être mieux définis comme des tests de référence. Oui, JUnit peut être utilisé de cette façon bien que ce ne soit pas le meilleur choix. Mais vous pouvez par exemple définir max. temps d'évaluation pour le test, donc si l'algorithme est modifié qui a provoqué une dégradation des performances, le test échoue. Utilisez @Test(timeout=12345) pour la configuration.

Si vous avez besoin d'un vrai test de performance, pensez à JMeter.

6
AlexR