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
$ python --version
Python 3.7.2
$ nosetests --version
nosetests version 1.3.7
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
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)
$ 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.
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.
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
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