Skip to content

Baixa performance nos testes causada pelo banco de dados (sugestão) #51

@christian-gama

Description

@christian-gama

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__)
  })
...

Conectando/desconectando em cada teste (a forma que tava antes):
Sem

Conectando/desconectando apenas uma vez antes de todos os testes:
com

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions