Je veux exécuter tous mes pytest
tests en parallèle au lieu de manière séquentielle.
ma configuration actuelle ressemble à:
class Test1(OtherClass):
@pytest.mark.parametrize("activity_name", ["activity1", "activity2"])
@pytest.mark.flaky(reruns=1)
def test_1(self, activity_name, generate_test_id):
"""
"""
test_id = generate_random_test_id()
test_name = sys._getframe().f_code.co_name
result_triggers = self.proxy(test_name, generate_test_id, test_id, activity_name)
expected_items = ["response"]
validate_response("triggers", result_triggers, expected_items)
@pytest.mark.parametrize("activity_name", ["activity1", "activity2"])
@pytest.mark.flaky(reruns=1)
def test_2(self, activity_name, generate_test_id):
"""
"""
#same idea...
Je lance mes tests avec pytest -v -s
.
Le résultat est que mes tests s'exécutent de manière séquentielle, ce qui prend beaucoup de temps car certains d'entre eux attendent les réponses des serveurs distants (tests d'intégration).
Existe-t-il un moyen de faire fonctionner pytest en parallèle?
Tu veux pytest-xdist
. Je pense que Qxf2 l'explique assez bien: Qxf2 sur Pytest-Xdist
Leur ligne de commande Linux est un peu trop prolixe à mon goût cependant; J'utilise:
pytest -n <NUM>
où <NUM> est le nombre de travailleurs parallèles.
pytest-xdist
est une excellente solution dans la plupart des cas, mais les tests d’intégration sont spéciaux. Après avoir envoyé une demande à un serveur distant, un autre test peut démarrer sur un nouveau thread au lieu d'attendre une réponse. C'est un test simultané au lieu d'un test parallèle. La simultanéité autorise beaucoup plus de tests à la fois avec beaucoup moins de mémoire et de temps système.
J'ai écrit le pytest-parallel
plugin [py3.6 +] pour permettre les tests en parallèle et simultané. Voici comment exécuter vos tests d'intégration simultanément:
pytest --tests-per-worker auto
pytest-xdist n'a pas fonctionné pour moi, car mes tests attendaient 99,99999,99% du temps nécessaire pour que les tâches de collage d'AWS se terminent, et j'utilisais un environnement CodeBuild à 2 cœurs, je ne pouvais donc exécuter que 2 tests à la fois.
L'approche de @ kevelend a fonctionné pour moi.