Pruebas fallidas aleatorias de prueba y supertest Node.js

tan larga historia corta, estoy desarrollando RESTapi que toma un título de película en la solicitud POST a la ruta / movies, obtiene información sobre esa película desde una API externa y guarda ese objeto en la base de datos. En POST / comments agrega un comentario a la colección diferente, pero cada comentario tiene una propiedad ‘movie_id’ que tiene una película asociada.

Ese es mi primer proyecto más grande, así que estoy tratando de escribir pruebas integracionales. Todo es genial, al menos en mi opinión, excepto 3 casos de prueba extraños que están fallando de la nada. Las pruebas podrían pasar 10 veces seguidas y luego, de repente, aparece el extraño cronómetro de “broma” y fallan 3 casos.

Estoy usando el controlador nativo de mongodb, express y bromeo con supertest para probar, eliminar la base de datos de prueba BeforeAll y AfterEach, no tengo idea cuál es la razón de ello.

Temporizador introduzca la descripción de la imagen aquí

Y después del cronómetro esto aparece, pruebas fallidas: introduzca la descripción de la imagen aquí

El código fuente completo está aquí GITHUB

Otros casos fallidos: introduzca la descripción de la imagen aquí introduzca la descripción de la imagen aquí

¿Alguna idea, consejos?

El código parece devolver una entrada, mientras que la prueba espera cero. Esto se parece mucho a un problema con la independencia de las pruebas: sus pruebas parecen depender unas de otras (a través de la base de datos).

Supongo que una prueba crea la película y luego la borra de nuevo. Cuando todo funciona bien, la segunda prueba no encuentra la película. Pero, en algunos casos no afortunados (mal momento, diferente orden de ejecución, …), la base de datos no se borra lo suficientemente rápido y la segunda prueba encuentra la película.

Por lo tanto, debes trabajar duro para que tus pruebas sean independientes. Esto no es fácil con las pruebas integradas, especialmente cuando involucran una base de datos real.

Tal vez pueda crear pruebas más pequeñas (pruebas unitarias, micro pruebas, …) para lograr la independencia. Si esto no es posible, la prueba podría verificar su condición previa (base de datos vacía o lo que sea) y esperar hasta que se cumpla (o hasta que se agote el tiempo de espera).

Eliminar la base de datos en BeforeAll y AfterEach podría no ser suficiente, porque Jest incluso ejecuta sus pruebas en paralelo: ¿Las pruebas dentro de un archivo se ejecutan en paralelo en Jest?

Además, la eliminación podría no ser una operación atómica y completamente sincrónica, especialmente cuando hay algo de almacenamiento en caché en el controlador DB. Pero no conozco a mongodb y es la integración de node.js lo suficientemente bien como para juzgar eso.

Intereting Posts