Pruebas de las Vistas 21-22

De Wiki de EGC
Revisión del 14:25 13 oct 2021 de Ajramirez (discusión | contribuciones) (Pruebas de APIs)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

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.

link2

Pruebas de navegación

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)

test_selenium.py

  • 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:

  • Selenium-ide.png
  • Grabar una prueba para realizar un login correcto.

Selenium-record.png

  • Replicar la prueba
  • Integrarlo dentro de nuestra clase en Python