Taula de continguts

Python web test amb Pytest

By Holger Krekel - https://pypi.org/project/pytest/, CC BY 2.5, https://commons.wikimedia.org/w/index.php?curid=116199948

Referències:

, , , , , , , , , , , , , , , , , , , ,


Per poder seguir els exemples d'aquesta pàgina cal que abans hagis fet l'app bàsica amb el formulari que apareix a Python web.

Pytest + client de tests de Flask

En aquesta primera aproximació testejarem la webapp Flask amb un client intern de pytest, és a dir, que no farà servir un browser real.

Fem-li un cop d'ull a la documentació de test amb Flask.

Primera cosa que cal fer, instal·lar el mòdul de tests pytest:

(env) $ pip install pytest

Després, ens diuen que fem un test skeleton, però l'exemple que ens donen té una configuració avançada per posar a punt la base de dades, utilitzant una app factory, etc.

Nosaltres implementarem una versió simplificada sobre l'arxiu test_web.py. Com podeu veure, Flask disposa d'un client test_client que permet accedir als endpoints o rutes i comprovar els continguts rebuts mitjançant assert:

test_web.py
import pytest
 
from web import app
 
@pytest.fixture
def client():
    with app.test_client() as client:
        yield client
 
def test_landing_page(client):
	rv = client.get('/')
	assert b'Hello, World' in rv.data

Correm els tests amb la comanda pytest:

(env) $ pytest
============================ test session starts =============================
platform linux -- Python 3.8.10, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: /home/enric/dev21/basicflask
collected 1 item                                                             

test_web.py .                                                          [100%]

============================= 1 passed in 0.09s ==============================

Com podem veure, pytest posa en marxa els tests dels arxius que comencen per test_, i dins d'aquests, corre les funcions que també comencin per test_.


Pytest amb Selenium

Selenium és una llibreria per automatitzar la utilització d'un browser real.

Primer caldrà que instal·lem el package de pytest-selenium:

(env) $ pip install pytest-selenium

I també el driver per a automatitzar el Firefox:

$ sudo apt install firefox-geckodriver

Documentacions importants:

Posem aquí un test doble fonamental:

test_web.py
import pytest
from selenium.webdriver.common.by import By
 
def test_home(selenium):
    selenium.get('http://localhost:5000')
    # podem examinar el què ens retorna el browser a "page_source"
    assert "Hello, World" in selenium.page_source
 
 
def test_form(selenium):
    # carreguem la pàgina del formulari
    selenium.get('http://localhost:5000/formulari')
 
    # busquem el quadre de text i hi escrivim un nom
    elem = selenium.find_element(By.TAG_NAME,"input")
    elem.send_keys("manolo")
 
    # cerquem el botó de submit i el cliquem
    submit = selenium.find_element(By.XPATH,"//input[@type='submit']")
    submit.click()
 
    # comprovem que el missatge de salutació contingui
    # el nom introduit prèviament al formulari
    assert "Salut, manolo" in selenium.page_source

Per posar en marxa el test ens caldrà 2 shells. En la 1a, posem en marxa la app:

(env) $ flask --app web run

I a la 2a shell engeguem els tests:

(env) $ pytest --driver Firefox

Fixa't en què per trobar elements fem servir find_element amb un By.XPATH.

Pots trobar més info de com localitzar elements a la doc oficial de Selenium per Python:


Exercici : login

Pàgina de login de l'app:

Testejant l'app.


Per saber més

En aquesta pàgina s'expliquen molts conceptes de testing en Flask i pytest.