Framework UnitTest - Module Py.test

C'est en 2004 que Holger Krekel renomma son stdpackage, dont le nom était souvent confondu avec celui de la bibliothèque standard livrée avec Python, au nom (légèrement moins déroutant) «py». Bien que le paquet contienne plusieurs sous-paquets, il est maintenant presque entièrement connu pour son framework py.test.

Le framework py.test a mis en place un nouveau standard pour les tests Python et est devenu très populaire auprès de nombreux développeurs aujourd'hui. Les idiomes élégants et pythoniques qu'il a introduits pour l'écriture de tests ont permis aux suites de tests d'être écrites dans un style beaucoup plus compact.

py.test est une alternative sans passe-partout au module standard unittest de Python. Bien qu'il s'agisse d'un outil de test complet et extensible, il se vante d'une syntaxe simple. Créer une suite de tests est aussi simple que d'écrire un module avec quelques fonctions.

py.test fonctionne sur tous les systèmes d'exploitation POSIX et WINDOWS (XP / 7/8) avec les versions Python 2.6 et supérieures.

Installation

Utilisez le code suivant pour charger le module pytest dans la distribution Python actuelle ainsi qu'un utilitaire py.test.exe. Les tests peuvent être exécutés en utilisant les deux.

pip install pytest

Usage

Vous pouvez simplement utiliser l'instruction assert pour affirmer les attentes du test. L'introspection d'assert de pytest rapportera intelligemment les valeurs intermédiaires de l'expression d'assert, vous libérant ainsi du besoin d'apprendre les nombreux noms deJUnit legacy methods.

# content of test_sample.py
def func(x):
   return x + 1
   
def test_answer():
   assert func(3) == 5

Utilisez la ligne de commande suivante pour exécuter le test ci-dessus. Une fois le test exécuté, le résultat suivant s'affiche sur la console -

C:\Python27>scripts\py.test -v test_sample.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyth
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 1 items
test_sample.py::test_answer FAILED
================================== FAILURES =====================
_________________________________ test_answer _________________________________
   def test_answer():
>  assert func(3) == 5
E     assert 4 == 5
E     + where 4 = func(3)
test_sample.py:7: AssertionError
========================== 1 failed in 0.05 seconds ====================

Le test peut également être exécuté à partir de la ligne de commande en incluant le module pytest à l'aide du commutateur –m.

python -m pytest test_sample.py

Regroupement de plusieurs tests dans une classe

Une fois que vous commencez à avoir plus de quelques tests, il est souvent judicieux de regrouper les tests de manière logique, en classes et en modules. Écrivons une classe contenant deux tests -

class TestClass:
   def test_one(self):
      x = "this"
      assert 'h' in x
   def test_two(self):
      x = "hello"
      assert hasattr(x, 'check')

Le résultat du test suivant sera affiché -

C:\Python27>scripts\py.test -v test_class.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyt
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 2 items
test_class.py::TestClass::test_one PASSED
test_class.py::TestClass::test_two FAILED
================================== FAILURES =====================
_____________________________ TestClass.test_two ______________________________
self = <test_class.TestClass instance at 0x01309DA0>

   def test_two(self):
      x = "hello"
>  assert hasattr(x, 'check')
E     assert hasattr('hello', 'check')

test_class.py:7: AssertionError
===================== 1 failed, 1 passed in 0.06 seconds ======================