Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
christian-gama opened this issue Oct 29, 2021 · 3 comments

Comments

@christian-gama
Copy link

christian-gama commented Oct 29, 2021

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

@rmanguinho
Copy link
Owner

rmanguinho commented Oct 29, 2021 via email

@christian-gama
Copy link
Author

christian-gama commented Oct 29, 2021

Se não estivéssemos usando Typescript, daria para usarmos o setupFile do jest, onde ele roda algo antes de todos os testes. Mas por limitação deles, o setupFile roda antes de transpilar para o Typescript, aí dá erro. Essa foi a melhor solução que encontrei até agora. Me avise se encontrar uma solução melhor, por favor. 😄

Só uma observação, pois talvez aconteça com você. Os testes das factories não podem estar junto com esse arquivo, pois eles mockam as validações e bugam tudo. Não soube como resetar o mock, então preferi deixar rodando de forma separada os testes das factories.

@rmanguinho
Copy link
Owner

rmanguinho commented Oct 29, 2021 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants