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.
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:
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_
.
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:
send_keys
per escriure al camp de text i enviem el formulari localitzant el submit
i clicant-lo.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:
Pàgina de login de l'app:
Testejant l'app.
En aquesta pàgina s'expliquen molts conceptes de testing en Flask i pytest.