Realmente estoy luchando por escribir pruebas unitarias efectivas para un gran proyecto de Django. Tengo una cobertura de prueba razonablemente buena, pero me he dado cuenta de que las pruebas que he estado escribiendo son definitivamente pruebas de integración / aceptación, no pruebas unitarias en absoluto, y tengo partes críticas de mi aplicación que no se están probando de manera efectiva. Quiero arreglar esto lo antes posible.
Aquí está mi problema. Mi esquema es profundamente relacional y está muy orientado al tiempo, lo que le da a mi objeto modelo un alto acoplamiento interno y mucho estado. Muchos de mis métodos modelo consultan en función de los intervalos de tiempo, y tengo muchas actividades auto_now_add
en campos con marca de tiempo. Entonces, tome un método que se vea así, por ejemplo:
def summary(self, startTime=None, endTime=None):
# ... logic to assign a proper start and end time
# if none was provided, probably using datetime.now()
objects = self.related_model_set.manager_method.filter(...)
return sum(object.key_method(startTime, endTime) for object in objects)
¿Cómo se aborda probar algo como esto?
Aquí es donde estoy hasta ahora. Se me ocurre que el objetivo de la prueba de unidad debe tener un comportamiento simulado by key_method
en sus argumentos, ¿se está summary
filtrando / agregando correctamente para producir un resultado correcto?
Burlarse de datetime.now () es bastante sencillo, pero ¿cómo puedo burlarme del resto del comportamiento?
- Podría usar accesorios, pero he escuchado los pros y los contras de usar accesorios para construir mis datos (la falta de mantenimiento es una estafa que me afecta).
- También podría configurar mis datos a través del ORM, pero eso puede ser limitante, porque entonces también tengo que crear objetos relacionados. Y el ORM no le permite jugar con los
auto_now_add
campos manualmente. - Burlarse del ORM es otra opción, pero no solo es complicado burlarse de los métodos ORM profundamente anidados, sino que la lógica en el código ORM se burla de la prueba, y la burla parece hacer que la prueba realmente dependa de las partes internas y las dependencias del función bajo prueba.
Las tuercas más difíciles de descifrar parecen ser las funciones como esta, que se encuentran en algunas capas de modelos y funciones de nivel inferior y dependen mucho del tiempo, aunque estas funciones no sean muy complicadas. Mi problema general es que no importa cómo parezca dividirlo, mis pruebas se ven mucho más complejas que las funciones que están probando.