Salve.
Notei que todo teste faz uma nova conexão ao banco de dados e logo em seguida desconecta. Eu estava fazendo exatamente dessa forma em um projeto pessoal meu que tem bastante teste. Os testes de integração levavam cerca de 2 minutos para concluir.
Para contornar esse problema, criei um arquivo integration.test.ts que faz uma leitura de todos os testes de integração (que são os que têm conexão ao banco de dados) e encapsulei todos os testes dentro desse arquivo. Só certifique-se de rodar apenas o integration.test.ts
.
O resultado foi impressionante, caiu de 2 minutos para apenas 21 segundos!! A alta performance se dá por conta de apenas uma conexão ao banco de dados, ao invés de se conectar/desconectar em cada teste.
// integration.test.ts
const tests = (): void =>
glob.sync(`${resolve(__dirname)}/**/*.ts`).forEach((content) => {
if (content.match(/\.(test|steps)\.ts$/) && !content.match(/integration\.test\.ts$/)) {
require(content)
}
})
describe('integration tests', () => {
afterAll(async () => {
const client = makeMongoDb()
await client.disconnect()
})
beforeAll(async () => {
await MongoAdapter.connect(global.__MONGO_URI__)
})
tests()
})
Caso eu queira rodar apenas um teste, ao invés de ter que rodar todos, fiz uma verificação antes em cada teste, pois assim torna os testes flexíveis. Dessa forma posso depurar apenas um teste, caso seja necessário.
// user.test.ts
describe ...
let isConnected = true
afterAll(async () => {
if (!isConnected) await client.disconnect()
})
beforeAll(async () => {
isConnected = MongoAdapter.client != null
if (!isConnected) await MongoAdapter.connect(global.__MONGO_URI__)
})
...