CherryPy - Prueba
La prueba es un proceso durante el cual la aplicación se lleva a cabo desde diferentes perspectivas para:
- Encuentra la lista de problemas
- Encuentre diferencias entre el resultado esperado y real, la producción, los estados, etc.
- Comprender la fase de implementación.
- Encuentre la aplicación útil para propósitos realistas.
El objetivo de las pruebas no es culpar al desarrollador, sino proporcionar herramientas y mejorar la calidad para estimar el estado de la aplicación en un momento dado.
Las pruebas deben planificarse con anticipación. Esto requiere definir el propósito de las pruebas, comprender el alcance de los casos de prueba, hacer la lista de requisitos comerciales y ser consciente de los riesgos involucrados en las diferentes fases del proyecto.
Las pruebas se definen como una gama de aspectos que se validarán en un sistema o aplicación. A continuación se muestra una lista decommon test approaches -
Unit testing- Esto suele ser realizado por los propios desarrolladores. Esto tiene como objetivo comprobar si una unidad de código funciona como se esperaba o no.
Usability testing- Los desarrolladores suelen olvidar que están escribiendo una aplicación para los usuarios finales que no tienen conocimiento del sistema. Las pruebas de usabilidad verifican los pros y los contras del producto.
Functional/Acceptance testing - Mientras que las pruebas de usabilidad verifican si una aplicación o sistema es utilizable, las pruebas funcionales aseguran que se implementen todas las funciones especificadas.
Load and performance testing- Esto se lleva a cabo para comprender si el sistema se puede ajustar a las pruebas de carga y rendimiento que se van a realizar. Esto puede provocar cambios en el hardware, optimización de consultas SQL, etc.
Regression testing - Verifica que lanzamientos sucesivos de un producto no rompan ninguna de las funcionalidades anteriores.
Reliability and resilience testing - Las pruebas de confiabilidad ayudan a validar la aplicación del sistema con el desglose de uno o varios componentes.
Examen de la unidad
Las aplicaciones de Photoblog utilizan constantemente pruebas unitarias para comprobar lo siguiente:
- Las nuevas funcionalidades funcionan correctamente y como se esperaba.
- Las funcionalidades existentes no se ven afectadas por la publicación de un nuevo código.
- Los defectos se arreglan y permanecen fijos.
Python viene con un módulo de prueba unitaria estándar que ofrece un enfoque diferente para las pruebas unitarias.
Prueba de unidad
unittest tiene sus raíces en JUnit, un paquete de pruebas unitarias de Java desarrollado por Kent Beck y Erich Gamma. Las pruebas unitarias simplemente devuelven datos definidos. Se pueden definir objetos simulados. Estos objetos permiten realizar pruebas con una interfaz de nuestro diseño sin tener que depender de la aplicación general. También proporcionan una forma de ejecutar pruebas en modo aislado con otras pruebas incluidas.
Definamos una clase ficticia de la siguiente manera:
import unittest
class DummyTest(unittest.TestCase):
def test_01_forward(self):
dummy = Dummy(right_boundary=3)
self.assertEqual(dummy.forward(), 1)
self.assertEqual(dummy.forward(), 2)
self.assertEqual(dummy.forward(), 3)
self.assertRaises(ValueError, dummy.forward)
def test_02_backward(self):
dummy = Dummy(left_boundary=-3, allow_negative=True)
self.assertEqual(dummy.backward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.backward(), -3)
self.assertRaises(ValueError, dummy.backward)
def test_03_boundaries(self):
dummy = Dummy(right_boundary=3, left_boundary=-3,allow_negative=True)
self.assertEqual(dummy.backward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.forward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.backward(), -3)
La explicación del código es la siguiente:
El módulo unittest debe importarse para proporcionar capacidades de prueba unitaria para la clase dada.
Se debe crear una clase subclasificando unittest.
Todos los métodos del código anterior comienzan con una prueba de palabras. Todos estos métodos son llamados por unittest handler.
El caso de prueba llama a los métodos de aserción / falla para administrar las excepciones.
Considere esto como un ejemplo para ejecutar un caso de prueba:
if __name__ == '__main__':
unittest.main()
El resultado (salida) para ejecutar el caso de prueba será el siguiente:
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Pruebas funcionales
Una vez que las funcionalidades de la aplicación comienzan a tomar forma según los requisitos, un conjunto de pruebas funcionales puede validar la exactitud de la aplicación con respecto a la especificación. Sin embargo, la prueba debe automatizarse para un mejor rendimiento, lo que requeriría el uso de productos de terceros como Selenium.
CherryPy proporciona funciones integradas como clases auxiliares para facilitar la escritura de pruebas funcionales.
Prueba de carga
Según la aplicación que esté escribiendo y sus expectativas en términos de volumen, es posible que deba ejecutar pruebas de carga y rendimiento para detectar posibles cuellos de botella en la aplicación que impiden que alcance un cierto nivel de rendimiento.
Esta sección no detallará cómo realizar una prueba de rendimiento o carga, ya que está fuera del paquete FunkLoad.
El ejemplo muy básico de FunkLoad es el siguiente:
from funkload.FunkLoadTestCase
import FunkLoadTestCase
class LoadHomePage(FunkLoadTestCase):
def test_homepage(self):
server_url = self.conf_get('main', 'url')
nb_time = self.conf_getInt('test_homepage', 'nb_time')
home_page = "%s/" % server_url
for i in range(nb_time):
self.logd('Try %i' % i)
self.get(home_page, description='Get gome page')
if __name__ in ('main', '__main__'):
import unittest
unittest.main()
Aquí hay una explicación detallada del código anterior:
El caso de prueba debe heredar de la clase FunkLoadTestCase para que FunkLoad pueda hacer su trabajo interno de rastrear lo que sucede durante la prueba.
El nombre de la clase es importante ya que FunkLoad buscará un archivo basado en el nombre de la clase.
Los casos de prueba diseñados tienen acceso directo a los archivos de configuración. Los métodos get () y post () simplemente se invocan contra el servidor para obtener la respuesta.