Présentation des tests en Python. 3e partie

Mes amis, nous avons de bonnes nouvelles pour vous. Premièrement, le soleil brille enfin dans la rue, ce qui signifie que le printemps commence à reprendre pleinement ses droits. La deuxième actualité est plus spécialisée - le 20 mars, la première leçon commence par un nouveau fil de discussion sur le cours "Développeur Python" , à ce sujet nous publions la dernière partie de l'article "Introduction aux tests en Python", dont les parties précédentes peuvent être lues ici et ici .

Test dans plusieurs environnements

Jusqu'à présent, vous avez testé une version de Python en utilisant un environnement virtuel avec un ensemble spécifique de dépendances. Mais il peut toujours être nécessaire de tester l'application sur plusieurs versions de Python ou plusieurs versions du package. Tox est une application qui automatise les tests dans plusieurs environnements.



Installation de Tox

Tox est disponible sur PyPl en tant que package à installer via pip:

$ pip install tox 

Après l'installation, vous pouvez procéder à la configuration de Tox.

Personnaliser Tox pour vos dépendances

Tox est configuré via le fichier de configuration dans le répertoire du projet. Il contient les éléments suivants:

  • La commande à exécuter pour exécuter les tests;
  • Tous les packages supplémentaires requis pour fonctionner;
  • Versions cibles de Python sélectionnées pour les tests.

Au lieu d'apprendre la syntaxe de configuration de Tox, vous pouvez commencer par lancer une application de démarrage rapide.

 $ tox-quickstart 

L'outil de configuration Tox vous posera des questions et créera un fichier similaire au suivant dans tox.ini :

 [tox] envlist = py27, py36 [testenv] deps = commands = python -m unittest discover 

Avant de démarrer Tox, assurez-vous que le setup.py avec les étapes d'installation du package se trouve dans le dossier d'application. Sinon, utilisez le guide de création setup.py .

Et si votre projet n'est pas destiné à être distribué sur PyPl, vous pouvez ignorer cette exigence en ajoutant la ligne suivante au fichier tox.ini sous l'en-tête tox :

 [tox] envlist = py27, py36 skipsdist=True 

Si vous ne créez pas setup.py et que l'application a des dépendances sur PyPl, vous devrez les clarifier dans la section testenv . Par exemple, Django aura besoin des éléments suivants:

 [testenv] deps = django 

À la fin de cette étape, vous pouvez exécuter les tests.

Vous pouvez maintenant exécuter Tox et cela créera deux environnements virtuels: un pour Python 2.7 et un pour Python 3.6. Le répertoire Tox est appelé .tox/ . Dans ce document, Tox exécutera -m unittest discover pour chaque environnement virtuel.

Vous pouvez démarrer ce processus en appelant Tox à partir de la ligne de commande:

 $ tox 

Tox produira des résultats de test pour chaque environnement. Lorsque vous démarrez Tox pour la première fois, la création d'environnements virtuels prend du temps, mais lorsque vous exécutez Tox pour la deuxième fois, tout fonctionnera beaucoup plus rapidement.
Les résultats de Tox sont assez simples. Des environnements sont créés pour chaque version, des dépendances sont installées, puis des commandes de test sont exécutées.

Il y a quelques options de ligne de commande supplémentaires à retenir.
Exécution d'un environnement unique, par exemple, Python 3.6:

 $ tox -e py36 

Recréer l'environnement virtuel lorsque la dépendance change ou que les packages secondaires sont corrompus:

 $ tox -r 

Exécution de Tox avec des résultats moins détaillés:

 $ tox -q 

Exécution de Tox avec une sortie plus détaillée:

 $ tox -v 

Vous pouvez en savoir plus sur Tox sur le site de documentation Tox .

Automatisation des tests

Jusqu'à présent, vous avez effectué des tests manuellement en exécutant la commande. Mais il existe des outils pour exécuter automatiquement des tests lorsque des modifications sont apportées et les valider dans un référentiel avec un système de contrôle de version, par exemple Git. Les outils d'automatisation des tests sont souvent appelés outils CI / CD, ce qui signifie «Intégration continue / Déploiement continu». Ils peuvent exécuter des tests, compiler et publier des applications et même les déployer en production.
Travis CI est l'un des nombreux services CI disponibles.

Travis CI fonctionne bien avec Python, et maintenant vous pouvez automatiser l'exécution de tous les tests créés dans le cloud! Travis CI est gratuit pour tous les projets open source sur GitHub et GitLab et est disponible moyennant des frais pour les projets privés.

