2017-11-22 2 views
2

Ich habe es geschafft, Tests parallel mit Webdriver gegen einen Selen Hub und Knoten durchzuführen. Dieser vor den Tests aufgerufene Code wird ausgeführt.So führen Sie Tests in einer Testsuite parallel aus

cls.driver = webdriver.Remote(
    command_executor="http://localhost:4444/wd/hub", 
    desired_capabilities={ 
     "browserName": "chrome", 
     }) 

    cls.driver.maximize_window() 
    cls.driver.get(cls.serverUrl) 
    p = multiprocessing.Process(target=cls.driver.get(cls.serverUrl), args=()) 
    p.start() 
    p.join() 

Auf diese Weise kann ich mehrere Browser starten, indem Sie sie manuell aus Eclipse ausführen. Das würde ich jedoch gerne automatisch in einer Testsuite machen. In einer Testsuite werden jedoch alle Tests in einer Sequenz gestartet. Wenn jemand eine Idee hat, wie es weitergehen soll, wäre das großartig.

+0

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

+0

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. –

Antwort

0

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:

  1. 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' 
        ], 
    ) 
    
  2. einen Alias ​​setup.cfg hinzufügen:

    [aliases] 
    test=pytest 
    
  3. 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!

+0

vielen Dank für großartige Beispiele, ich werde einen tiefen Blick darauf werfen. –

+0

Haben Sie eine setup.cfg-Datei erstellt und sie demselben Verzeichnis wie der Datei setup.py hinzugefügt? –

+0

@AndersSundqvist Ja, die Datei sollte 'setup.cfg' heißen und in das gleiche Verzeichnis wie' setup.py' gestellt werden. Es ist jedoch optional, wir verwenden es nur, um alle Befehlszeilenargumente zu verstecken. – hoefling

Verwandte Themen