web-dev-qa-db-fra.com

Le test unitaire de Python peut-il être mis en parallèle, comme le nez

Le framework de test NOSE de Python a pour concept de l'exécution de plusieurs tests en parallèle

Le but de ceci n'est pas de tester la simultanéité dans le code, mais de faire des tests pour un code qui n'a "aucun effet secondaire, aucun problème d'ordre, et aucune dépendance externe" s'exécutent plus rapidement. Le gain de performances provient d'attentes d'E/S simultanées lorsqu'elles accèdent à différents périphériques, d'une meilleure utilisation de plusieurs processeurs/cœurs et de l'exécution d'instructions time.sleep () en parallèle.

Je crois que la même chose pourrait être faite avec le framework de test unittest de Python, en ayant un plugin Test Runner.

Quelqu'un at-il déjà eu une expérience avec une telle bête et peut-il formuler des recommandations?

41
Oddthinking

Testrunner intégré à Python Unittest n'exécute pas les tests en parallèle. Il ne serait probablement pas trop difficile d’écrire celui qui l’a fait. J'ai écrit le mien pour reformater le résultat et l'heure de chaque test. Cela a pris peut-être une demi-journée. Je pense que vous pouvez échanger la classe TestSuite qui est utilisée avec une classe dérivée qui utilise le multitraitement sans trop de peine.

20
dietbuddha

Le testtools package est une extension de unittest qui prend en charge l'exécution simultanée de tests. Il peut être utilisé avec vos anciennes classes de test qui héritent de unittest.TestCase.

Par exemple:

import unittest
import testtools

class MyTester(unittest.TestCase):
    # Tests...

suite = unittest.TestLoader().loadTestsFromTestCase(MyTester)
concurrent_suite = testtools.ConcurrentStreamTestSuite(lambda: ((case, None) for case in suite))
concurrent_suite.run(testtools.StreamResult())
18
Joe

Veuillez utiliser pytest-xdist , si vous voulez un fonctionnement en parallèle.

Le plugin pytest-xdist étend py.test à certains modes d'exécution de test uniques:

  • parallélisation du cycle de test: si vous avez plusieurs processeurs ou hôtes, vous pouvez les utiliser pour un cycle de test combiné. Cela permet d’accélérer le développement ou d’utiliser des ressources spéciales de machines distantes.

[...]

Plus d'infos: Le blog de Rohan Dunham

6
张云辉

Une autre option qui pourrait être plus facile, si vous n'avez pas autant de scénarios de test et qu'ils ne sont pas dépendants, consiste à lancer chaque scénario de test manuellement dans un processus séparé.

Par exemple, ouvrez quelques sessions tmux puis lancez un scénario de test dans chaque session en utilisant quelque chose comme:

python -m unittest -v MyTestModule.MyTestClass.test_n
3
yakaboskic

Si vous n’avez besoin que du support Python3, envisagez d’utiliser my fastunit .

Je viens de changer quelques codes d'unittest, faisant en sorte que les cas de tests soient exécutés comme des routines.

Cela m'a vraiment fait gagner du temps.

Je viens juste de le terminer la semaine dernière et je ne teste peut-être pas assez; si une erreur se produit, merci de me le faire savoir afin que je puisse mieux, merci!

2
Shin

Si c'est ce que vous avez fait initialement

runner = unittest.TextTestRunner()
runner.run(suite)

-----------------------------------------

le remplacer par

from concurrencytest import ConcurrentTestSuite, fork_for_tests

concurrent_suite = ConcurrentTestSuite(suite, fork_for_tests(4))
runner.run(concurrent_suite)
1
prathik shirolkar