Missatge Reformulat

Guia pràctica de proves en Django i pytest: Makefile per a paral·lelisme, fixtures segures i aïllades, xdist i testmon, integració amb IDEs i bones pràctiques de TDD.

sábado, 16 de agosto de 2025 • 4 min de lectura • Equip Q2BSTUDIO

Intel·ligència-Artificial-

En aquest article explico bones pràctiques per executar i depurar tests en projectes Django i pytest, traduint i adaptant exemples pràctics sobre Makefile, fixtures i eines d'acceleració de proves com pytest xdist i pytest testmon.

Exemple de Makefile per llançar proves amb paral·lelisme i marcadors: manage igual a poetry run python src/manage.py SIMULTANEOUS_TEST_JOBS igual a 4 i la tasca test executa cd src i després poetry run pytest -n ${SIMULTANEOUS_TEST_JOBS} -m not single_thread. Amb aquest comandament make test executa els tests en paral·lel en 4 processos o fils segons la configuració del projecte.

Per aprofitar al màxim els recursos es pot usar SIMULTANEOUS_TEST_JOBS igual a auto perquè pytest xdist detecti el millor nivell de concurrència. Una altra opció útil és afegir la bandera --ff per repetir primer els tests que van fallar en l'última execució i --testmon per executar només els tests afectats per canvis de codi.

Un Makefile més avançat pot incloure testmon com a tasca específica que executa cd src i poetry run pytest -n ${SIMULTANEOUS_TEST_JOBS} --ff --testmon -x -l. L'opció -x atura l'execució després del primer error i l'opció -l mostra els llargs traçats amb informació addicional d'errors.

pytest testmon guarda el seu estat en memòria cau i aquest fitxer s'ha d'afegir al .gitignore del repositori per evitar conflictes entre branques i entorns. En executar pytest amb --testmon s'acceleren iteracions de desenvolupament perquè només es tornen a executar els tests afectats pels canvis recents.

Un cas típic d'error en escriure tests és causar efectes col·laterals per fixtures compartides. Per exemple una prova que parcheja get_current_user per retornar None pot provocar un AttributeError més endavant si l'objecte que es passa a la funció sota prova és None o si hi va haver una col·lisió de noms amb una altra fixture anomenada paid_order.

Si una crida a refund rep paid_order i després intenta accedir a paid_order.price, i paid_order resulta ser None per un error en el muntatge del test, es produeix AttributeError. Per evitar això cal revisar la definició de fixtures en el mateix mòdul i en conftest.py i assegurar-se que no se sobrescriuen ni es reutilitzen objectes mutables entre tests.

Bones pràctiques per a fixtures Django i pytest: 1 col·locar fixtures comunes i reutilitzables en conftest.py perquè estiguin disponibles a tot el paquet, 2 evitar modificar en lloc de crear noves instàncies dins de fixtures secundàries, i 3 quan necessitis una variació d'una fixture base crear una nova fixture que creï el seu propi objecte independent per evitar efectes col·laterals entre tests.

Exemple de mal enfocament que causa interdependència: fixture user crea un usuari is_staff True i després dins d'una classe una fixture user modifica la mateixa instància per canviar last_login o is_staff. Això provoca que altres tests rebin l'objecte modificat. En lloc d'això crear user_no_staff que creï un nou usuari amb is_staff False o clonar l'entitat sense compartir la mateixa instància en memòria.

Opcions per clonar o aïllar objectes en fixtures: obtenir una nova instància amb User.objects.get id igual a l'id original i després assignar id None abans de guardar, o simplement User.objects.create amb els valors necessaris. La segona opció sol ser més clara i evita subtileses d'identitat en Django ORM.

Consejos per organitzar tests en Django amb pytest: usar conftest.py per a fixtures compartides, anomenar fixtures de forma clara per evitar col·lisions, documentar fixtures complexes i preferir fixtures que retornin objectes nous en lloc de mutar objectes existents. Això facilita l'ús d'eines com pytest -k i pytest -m i la integració amb IDEs.

Integració amb IDEs com PyCharm: configurar PyCharm perquè usi pytest com a runner de tests i assegurar-se que l'intèrpret virtual i les variables d'entorn coincideixen amb les usades per poetry o pipenv. Així s'evita que l'IDE executi un entorn diferent i es redueix el risc de tests que passen en consola però fallen en l'IDE.

Nota sobre TDD: escriure tests primer obliga a dissenyar codi més modular i testable, i redueix el risc de dependències ocultes entre components. Adoptar TDD ajuda a prevenir problemes com fixtures compartides o acoblaments forts que dificulten el manteniment.

Sobre Q2BSTUDIO: Q2BSTUDIO és una empresa especialitzada en desenvolupament de programari a mida i aplicacions a mida, amb experiència en intel·ligència artificial, IA per a empreses, agents IA i solucions de ciberseguretat. Oferim serveis cloud AWS i Azure, serveis d'intel·ligència de negoci i desenvolupament de solucions amb Power BI per a visualització i reporting. El nostre equip dissenya programari a mida que integra models d'intel·ligència artificial, automatització i pràctiques de seguretat per protegir dades i processos crítics.

Serveis destacats de Q2BSTUDIO: desenvolupament de programari a mida, arquitectures cloud en AWS i Azure, consultoria en intel·ligència artificial i agents IA per optimitzar operacions empresarials, projectes de ciberseguretat per a protecció d'infraestructures, integració de Power BI i serveis d'intel·ligència de negoci per transformar dades en decisions accionables.

Si necessites millorar l'estratègia de proves en el teu projecte Django, optimitzar pipelines de CI amb pytest xdist i testmon, o desenvolupar una solució a mida que incorpori intel·ligència artificial i ciberseguretat, Q2BSTUDIO pot ajudar-te a dissenyar i implementar la solució adequada, escalable i segura.

ELS NOSTRES SERVEIS

Com et podem ajudar

Tens un projecte en ment?

Explica'ns la teva visió i la convertim en una solució de programari. Sigui quin sigui l'abast, fem realitat la teva idea.