Tipus | Programari |
---|---|
Versió estable | |
Llicència | llicència MIT |
Característiques tècniques | |
Escrit en | Python |
Més informació | |
Lloc web | pytest.org (anglès) |
Guia d'usuari | Guia d'usuari |
| |
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.
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.[1]
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.[2]
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.[3][4][5][6]
É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.[7]
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.
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:
Les proves de Pytest verifiquen que el codi informàtic funciona com s'esperava [8] mitjançant proves que s'estructuren en una seqüència d'ordenar, actuar i afirmar coneguda com AAA.[9] 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).[9] [8] 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.[10] 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.