2009-01-21 13 views
28

No he utilizado pruebas de unidad antes de una breve introducción en un curso de Uni. Actualmente estoy escribiendo una aplicación y me gustaría enseñarme a mí mismo TDD en el proceso. El problema es que no tengo idea de qué probar o cómo.Pruebas de unidad de escritura en Django/Python

Estoy escribiendo una aplicación Django, y hasta ahora solo he creado los modelos (y he personalizado la aplicación de administración). Esta es la forma en que he escrito los esqueletos de mis pruebas hasta el momento:

class ModelTests(TestCase): 
    fixtures = ['initial_data.json',] 

    def setUp(self): 
     pass 

    def testSSA(self): 
     ssa = SSA.objects.create(name="sdfsdf", cost_center=1111, street_num=8, 
       street_name="dfsdfsf Street", suburb="sdfsdfsdf", 
       post_code=3333) 


    def testResident(self): 
     pass 

    def testSSA_Client(self): 
     pass 

tenía planeado escribir una función para probar cada modelo dentro de la clase ModelTests. ¿Es esta una buena forma de escribir pruebas? Además, ¿qué debería probar exactamente? ¿Que crear un modelo con todos los campos completados funciona? ¿Que un modelo medio completo falla? ¿Qué casos especiales se prueban (como null e is_required = False)? Confío en el ORM, que hasta donde tengo conocimiento está fuertemente probado, así que no debería necesitar probar todos los métodos, ¿o sí?

¿Qué debo probar para una aplicación web escrita en Django/Python? Algunos ejemplos serían agradables.

+0

Permítanme promocionar deshonestamente mi tutorial para probar aplicaciones de Django, que incluye no solo pruebas de unidades, sino también pruebas de comportamiento adecuadas del navegador utilizando el poderoso Selenium: [Test-Driven Django Tutorial] (http: // harry .pythonanywhere.com /) – hwjp

Respuesta

36

¿Es una función para probar cada modelo dentro de la clase ModelTests una buena forma de escribir pruebas?

¿Qué es exactamente debería estar probando para?

  • Que la creación de un modelo con todos los campos completados funciona?

  • ¿Qué modelo medio completo falla?

  • ¿Qué casos especiales se prueban (como null y is_required = False)?

  • He confiado en el ORM, que hasta donde yo sé, ha sido sometido a pruebas, por lo que no debería tener que probar todos los métodos, ¿o sí?

No mucho de eso.

Puede probar las reglas de validación, pero eso no tiene sentido hasta que haya definido algunos objetos Form. Luego tiene algo que probar: ¿impone la forma todas las reglas? Necesitará al menos una clase TestCase para cada formulario. Una función será un escenario: diferentes combinaciones de entradas permitidas o no permitidas.

Para cada clase de modelo, necesitará al menos una definición de clase TestCase. TestCases es barato, define muchos de ellos.

Su modelo representa las definiciones de "entidad comercial". Sus modelos tendrán métodos que implementen reglas comerciales. Sus métodos harán cosas como resumir, filtrar, calcular, agregar, reducir, todo tipo de cosas. Tendrá funciones para cada una de estas características de una clase modelo.

No estás probando Django. Está probando cómo las reglas de su negocio realmente funcionan en Django.

Más adelante, cuando tenga más cosas en su aplicación (formularios, vistas, URL, etc.), querrá usar el cliente de prueba unitario Django para ejercitar cada método para cada url. De nuevo, un TestCase por

+2

Una vez que escribí los esqueletos y definí dos pruebas para un modelo, me di cuenta de que estaba perdiendo el tiempo. No había nada para probar de lo que no estaba seguro. Aunque no he definido métodos personalizados todavía. Muy buena respuesta, lo aprecio. –

+2

@Josh Smeaton: NO perder el tiempo. Esas pruebas esquemáticas simplistas son útiles a largo plazo. En el futuro, harás algunas refactorizaciones que parecen triviales y una de esas pruebas cojas se romperá, lo que indica que te perdiste algo. "Claro" no siempre es lo suficientemente bueno. Necesitas "prueba". –

+0

Espera, ¿entonces estás diciendo que la unidad prueba como 'test_create_User' y 'test_delete_User', básicamente la prueba unitaria de un DAO (objeto de acceso a datos) no es una valiosa prueba unitaria? ¿Más bien, deberíamos probar la capa de servicio o las clases que llaman DAO? Pensé que tenía que escribir una prueba de unidad mundana para probar que sí, si intento crear un Usuario que ya existe, debería devolver el Usuario existente y no intentar crear un Usuario duplicado, etc. Y si borro un no -Usuario existente, entonces debería levantar un LookupError, etc. – user798719

9

No estoy exactamente seguro de los detalles de lo que está tratando de probar aquí, necesitaría más fragmentos de código para esto, pero puedo darle algunos consejos generales.

Primero, lea el capítulo de pruebas de unidades de "Inmersión en Python" (es gratis en línea! http://diveintopython3.ep.io/unit-testing.html), es una gran explicación de pruebas unitarias en general, qué necesita hacer y por qué.

En segundo lugar, en lo que respecta a TDD, es una práctica valiosa, pero tenga cuidado de no depender demasiado de ella, ya que he encontrado que puede dar lugar a una sobre especificación de software y más software que no se puede volver a -desarrollado y adaptado a nuevas tareas. Esta es solo mi experiencia, mente. Además, siempre que no lo uses dogmáticamente, TDD es valioso.

En tercer lugar, me parece que el mejor consejo para su situación específica es esforzarse por probar su lógica, pero no la lógica de los marcos que usted depende de. Eso significa que a menudo probar modelos medio completos, etc. puede no ser apropiado, ya que esa no es tu lógica, sino la de Django, y por lo tanto ya debería probarse. Sería más valioso probar algunos casos esperados, ejemplos que espera, excepciones que espera, etc. para asegurarse de que la especificación de su modelo sea correcta y luego pasar a la lógica más sustancial de su aplicación.

+1

+1 para obtener un resumen de cómo empezar a probar las unidades en Python y compartir su propia experiencia con TDD. –

4

Probablemente ya haya leído Pruebas Django Applications.

Comience probando los casos de uso normal de su aplicación, creando un nuevo usuario, agregando una entrada de blog, etc. Simplemente sus operaciones CRUD típicas primero, luego muévase a las cajas de borde. Básicamente, usted genera confianza en su aplicación de que cualquier cosa que modifique más adelante no romperá la forma en que espero que se comporte la aplicación.

Simula solicitudes GET/POST en tus URL y observa las respuestas (encabezados, códigos de estado y contenido). ¿Tu aplicación mostró la vista correcta? Usando la plantilla correcta? En las secciones donde su aplicación arroja excepciones, intente activarlas (por ejemplo, vea/edite un registro inexistente para generar ObjectDoesNotExist).

Por lo general, vale la pena poner en un sistema de seguimiento (por ejemplo, Trac), por lo que puede agregar una nueva prueba para cada defecto registrado.

Cuestiones relacionadas