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 environnementsJusqu'à 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 ToxTox 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épendancesTox 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 testsJusqu'à 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 ensuiteVous 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 LinterTox 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 flocon8flake8 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 codeflake8
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 propreVous 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 modificationsIl 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():
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 (
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 .
ConclusionPython 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 partieDeuxième partie