[PYTHON] Test unitaire du flacon avec pytest

introduction

Les tests de développement sont généralement automatisés à l'aide de bibliothèques et de frameworks. J'ai donc essayé d'utiliser pytest pour automatiser le test unitaire de flask, mais je n'ai pas trouvé d'exemple simple, j'ai donc résumé un exemple simple et une brève explication.

environnement

Installation

pip install pytestInstallez simplement avec.

Ce dont vous avez besoin pour automatiser avec pytest

Ce dont vous avez besoin pour automatiser un test unitaire avec pytest est la source à tester (le développement à tester) et la source qui décrit la méthode de test. La source de la méthode de test donne les arguments à tester et les résultats de la fonction et décrit comment les comparer.

Automatisation simple des tests des unités fonctionnelles

Avant d'automatiser le test unitaire de flask, voyons comment utiliser pytest via une fonction simple.

Source à tester

Comme le test n'est pas possible sans la source à tester, préparez la source à tester. Dans l'exemple, nous avons préparé une fonction qui ajoute et renvoie des arguments, mais s'il s'agit du développement d'origine, le produit de développement est équivalent.

testing_mod.py


def add_calc(a, b):
    return a + b

Source qui décrit la méthode de test

Créez une source qui décrit comment appeler la source à tester et le résultat de la source. Cette source appelle la fonction de la source sous test, compare le résultat renvoyé par la fonction sous test avec le résultat supposé ici, et s'il est correct, c'est OK, et s'il est incorrect, c'est NG. Dans l'exemple, si le testing_mod à tester est importé avec ```import testing_mod``et que 1 et 2 sont passés à`` testing_mod.add_calc () ``et que le résultat renvoyé est 3, c'est OK. Je suis.

py_test_main.py


import pytest
import testing_mod

def test_ok_sample():
    result = testing_mod.add_calc(1, 2)
    assert 3 == result

Exécution de test unitaire

Maintenant que nous avons la source de la cible de test et de la méthode de test, nous voulons voir le résultat pour chaque fonction, alors exécutez-le avec l'option -v.

# pytest -v py_test_main.py

py_test_main.py .         [100%]                                                                                                                                       
====== 1 passed in 0.05s ======
PS C:\Users\xxxx\program\python> pytest -v py_test_main.py                                   
====== test session starts ======
platform win32 -- Python 3.6.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 -- c:\users\xxxx\appdata\local\programs\python\python36-32\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\xxxx\program\python
collected 1 item                                                                                                                     
py_test_main.py::test_ok_sample PASSED     [100%] 

====== 1 passed in 0.02s ======

En regardant le résultat, le test_ok_sample créé précédemment est devenu PASSED et s'est terminé normalement, donc le test est OK. Si vous créez de nombreuses fonctions, le nombre de fonctions affichées augmentera.

Automatisation simple des tests unitaires de flacons

Automatise les tests unitaires du flacon. Contrairement à la simple automatisation des fonctions ci-dessus, flask nécessite une communication du client, mais les tests unitaires utilisent la fonctionnalité de flask pour automatiser les tests unitaires.

Source à tester

Créez la source du flacon. Dans l'exemple, créez quelque chose qui renvoie la chaîne racine lors de l'accès à /. S'il s'agit du développement d'origine, le produit de développement est équivalent. Pour plus d'informations sur les flacons, voir Un résumé des flacons précédents.

flask_mod.py


from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def root():
    return "root"

Source qui décrit la méthode de test

Contrairement à la source de la fonction, la source qui décrit comment tester le flask doit générer un client du flask, puis faire une demande à l'aide de ce client pour vérifier le résultat.

Générer un client de flacon de test

