Diferencia entre revisiones de «Pruebas de las Vistas 20-21»
(Página creada con «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 of...») |
m (habrá -> abra (del verbo abrir, no de haber)) |
||
(No se muestran 5 ediciones intermedias de 2 usuarios) | |||
Línea 11: | Línea 11: | ||
data = {} #El campo action es requerido en la request | data = {} #El campo action es requerido en la request | ||
self.login() | self.login() | ||
− | response = self.client.put('/voting/{}'.format(v.pk), data, format= 'json') | + | response = self.client.put('/voting/{}/'.format(v.pk), data, format= 'json') |
self.assertEquals(response.status_code, 400) | self.assertEquals(response.status_code, 400) | ||
</source> | </source> | ||
Línea 75: | Línea 75: | ||
</source> | </source> | ||
− | Se ha marcado la opcion ''headless'' para que Chrome no se | + | Se ha marcado la opcion ''headless'' para que Chrome no se abra visualmente y así pueda ser ejecutado en servidores sin interfaz gráfica. |
Un método para comprobar que un login es correcto, sería: | Un método para comprobar que un login es correcto, sería: | ||
Línea 89: | Línea 89: | ||
self.assertTrue(len(self.driver.find_elements_by_id('user-tools'))==1) | self.assertTrue(len(self.driver.find_elements_by_id('user-tools'))==1) | ||
+ | </source> | ||
+ | [https://hdvirtual.us.es/discovirt/index.php/s/3tg2CwNyT3X22nq test_selenium.py] | ||
* '''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 02:32 6 ene 2021
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 servidores 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 chromiun 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.
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 hacer 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