Escritura de casos de prueba para modelos django.

A la mitad de mi proyecto actual, después de sufrir el dolor de gastar innumerables minutos en la depuración, decidí adoptar TDD. Para empezar, planeo escribir un conjunto de pruebas unitarias para cada modelo existente. Pero para los modelos que solo tienen atributos definidos (es decir, no hay métodos / propiedades adicionales) no estoy seguro de lo que necesito probar ni cómo.

class Product(models.Model): name = models.CharField(max_length=50) description = models.TextField(default='', blank=True) retails = models.ManyToManyField(Retail, verbose_name='Retail stores that carry the product') manufacturer = models.ForeignKey(Manufacturer, related_name='products') date_created = models.DateTimeField(auto_now_add=True) date_modified = models.DateTimeField(auto_now=True) 

Utilizando el Producto como ejemplo, ¿cuáles son las cosas que los exámenes de unidad deberían cubrir? ¿Y cómo deben cubrirse ForeignKey y ManyToManyField ?

Este fue un artículo que encontré útil: http://toastdriven.com/blog/2011/apr/10/guide-to-testing-in-django/ . Aquí hay un buen resumen de qué probar:

Otro revés común para los desarrolladores / diseñadores que son nuevos en las pruebas es la pregunta “¿qué debería (o no debería) probar?” Si bien no hay reglas estrictas y rápidas aquí que se apliquen cuidadosamente en todas partes, hay algunas pautas generales que puedo ofrecer para tomar la decisión:

  • Si el código en cuestión es una función / biblioteca incorporada de Python, no lo pruebe. Ejemplos como la biblioteca datetime.

  • Si el código en cuestión está integrado en Django, no lo pruebes. Ejemplos como los campos en un modelo o la prueba de cómo la plantilla integrada. El nodo procesa las tags incluidas.

  • Si su modelo tiene métodos personalizados, debe probar eso, generalmente con pruebas unitarias.

  • Lo mismo ocurre con las vistas personalizadas, formularios, tags de plantilla, procesadores de contexto, middleware, comandos de administración, etc. Si implementó la lógica de negocios, debe probar sus aspectos del código.

Entonces, para su ejemplo, realmente no habría nada que probar hasta que escriba algunas funciones personalizadas.
En mi opinión, probar los enlaces ForeignKey y ManyToManyField incluiría en la segunda categoría (código integrado en Django), por lo que no los probaría, ya que realmente está comprobando si Django funciona correctamente o no. Si tiene un método que crea una instancia de su producto, incluidas relaciones externas y M2M, puede verificar que se hayan creado los datos, que estarían probando su método personalizado, no la funcionalidad de Django.

Usando el paradigma TDD, las pruebas se crean para verificar la lógica empresarial y los requisitos de diseño.