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.
pip install pytest
Installez simplement avec.
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.
Avant d'automatiser le test unitaire de flask, voyons comment utiliser pytest via une fonction simple.
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
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
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.
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.
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"
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.
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()
À 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
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.
À 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.
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