web-dev-qa-db-fra.com

tests pytest en parallèle

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?

23
Noy Mizrahi

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.

26
Claire Nielsen

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

7
kevlened

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.

1
hey_you