Tout d'abord, générez un client de test. Importez l'application à partir de la source testée et modifiez la configuration de test de l'application sur true. Ensuite, utilisez l'application test_client () '' pour générer le client. Dans l'exemple ci-dessous, l'importation de la source sous test serait from flask_mod import app`.

py_test_main.py


import pytest
from flask_mod import app

def test_flask_simple():
    app.config['TESTING'] = True
    client = app.test_client() 

Exécution de la fonction sous test

À l'aide du client généré ci-dessus, émettez une requête à l'URL sous test à l'aide des fonctions get et post. Le résultat est une réponse de flask, donc vérifiez assert de pytest pour voir s'il donne la réponse attendue. Dans l'exemple ci-dessous, result = client.get ('/') '' `` émet une requête get vers / et le résultat est stocké dans result, donc les données (corps) et la racine sont comparées. Je vais.

py_test_main.py


import pytest
from flask_mod import app

def test_flask_simple():
    app.config['TESTING'] = True
    client = app.test_client() 
    result = client.get('/')
    assert b'root' == result.data

Exécution de test unitaire

Maintenant que vous avez la source de la cible de test et de la méthode de test, exécutez-la.

# pytest -v py_test_main.py

====== 1 passed in 0.22s =======
PS C:\Users\xxxx\program\python\flask> pytest -v .\pytest_flask.py
====== test session starts ======
platform win32 -- Python 3.6.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 -- c:\users\xxxx\appdata\local\programs\python\python36-32\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\xxxx\program\python\flask
collected 1 item

pytest_flask.py::test_flask_simple PASSED  [100%]

====== 1 passed in 0.20s =======

En regardant le résultat, le test_flask_simple créé précédemment est devenu PASSED et s'est terminé normalement, donc le test est OK. Si vous créez beaucoup de fonctions, le nombre de fonctions augmentera ici.

Exemple lorsque le test unitaire est une erreur

À titre de test, voyons le résultat lorsque la chaîne de caractères à comparer avec la chaîne de caractères renvoyée par flask est échantillonnée.

# pytest -v pytest_flask.py
======= test session starts =======
platform win32 -- Python 3.6.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 -- c:\users\xxxx\appdata\local\programs\python\python36-32\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\xxxx\program\python\flask
collected 1 item

pytest_flask.py::test_flask_simple FAILED                                                                                                                          [100%]

============ FAILURES ============= 
____________ test_flask_simple ____________

    def test_flask_simple():
        app.config['TESTING'] = True
        client = app.test_client()
        result = client.get('/')
>       assert b'sample' == result.data
E       AssertionError: assert b'sample' == b'root'
E         At index 0 diff: b's' != b'r'
E         Full diff:
E         - b'sample'
E         + b'root'

pytest_flask.py:8: AssertionError
======== 1 failed in 0.26s ========

Puisque sample et root sont différents, ```AssertionError: assert b'sample '== b'root'` `` s'affiche.

en conclusion

L'automatisation des tests unitaires peut être très pratique si l'effort requis pour créer un script d'automatisation est faible. Le cadre est un moyen de réduire cet effort, mais en plus de ce qui précède, il existe d'autres fonctions utiles telles que le prétraitement et le post-traitement du test, et essayer plusieurs paramètres avec la même méthode de test. ~~ Ensuite, je vais résumer les méthodes pratiques. ~~ Une méthode pratique est résumée dans Donner les paramètres du test unitaire de flacon proprement avec pytest. De plus, la façon de vérifier la couverture est résumée dans Vérifier la couverture python avec pytest-cov.

Recommended Posts

Test unitaire du flacon avec pytest
Environnement de test unitaire Flask (test_client)
Tester la sortie standard avec Pytest
Sortie du journal de test unitaire avec python
Contrôle des relances de test avec Luigi + pytest
Démarrage du développement piloté par les tests avec PySide & Pytest
test unitaire numpy
Donner les paramètres de nettoyage pytest pour le test unitaire du flacon
Rollback DB pour chaque test avec Flask + SQLAlchemy
Jugement des nombres premiers avec Python
Renforcez avec le test de code ⑦
Renforcez avec le test de code ⑨
Utilisez Mock avec pytest
Renforcez avec le test de code ⑤
Renforcez avec le test de code ④
Jugement des nombres premiers avec python
Restriction IP avec Flask
Renforcez avec le test de code ②
Effectuer un test unitaire de Databricks Notebook
Renforcez avec le test de code ①
modèle de test unitaire python
Bonjour le monde sur flacon
Programmation avec Python Flask
Renforcez avec le test de code ⑧
Renforcez avec le test de code ⑨
Déployez Flask avec ZEIT maintenant
Tester les logiciels embarqués avec Google Test
Touch Flask + courir avec Heroku
Bonjour le monde avec Flask + Hamlish
API avec Flask + uWSGI + Nginx
Développement d'applications Web avec Flask
Test de charge Websocket avec Locust
Voir la couverture du flacon avec pytest-cov
Application Web avec Python + Flask ② ③
Téléchargement de fichiers avec Flask + jQuery
Application Web avec Python + Flask ④
[Pytest] [mock] Les débutants en développement Web ont résumé le test unitaire et simulé en python.
Développement piloté par les tests avec Django Partie 3
[Connexion LINE] Vérifier l'état avec Flask
Développement piloté par les tests avec Django Partie 4
Développement piloté par les tests avec Django Partie 6
[Mémo] Liens lors du développement avec Flask
Créer un serveur Flask avec Docker
Exécutez l'application avec Flask + Heroku
Persistez le serveur d'API Flask avec Forever
Développement piloté par les tests avec Django Partie 2
Authentification de base, authentification Digest avec Flask
Créer un environnement Flask avec Dockerfile + docker-compose.yml
Développement piloté par les tests avec Django Partie 1
Création d'un babillard avec flask
Développement d'applications avec Docker + Python + Flask
Développement piloté par les tests avec Django Partie 5
Fonction de téléchargement d'image avec Vue.js + Flask
Paramètre pour entrer le contenu de la bibliothèque avec pytest et effectuer un test de débogage