Pour commencer, connectez-vous et authentifiez-vous à l'aide de vos informations d'identification GitHub ou GitLab. Créez ensuite un fichier appelé .travis.yml avec le contenu suivant:

 language: python python: - "2.7" - "3.7" install: - pip install -r requirements.txt script: - python -m unittest discover 

Cette configuration donne à Travis CI les instructions suivantes:

  • Test de Python 2.7 et 3.7 (en option, vous pouvez les remplacer par d'autres.)
  • Installation de tous les packages répertoriés dans requirements.txt (vous pouvez supprimer cette section si vous n'avez pas de dépendances.)
  • Exécution de python -m unittest Discover pour exécuter des tests.

Après avoir validé et poussé ce fichier, Travis CI exécutera ces commandes chaque fois que vous pousserez vers votre référentiel Git distant. Les résultats peuvent être consultés sur leur site Web.

Et ensuite

Vous savez maintenant comment écrire des tests, les ajouter à votre projet, les exécuter et même le faire automatiquement, afin que vous puissiez vous familiariser avec les méthodes avancées, qui peuvent être utiles à mesure que la bibliothèque de tests se développe.

Introduction à l'application par Linter

Tox et Travis CI ont une configuration d'équipe de test. Dans ce didacticiel, nous avons utilisé python -m unittest discovery comme équipe de test.

Vous pouvez fournir une ou plusieurs commandes dans ces outils, qui ajouteront de nouveaux outils pour améliorer la qualité de l'application.

Une telle application est le linter. Il examinera votre code et laissera des commentaires. Ainsi, il peut donner des conseils sur les erreurs, corriger les espaces de fin et même anticiper les bugs potentiels.

Pour en savoir plus sur les linters, consultez le didacticiel sur la qualité du code Python .

Peluchage passif avec flocon8

flake8 est un linter populaire qui laisse des commentaires sur le style de votre code conformément à la spécification PEP 8 .

Vous pouvez installer flake8 utilisant pip:

 $ pip install flake8 

Ensuite, vous pouvez exécuter flake8 pour un seul fichier, dossier ou modèle:

 $ flake8 test.py test.py:6:1: E302 expected 2 blank lines, found 1 test.py:23:1: E305 expected 2 blank lines after class or function definition, found 1 test.py:24:20: W292 no newline at end of file 

Vous verrez une liste d'erreurs et d'avertissements dans votre code trouvé par flake8 .
flake8 peut être configuré sur la ligne de commande ou dans le fichier de configuration du projet. Si vous souhaitez ignorer certaines règles, par exemple E305, illustré ci-dessus, vous pouvez le définir dans la configuration. flake8 vérifiera le fichier flake8 dans le dossier du projet ou le fichier setup.cfg . Si vous souhaitez utiliser Tox, vous pouvez ajouter la flake8 configuration tox.ini à tox.ini .

Cet exemple ignore les répertoires .git et __pycache__ , ainsi que la règle E305. De plus, la longueur maximale d'une chaîne passe de 80 caractères à 90. Vous vous rendrez compte à un moment donné que la limite standard de 79 caractères par ligne ne convient pas aux tests pouvant contenir des noms de méthode longs, des littéraux de chaîne avec des valeurs de test et d'autres longues données. En règle générale, pour les tests, augmentez la longueur de la chaîne à 120 caractères:

 [flake8] ignore = E305 exclude = .git,__pycache__ max-line-length = 90 

Alternativement, vous pouvez fournir ces options sur la ligne de commande:

 $ flake8 --ignore E305 --exclude .git,__pycache__ --max-line-length=90 

Une liste complète des paramètres se trouve sur le site de documentation .
Vous pouvez maintenant ajouter flake8 à votre configuration CI. Pour Travis CI, cela ressemblera à ceci:

 matrix: include: - python: "2.7" script: "flake8" 

Travis lira la configuration en .flake8 et ne pourra pas terminer la construction s'il y a des erreurs de peluches. Assurez-vous d'ajouter la dépendance flake8 au fichier requirements.txt .

Linting agressif avec le formateur de code

flake8 est un linter passif qui ne recommande que des modifications; vous devrez les saisir vous-même dans le code. Le formateur de code est une approche plus agressive. Il modifie automatiquement le code en fonction des styles et des dispositions.

black est un formateur très inexorable. Il n'a pas de réglages et c'est très méticuleux. Ce qui en fait un excellent outil à insérer dans votre pipeline de test.

Remarque: le noir nécessite Python version 3.6 et supérieure.

Vous pouvez installer du black aide de pip:

 $ pip install black 

Ensuite, pour démarrer à partir de la ligne de commande, spécifiez le fichier ou le répertoire que vous souhaitez formater:

 $ black test.py 

Gardez le code de test propre

Vous remarquerez peut-être que lors de l'écriture de tests, vous copiez-collez des fragments de code beaucoup plus souvent que lors de la création d'applications régulières. De temps en temps, les tests peuvent être très monotones, mais ce n'est pas une raison pour laisser tomber le code sous une forme inexacte et fragmentée.

Au fil du temps, la dette technique s'accumulera dans votre code de test, et effectuer les changements nécessaires pour des changements importants dans le code d'application dans les tests se révélera très difficile simplement en raison de la structure.

Lors de la rédaction des tests, essayez de suivre le principe SEC: ne vous répétez pas.

Les montages et fonctions de test sont un excellent moyen d'écrire du code facile à maintenir. N'oubliez pas non plus la facilité de lecture. Envisagez de déployer des outils de peluchage tels que flake8 dans votre code de test:

 $ flake8 --max-line-length=120 tests/ 

Les tests pour détecter les baisses de productivité entre les modifications

Il existe de nombreuses façons de comparer le code en Python. La bibliothèque standard possède un module timeit qui planifie les fonctions plusieurs fois et vous montre la distribution. Dans cet exemple, test () sera exécuté 100 fois, puis la sortie sera donnée en utilisant print ():

 def test(): # ... your code if __name__ == '__main__': import timeit print(timeit.timeit("test()", setup="from __main__ import test", number=100)) 

Si vous décidez d'utiliser pytest comme lanceur de test, consultez le plugin pytest-benchmark. Il fournit un appareil Pytest appelé benchmark. Tout objet appelé peut être passé benchmark (), il analyse le temps des résultats de pytest appelés.

Vous pouvez installer pytest-benchmark depuis PyPl en utilisant pip:

 $ pip install pytest-benchmark 

Ensuite, vous pouvez ajouter un test en utilisant fixture et en passant l'objet appelé à l'exécution:

 def test_my_function(benchmark): result = benchmark(test) 

L'exécution de pytest vous donnera des résultats de référence:



Vous pouvez en savoir plus sur le site de documentation .

Test pour identifier les erreurs de sécurité

Un autre test que vous devez exécuter sur votre application consiste à vérifier les erreurs courantes et les failles de sécurité.

Installez le bandit de PyPl en utilisant pip:

 $ pip install bandit 

Ensuite, vous pouvez passer le nom de votre module d'application avec l'indicateur -r et obtenir de brèves informations:

 $ bandit -r my_sum [main] INFO profile include tests: None [main] INFO profile exclude tests: None [main] INFO cli include tests: None [main] INFO cli exclude tests: None [main] INFO running on Python 3.5.2 Run started:2018-10-08 00:35:02.669550 Test results: No issues identified. Code scanned: Total lines of code: 5 Total lines skipped (#nosec): 0 Run metrics: Total issues (by severity): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Total issues (by confidence): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Files skipped (0): 

Comme avec flake8 , les bandit indicateur de bandit peuvent être configurées, et si vous souhaitez ignorer certaines d'entre elles, vous pouvez ajouter le fragment suivant au fichier setup.cfg avec des paramètres:

 [bandit] exclude: /test tests: B101,B102,B301 

Plus d'informations sur le site GitHub .

Conclusion

Python a rendu les tests disponibles grâce aux commandes et bibliothèques intégrées nécessaires pour vérifier le bon fonctionnement des applications. Il est facile de commencer les tests en Python: vous pouvez utiliser unittest et écrire de petites méthodes faciles à maintenir pour tester le code.

À mesure que vous en apprendrez plus sur les tests et l'extension de votre application, envisagez de passer à l'un des frameworks de test tels que pytest pour commencer à utiliser des fonctionnalités plus avancées.

Merci d'avoir lu. Avoir un avenir indubitable avec Python!

Et pour ceux qui ont lu l'article, nous avons une autre excellente nouvelle. En ce moment, vous pouvez obtenir le cours de développeur Python avec une remise de 10 000 roubles!

Première partie
Deuxième partie

Source: https://habr.com/ru/post/fr444204/


All Articles