Diferencia entre revisiones de «Pruebas de las Vistas 21-23»
(Página creada con «Página_Principal -> 2022/2023 -> Prácticas - 22/23 = Prerrequisitos = * Ver video de presentación aquí: [https://videos.us.es/media/P2-+Pruebas/1_kj0hbxrx...») |
|||
(No se muestran 2 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Los módulos ofrecen funcionalidad en la vistas (views.py) que necesitan ser probadas. Algunas de esas vistas pueden ser probadas a través de llamada a las API REST que ofrecen. Otrás, sin embargo, ofrecen una vista HTML que tendremos que probar con otros frameworks como Selenium. | Los módulos ofrecen funcionalidad en la vistas (views.py) que necesitan ser probadas. Algunas de esas vistas pueden ser probadas a través de llamada a las API REST que ofrecen. Otrás, sin embargo, ofrecen una vista HTML que tendremos que probar con otros frameworks como Selenium. | ||
Línea 147: | Línea 93: | ||
</source> | </source> | ||
− | [ | + | [[link3]] |
* '''Importante''' estos tests los podemos ejecutar desde dentro del propio sistema django o bien implementarlos para ejecutarlos de manera autonoma | * '''Importante''' estos tests los podemos ejecutar desde dentro del propio sistema django o bien implementarlos para ejecutarlos de manera autonoma | ||
Revisión actual del 11:30 3 oct 2022
Los módulos ofrecen funcionalidad en la vistas (views.py) que necesitan ser probadas. Algunas de esas vistas pueden ser probadas a través de llamada a las API REST que ofrecen. Otrás, sin embargo, ofrecen una vista HTML que tendremos que probar con otros frameworks como Selenium.
Pruebas de APIs
Decide tiene implementada una clase para usar como base a la hora de implementar los test de interacción con APIs, BaseTestCase. Esa clase nos ofrece un client para hacer llamadas REST además de métodos de login y logout para simular el ingreso de un usuario en el sistema.
En el siguiente ejemplo podemos ver como se realizar una prueba donde se intenta realizar una acción nula sobre una votación ya creada. El resultado esperado es un 400.
def test_update_voting_400(self):
v = self.create_voting()
data = {} #El campo action es requerido en la request
self.login()
response = self.client.put('/voting/{}/'.format(v.pk), data, format= 'json')
self.assertEquals(response.status_code, 400)
Ejercicio 1
Implemente una prueba que cree una votación a através de su API y la recupere del modelo.
Selenium es un framework para testing y automatización de acciones web en general que nos permite simular como actuaría un usuario frente a nuestra aplicación[[1]]
En nuestro caso usaremos selenium dada la dificultad de probar las vistas en django. Estas vistas, normalmente, tienen que lidiar con dependencias AJAX, Javascript, etc. para poder ejecutarse normalmente.
Por ejemplo podemos probar si el acceso a la web de login es correcto o no.
Ejercicio 2
Instalamos selenium
$ pip install selenium
Instalamos, si no lo hemos hecho ya, chromiun y el driver para chromium que se encargará de reproducir el código dentro del navegador
sudo apt install chromium-browser chromium-chromedriver
Finalmente, escribimos el código de nuestro test. Los test de Selenium requerirán que django levante el servidor durante las pruebas. Estos casos de prueba deberan extender de StaticLiveServerTestCase para que funcione correctamente. Sí, además, queremos hacer uso de la funcionalidad que nos daba BaseTestCase, crearemos un atrbuto para ello:
from django.test import TestCase
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from base.tests import BaseTestCase
class AdminTestCase(StaticLiveServerTestCase):
def setUp(self):
#Load base test functionality for decide
self.base = BaseTestCase()
self.base.setUp()
options = webdriver.ChromeOptions()
options.headless = True
self.driver = webdriver.Chrome(options=options)
super().setUp()
def tearDown(self):
super().tearDown()
self.driver.quit()
self.base.tearDown()
...
Se ha marcado la opcion headless para que Chrome no se abra visualmente y así pueda ser ejecutado en servidores sin interfaz gráfica. Si eliminamos esa línea, veremos como Chrome se abre y se navega por el sistema decide.
Un método para comprobar que un login es correcto, sería:
def test_simpleCorrectLogin(self):
self.driver.get(f'{self.live_server_url}/admin/')
self.driver.find_element(By.ID,'id_username').send_keys("admin")
self.driver.find_element(By.ID,'id_password').send_keys("qwerty",Keys.ENTER)
print(self.driver.current_url)
#In case of a correct loging, a element with id 'user-tools' is shown in the upper right part
self.assertTrue(len(self.driver.find_elements(By.ID,'user-tools'))==1)
- Importante estos tests los podemos ejecutar desde dentro del propio sistema django o bien implementarlos para ejecutarlos de manera autonoma
Ejercicio 3
Implementar un test para comprobar el correcto funcionamiento al introducir un login incorrecto
Ejercicio 4
Implementar un test para crear una pregunta.
Ejercicio 5
Para crear scripts con navegaciones más largas y complejas, podemos descargar e instalar la extensión de selenium para nuestro navegador y registrar así los diferentes pasos de nuestra prueba y, posteriormente, integrarlo dentro de nuestra prueba en Python:
- Replicar la prueba
- Integrarlo dentro de nuestra clase en Python