Was Sie tun möchten: Ich möchte Testcode parallel mit dem Python-Standardmodul unittest ausführen
Wie macht man: Verwenden Sie die Nase als Testläufer und geben Sie die Anzahl der parallelen Läufe mit der Option "--processes" an
$ python --version
Python 3.7.2
$ nosetests --version
nosetests version 1.3.7
Da wir hier den Effekt der parallelen Ausführung sehen wollen, warten wir in der Testmethode mit time.sleep () 1 Sekunde.
$ 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
Es dauert 4 Sekunden, da es nacheinander ausgeführt wird
$ 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)
Unter https://nose.readthedocs.io/en/latest/plugins/multiprocess.html ist die Standardeinstellung keine parallele Ausführung, daher wie erwartet.
--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.
Wenn es 2 parallel ist, endet es in 2 Sekunden
$ 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 parallele Abschlüsse in 1 Sekunde
$ 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)
Durch Erhöhen der Anzahl der Parallelen werden die Ressourcen erhöht, die gleichzeitig verwendet werden können. Legen Sie daher einen geeigneten Wert entsprechend der Ausführungsumgebung fest.
Selbst wenn eine Datei mehrere TestCase-Klassen enthält, werden sie parallel ausgeführt.
$ 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
Wird nicht methodweise parallel ausgeführt
$ 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