Preliminaries
ich mit ein paar Probe-Tests vorbereitet zum Spielen. Dies sind einige einfache Seitentitelprüfungen. Wir haben ein Modul test_google.py
mit zwei Unit-Tests, die die Titel von www.google.com
überprüfen und mail.google.com
:
# test_google.py
import unittest
from selenium import webdriver
class GoogleTests(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def tearDown(self):
self.driver.close()
def test_google_page_title(self):
self.driver.get('https://www.google.com')
assert self.driver.title == 'Google'
def test_gmail_page_title(self):
self.driver.get('https://mail.google.com')
assert self.driver.title == 'Gmail'
Das zweite Modul ist test_stackoverflow.py
, die einen Test enthält, die den Titel stackoverflow.com
prüft:
# test_stackoverflow.py
import unittest
from selenium import webdriver
class StackoverflowTests(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def tearDown(self):
self.driver.close()
def test_so_page_title(self):
self.driver.get('https://stackoverflow.com')
assert 'Stack Overflow' in self.driver.title
das Laufen Tests mit dem blanken unittest
Läufer Erträge:
$ python setup.py test
running test
running egg_info
...
running build_ext
test_gmail_page_title (test_google.GoogleTests) ... ok
test_google_page_title (test_google.GoogleTests) ... ok
test_so_page_title (test_stackoverflow.StackoverflowTests) ... ok
----------------------------------------------------------------------
Ran 3 tests in 11.657s
OK
Migration zu pytest
installieren pytest
über pip
:
$ pip install pytest
pytest
Unit-Tests aus der Box unterstützt, so dass wir nicht brauchen, um die Tests zu berühren, können wir sie sofort laufen. Der Versuch, aus den pytest
Läufer:
$ pytest -v
================ test session starts ================
platform darwin -- Python 3.6.3, pytest-3.2.5, py-1.5.2, pluggy-0.4.0 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-47439103, inifile:
collected 3 items
test_google.py::GoogleTests::test_gmail_page_title PASSED
test_google.py::GoogleTests::test_google_page_title PASSED
test_stackoverflow.py::StackoverflowTests::test_so_page_title PASSED
================ 3 passed in 13.81 seconds ================
Laufende Tests parallel
Dies erfordert pytest-xdist
Plugin für pytest
. Installieren Sie es über pip
:
$ pip install pytest-xdist
Das Plugin ist nun installiert, wird aber standardmäßig nicht aktiv sein, wenn Sie also pytest
erneut ausführen, werden Sie keinen Unterschied bemerken. Verwenden Sie den Schlüssel numprocesses
, um die Testausführung zu parallelisieren. Dies bezeichnet die Anzahl der Prozesse, die reservierten die Tests laufen, hier verwende ich den auto
Wert so viele Prozesse wie viele CPUs meine Maschine zum Laichen hat:
$ pytest -v --numprocesses=auto
================ test session starts ================
platform darwin -- Python 3.6.3, pytest-3.2.5, py-1.5.2, pluggy-0.4.0 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-47439103, inifile:
plugins: xdist-1.20.1, forked-0.2
[gw0] darwin Python 3.6.3 cwd: /Users/hoefling/projects/private/stackoverflow/so-47439103
[gw1] darwin Python 3.6.3 cwd: /Users/hoefling/projects/private/stackoverflow/so-47439103
[gw2] darwin Python 3.6.3 cwd: /Users/hoefling/projects/private/stackoverflow/so-47439103
[gw3] darwin Python 3.6.3 cwd: /Users/hoefling/projects/private/stackoverflow/so-47439103
[gw0] Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw1] Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw2] Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
[gw3] Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) -- [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
gw0 [3]/gw1 [3]/gw2 [3]/gw3 [3]
scheduling tests via LoadScheduling
test_google.py::GoogleTests::test_google_page_title
test_stackoverflow.py::StackoverflowTests::test_so_page_title
test_google.py::GoogleTests::test_gmail_page_title
[gw0] PASSED test_google.py::GoogleTests::test_gmail_page_title
[gw1] PASSED test_google.py::GoogleTests::test_google_page_title
[gw2] PASSED test_stackoverflow.py::StackoverflowTests::test_so_page_title
================ 3 passed in 7.81 seconds ================
Sie werden sehen, dass alle drei Tests parallel laufen durch drei gleichzeitig geöffnete Chrome-Instanzen. Jeder Test läuft in einem eigenen Prozess, so dass sie sich nicht gegenseitig stören. Beachten Sie auch, dass beide Testmethoden aus der Klasse auch parallel ausgeführt werden. Dies ist nicht auf Tests in verschiedenen Modulen oder Klassen beschränkt.
Integration mit setup.py
Als ich zuerst die Migration auf pytest
, eine der Bedingungen begann, war ich hatte, dass der Befehl python setup.py test
noch so funktionieren sollte wir die Tests keinen zusätzlichen pytest
Befehl auswendig lernen müssen, um laufen und so müssen auch wir alle unseren Dienstprogramm-Skripte oder bauen Arbeitsplätze auf unserem Integrationsserver nicht anpassen, so sind hier die Schritte, um Ihre setup.py
Skript zu aktualisieren:
die folgenden Pakete hinzufügen Anforderungen testen:
from setuptools import setup
setup(
...
tests_require=[
'pytest',
'pytest-runner', # this one is needed to install distutils command for pytest
'pytest-xdist'
],
)
einen Alias setup.cfg
hinzufügen:
[aliases]
test=pytest
einen Konfigurationsabschnitt für pytest
in setup.cfg
hinzufügen:
[tool:pytest]
addopts=--verbose --numprocesses=auto
Nun, wenn Sie python setup.py test
, die richtige laufen Läufer wird aufgerufen und das xdist
Plugin wird aktiv sein e standardmäßig.
Zusätzliche Hinweise
ich wirklich persönlich wie pytest
, da es viel mehr bietet als ein einfaches Testausführung - Sie können die Tests als reine Funktionen schreiben (ohne Verpackung in TestCase
Klassen erforderlich), sammeln Tests ohne sie ausgeführt wird, leicht erneut ausführen Nur Tests, die kürzlich fehlgeschlagen sind, haken die Code-Coverage-Messung mit mehreren Berichten in verschiedenen Formaten und vielem mehr ab. Beziehen Sie sich auf die official docs für mehr Details, es ist wirklich die Lesezeit wert!
also ist dies mehr über eine Unit-Test-Bibliothek, die die Ausführung von Tests parallel unterstützt? ['pytest'] (https://docs.pytest.org) kann das tun, indem er das Plugin' 'pytest-xdist' '(https://pypi.python.org/pypi/pytest-xdist) benutzt. Die andere Bibliothek, die in Betracht kommt, ist ['Pulsar'] (https://quantmind.github.io/pulsar/apps/test.html), obwohl es keine reine Testbibliothek ist. Wenn es das ist, wonach Sie suchen, kann ich eine Antwort mit einem Beispiel für parallelisierte Tests mit 'pytest' posten, da wir es ziemlich ausführlich zum Testen unserer Django-Apps verwenden. – hoefling
Ja, das ist richtig. Wir verwenden Unit-Test und möchten die Tests parallel durchführen. Also kann ich die Pytest-Bibliothek mit dem Unit-Test-Framework verwenden ?. Ein Beispiel wäre toll, danke. –