# Pytest

Pytest és un infraestructura de proves de Python que es va originar a partir del projecte PyPy. Es pot utilitzar per escriure diversos tipus de proves de programari, com ara proves unitàries, proves d'integració, proves d'extrem a extrem i proves funcionals. Les seves característiques inclouen proves parametritzades, accessoris i reescriptura d'afirmacions.
Els accessoris de Pytest proporcionen els contextos per a les proves passant els noms dels paràmetres als casos de prova; la seva parametrització elimina codi duplicat per provar múltiples conjunts d'entrada i sortida; i les seves declaracions d'assert reescrites proporcionen resultats detallats per a les causes dels errors.

## Història

Pytest es va desenvolupar com a part d'un esforç de paquets de tercers per abordar les deficiències de test unitari del mòdul integrat de Python. Es va originar com a part de PyPy, una implementació alternativa de Python al CPython estàndard. Des de la seva creació a principis de 2003, PyPy ha posat un gran èmfasi en les proves. PyPy tenia proves d'unitat per al codi recent escrit, proves de regressió per a errors i proves d'integració mitjançant la suite de proves de CPython.
A mitjans de 2004, va sorgir un marc de prova anomenat utest i els col·laboradors de PyPy van començar a convertir els casos de prova existents a utest. Mentrestant, a EuroPython 2004 es va inventar una biblioteca estàndard complementària per a proves, anomenada std. Aquest paquet exposava els principis, com ara la reescriptura d'assert, del que després es convertiria en pytest. A finals de 2004, el projecte std es va canviar el nom a py, std.utest es va convertir en py.test i la biblioteca py es va separar de PyPy. El novembre de 2010, pytest 2.0.0 es va llançar com un paquet independent de py. Encara es deia py.test fins a l'agost de 2016, però després del llançament de pytest 3.0.0, el punt d'entrada recomanat de la línia d'ordres es va convertir en pytest.
Pytest ha estat classificat per la plataforma de seguretat dels desenvolupadors Snyk com un dels projectes clau de l'ecosistema de Python a causa de la seva popularitat. Alguns projectes coneguts que van passar a pytest des de unittest i nose (un altre paquet de proves) inclouen els de Mozilla i Dropbox.

## Característiques
### Prova parametritzada

És un patró comú a les proves de programari enviar valors mitjançant funcions de prova i comprovar la sortida correcta. En molts casos, per provar a fons les funcionalitats, cal provar diversos conjunts d'entrada/sortida, i escriure aquests casos per separat provocaria codi duplicat, ja que la majoria de les accions romandrien iguals, només diferint en els valors d'entrada/sortida. La funció de prova parametritzada de Pytest elimina aquest codi duplicat combinant diferents iteracions en un sol cas de prova, després executant aquestes iteracions i mostrant el resultat de cada prova per separat.
Les proves parametritzades a pytest estan marcades pel decorador @pytest.mark.parametrize(argnames, argvalues), on el primer paràmetre, argnames, és una cadena de noms separats per comes i argvalues és una llista de valors per passar a argnames. Quan hi ha diversos noms en argnames, argvalues seria una llista de tuples on els valors de cada tupla corresponen als noms dels argnames per índex. Els noms dels argnames es passen a la funció de prova marcada pel decorador com a paràmetres. Quan pytest executa aquestes proves decorades, cada parell d' argnames i argvalues constituiria una execució independent amb la seva pròpia sortida de prova i identificador únic. L'identificador es pot utilitzar per executar parells de dades individuals.

### Reescriptura afirmativa

Quan s'escriuen proves de programari, la declaració assert és un mitjà principal per comunicar la fallada de la prova, on els valors esperats es comparen amb els valors reals.  Tot i que la paraula clau assert integrada de Python només generaria AssertionError sense detalls en casos d'error, pytest reescriu la paraula clau assert de Python i proporciona una sortida detallada per a les causes dels errors, com ara quines expressions a la declaració assert avaluen. Es pot fer una comparació amb unittest (el mòdul integrat de Python per a proves) d'assert declaracions:

### Accessoris Pytest

Les proves de Pytest verifiquen que el codi informàtic funciona com s'esperava mitjançant proves que s'estructuren en una seqüència d'ordenar, actuar i afirmar coneguda com AAA. Els seus accessoris proporcionen el context per a les proves. Es poden utilitzar per posar un sistema en un estat conegut i passar dades a funcions de prova. Els accessoris constitueixen pràcticament la fase d'arranjament en l'anatomia d'una prova (AAA, abreviatura de arrange, act, assert). Els accessoris de Pytest es poden executar abans dels casos de prova com a configuració o després dels casos de prova per a la neteja, però són diferents de les configuracions i desmuntatges de la prova unitària i del nas (un altre marc de prova de Python de tercers). Les funcions declarades com a accessoris de pytest estan marcades pel @pytest.fixture decorator, els noms del qual es poden passar a les funcions de prova com a paràmetres. Quan pytest troba els noms dels aparells als paràmetres de les funcions de prova, primer cerca aquests aparells al mateix mòdul i, si no els troba, els cerca al fitxer conftest.py.

## Referències

* ↑ Bolz-Tereick, Carl Friedrich. «PyPy Status Blog» (en anglès). PyPy, 09-09-2018. Arxivat de l'original el 6 July 2022. [Consulta: 12 maig 2022].
* ↑ «History» (en anglès). pytest. Arxivat de l'original el 16 May 2022. [Consulta: 13 abril 2022].
* ↑ «Project examples» (en anglès). Pytest. Arxivat de l'original el 1 February 2022. [Consulta: 1r febrer 2022].
* ↑ Koorapati, Nipunn. «Open Sourcing Pytest Tools» (en anglès). Dropbox. Arxivat de l'original el 11 June 2024. [Consulta: 1r febrer 2022].
* ↑ Oliveira, Bruno. pytest Quick Start Guide (en anglès). Packt Publishing, August 2018. ISBN 978-1-78934-756-2.
* ↑ «pytest» (en anglès). Snyk. Arxivat de l'original el 27 June 2022. [Consulta: 12 maig 2022].
* ↑ Okken, Brian. Python Testing with Pytest (en anglès). 1st. The Pragmatic Bookshelf, September 2017. ISBN 9781680502404.
* 1 2 Viafore, Patrick. Robust Python (en anglès). O'Reilly Media, Inc., 12 July 2021. ISBN 978-1-0981-0061-2.
* 1 2 Khorikov, Vladimir. Unit Testing Principles, Practices, and Patterns (en anglès). Published by Manning Publications, January 2020. ISBN 9781617296277.
* ↑ «About fixtures» (en anglès). Pytest. Arxivat de l'original el 7 February 2022. [Consulta: 7 febrer 2022].