Exécuter Python unittest en parallèle

Aperçu

Chose que vous voulez faire: Je souhaite exécuter du code de test en parallèle à l'aide du module unittest standard de Python

Comment faire: Utilisez nose comme testeur et spécifiez le nombre de courses parallèles avec l'option --processes

Environnement de confirmation

$ python --version
Python 3.7.2
$ nosetests --version
nosetests version 1.3.7

Exemple de code pour confirmation

Puisque nous voulons voir l'effet de l'exécution parallèle ici, nous mettons une seconde d'attente dans la méthode de test avec time.sleep ().

$ cat test_s1.py
import unittest
import time
class Test(unittest.TestCase):
    def test_method(self):
        time.sleep(1)
        self.assertTrue(True)
$ cat test_f1.py
import unittest
import time
class Test(unittest.TestCase):
    def test_method(self):
        time.sleep(1)
        self.assertFalse("Hyaha")
$ ls
test_f1.py  test_s1.py
$ cp test_s{1,2}.py
$ cp test_s{1,3}.py
$ ls
test_f1.py  test_s1.py  test_s2.py test_s3.py

Utilisez un testeur standard

Cela prend 4 secondes car il est exécuté séquentiellement

$ python -m unittest
F...
======================================================================
FAIL: test_method (test_f1.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/yoichi/prog/python-study/nose/test_f1.py", line 6, in test_method
    self.assertFalse("Hyaha")
AssertionError: 'Hyaha' is not false

----------------------------------------------------------------------
Ran 4 tests in 4.024s

FAILED (failures=1)

pas d'option setests

$ nosetests
F...
======================================================================
FAIL: test_method (test_f1.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/yoichi/prog/python-study/nose/test_f1.py", line 6, in test_method
    self.assertFalse("Hyaha")
AssertionError: 'Hyaha' is not false

----------------------------------------------------------------------
Ran 4 tests in 4.066s

FAILED (failures=1)

Depuis https://nose.readthedocs.io/en/latest/plugins/multiprocess.html, la valeur par défaut n'est pas une exécution parallèle, donc c'est comme prévu.

--processes=NUM
  Spread test run among this many processes. Set a number equal to the number
  of processors or cores in your machine for best results. Pass a negative
  number to have the number of processes automatically set to the number of
  cores. Passing 0 means to disable parallel testing. Default is 0 unless
  NOSE_PROCESSES is set. 

Exécution parallèle avec nosetests

S'il s'agit de 2 parallèles, cela se terminera dans 2 secondes

$ nosetests --processes=2
F...
======================================================================
FAIL: test_method (test_f1.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/yoichi/prog/python-study/nose/test_f1.py", line 6, in test_method
    self.assertFalse("Hyaha")
AssertionError: 'Hyaha' is not false

----------------------------------------------------------------------
Ran 4 tests in 2.090s

FAILED (failures=1)

4 arrivées parallèles en 1 seconde

$ nosetests --processes=4
F...
======================================================================
FAIL: test_method (test_f1.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/yoichi/prog/python-study/nose/test_f1.py", line 6, in test_method
    self.assertFalse("Hyaha")
AssertionError: 'Hyaha' is not false

----------------------------------------------------------------------
Ran 4 tests in 1.128s

FAILED (failures=1)

Si vous augmentez le nombre de parallèles, les ressources pouvant être utilisées en même temps augmenteront, définissez donc une valeur appropriée en fonction de l'environnement d'exécution.

Unité d'exécution parallèle

Cas de test multiples

Même s'il y a plusieurs classes TestCase dans un fichier, elles seront exécutées en parallèle.

$ cat test_s1.py
import unittest
import time
class Test1(unittest.TestCase):
    def test_method1(self):
        time.sleep(1)
        self.assertTrue(True)
class Test2(unittest.TestCase):
    def test_method1(self):
        time.sleep(1)
        self.assertTrue(True)
$ ls
test_s1.py
$ nosetests --processes=2
..
----------------------------------------------------------------------
Ran 2 tests in 1.073s

OK

Plusieurs méthodes de test

Ne s'exécute pas en parallèle méthode par méthode

$ cat test_s1.py
import unittest
import time
class Test1(unittest.TestCase):
    def test_method1(self):
        time.sleep(1)
        self.assertTrue(True)
    def test_method2(self):
        time.sleep(1)
        self.assertTrue(True)
$ ls
test_s1.py
$ nosetests --processes=2
..
----------------------------------------------------------------------
Ran 2 tests in 2.073s

OK

Recommended Posts

Exécuter Python unittest en parallèle
Exécutez unittest en Python (pour les débutants)
Téléchargement parallèle avec Python
Exécuter des tâches automatisées en Python
Exécuter des commandes shell en Python
Lançons "python -m antigravity" en python
Exécutez la commande shell / Python dans R
Lire des fichiers en parallèle avec Python
Exécutez un algorithme simple en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
Exécutez AzureKinect en Python la veille de Noël.
DCI en Python
tri rapide en python
nCr en python
Exécuter l'interpréteur Python dans le script
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Exécuter régulièrement des tâches de type cron en Python
Exécution de tâches parallèles à l'aide de concurrent.futures en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Exécutez Python en C ++ sur Visual Studio 2017
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Exécutez l'API Google Analytics (core v3) en python
Exécutez Python YOLOv3 en C ++ sur Visual Studio 2017
Jusqu'à ce que l'exemple de changefinder s'exécute sur python
Comment exécuter LeapMotion avec Python non-Apple