J'avais rarement écrit du ** "code de test" ** jusqu'à présent, mais j'ai eu l'occasion d'écrire du code de test python et j'ai appris à l'utiliser rapidement. Dans cet article, je me suis concentré sur l'utilisation de pytest, qui est un cadre de test unitaire de python.
Référence: document officiel (https://docs.pytest.org/en/latest/contents.html)
Un framework pour les tests unitaires en python. Il en existe un similaire appelé unittest, mais pytest semble être plus populaire. Voici les caractéristiques de pytest
pip install -U pytest
En gros, vous pouvez exécuter le test comme suit.
--Exécuter
pytest`Si vous entrez le nom du fichier et le nom de la méthode dans test_ *
, le code de test sera trouvé automatiquement (vous pouvez le spécifier vous-même).
test_sample.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
Créez le fichier test_sample.py ci-dessus et
Exécutez pytest
.
Ensuite, le résultat du test suivant s'affiche.
<détails> Le test d'exception est possible avec En créant une classe avec Un outil fourni pour mettre en place un environnement d'exécution de test.
Je vais en choisir quelques-uns utiles.
Voir ci-dessous pour plus de détails (https://docs.pytest.org/en/latest/fixture.html) tmpdir
L'appareil monkeypatch
L'appareil À ce stade, vous pouvez exécuter le test en remplaçant Vous pouvez également simuler des variables d'environnement avec
Recommended Posts
========================================== test session starts ===========================================
platform darwin -- Python 3.7.6, pytest-5.4.3, py-1.8.1, pluggy-0.13.1
rootdir: /Users/xin/work/study/pytest
plugins: hypothesis-5.5.4, arraydiff-0.3, remotedata-0.3.2, openfiles-0.4.0, doctestplus-0.5.0, astropy-header-0.1.2
collected 1 item
test_sample.py F [100%]
================================================ FAILURES ================================================
______________________________________________ test_answer _______________________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:5: AssertionError
======================================== short test summary info =========================================
FAILED test_sample.py::test_answer - assert 4 == 5
=========================================== 1 failed in 0.18s ============================================
Test de gestion des exceptions
pytest.raises
error_sample.py
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
Exécution de plusieurs tests dans une classe
Test
comme préfixe, vous pouvez tester les méthodes de test internes en même temps.test_class.py
class TestClass:
def test_one(self):
x = "this"
assert "h" in x
def test_two(self):
x = "hello"
assert hasattr(x, "check")
fixation
Qu'est-ce qu'un luminaire?
tmpdir
vous permet de créer un répertoire unique qui est temporairement disponible pendant les tests.test_tempdir.py
import os
def test_create_file(tmpdir):
p = tmpdir.mkdir("sub").join("hello.txt") #Créer un répertoire temporaire
p.write("content")
assert p.read() == "content"
assert len(tmpdir.listdir()) == 1
assert 0
monkeypatch
vous permet de simuler un objet.
Par exemple, supposons que vous ayez le code produit suivant, et qu'un get_value ()
est une fonction qui ne peut pas être facilement exécutée.monkeypatch_product.py
def return_value(): #Code produit
a = get_value()
return a
def get_value(): #Fonctions difficiles à exécuter
return 1
get_value ()
par votre propre fonction fictive par monkeypatch.setattr
.monkeypatch_test.py
import monkeypatch_product
#Code de test
def test_return_value(monkeypatch):
def mock_get_value():
return 100
#Remplacé par la fonction simulée
monkeypatch.setattr(monkeypatch_product, "get_value", mock_get_value)
res = monkeypatch_product.return_value()
assert res == 100
monkeypatch.setenv
.monkeypatch_env.py
import os
#Code produit
def get_os_user_lower():
username = os.getenv("USER")
if username is None:
raise OSError("USER environment is not set.")
return username.lower()
#Code de test
def test_get_os_user_lower(monkeypatch):
monkeypatch.setenv("USER", "TestingUser")
assert get_os_user_lower() == "testinguser"