10 segundos é um tempo muito longo para a execução de um único teste. Meu pressentimento é que seu alvo de especificações está executando testes de unidade e integração ao mesmo tempo. Isso é uma coisa típica em que os projetos se enquadram e, em algum momento, você precisará superar essa dívida técnica se quiser produzir mais e mais rápido. Existem várias estratégias que podem ajudá-lo a fazer isso ... e vou recomendar algumas que usei no passado.
1. Separe a unidade dos testes de integração
A primeira coisa que eu faria é separar a unidade dos testes de integração. Você pode fazer isso:
- Movendo-os (em pastas separadas no diretório de especificações) - e modificando os alvos de rake
- Marcando-os (rspec permite marcar seus testes)
A filosofia é que você deseja que suas compilações regulares sejam rápidas - caso contrário, as pessoas não ficarão muito felizes em executá-las com frequência. Então volte para aquele território. Faça com que seus testes regulares sejam executados rapidamente e use um servidor de integração contínua para executar a construção mais completa.
Um teste de integração é um teste que envolve dependências externas (por exemplo, Database, WebService, Queue e alguns diriam FileSystem). Um teste de unidade apenas testa o item específico do código que você deseja verificar. Deve ser executado rápido (9000 em 45 segundos é possível), ou seja, a maior parte deve ser executado na memória.
2. Converter testes de integração em testes de unidade
Se a maior parte de seus testes de unidade for menor do que seu conjunto de testes de integração, você tem um problema. O que isso significa é que as inconsistências começarão a aparecer com mais facilidade. Então, a partir daqui, comece a criar mais testes de unidade para substituir os testes de integração. As coisas que você pode fazer para ajudar neste processo são:
- Use uma estrutura de simulação em vez do recurso real. Rspec tem uma estrutura de mocking embutida.
- Execute rcov em seu conjunto de teste de unidade. Use isso para avaliar o quão completo é o seu conjunto de testes de unidade.
Assim que tiver um (s) teste (s) de unidade adequado (s) para substituir um teste de integração - remova o teste de integração. O teste duplicado só piora a manutenção.
3. Não use luminárias
As luminárias são más. Em vez disso, use uma fábrica (mecânico ou robô de fábrica). Esses sistemas podem construir gráficos de dados mais adaptáveis e, mais importante, eles podem construir objetos na memória que você pode usar, em vez de carregar coisas de uma fonte de dados externa.
4. Adicionar verificações para interromper os testes de unidade que se tornam testes de integração
Agora que você implementou testes mais rápidos, é hora de colocar verificações para PARAR que isso ocorra novamente.
Existem bibliotecas que fazem o monkey patch active record para lançar um erro ao tentar acessar o banco de dados (UnitRecord).
Você também pode tentar emparelhar e TDD, o que pode ajudar a forçar sua equipe a escrever testes mais rápidos porque:
- Alguém está verificando - então ninguém fica preguiçoso
- O TDD adequado requer feedback rápido. Testes lentos apenas tornam tudo doloroso.
5. Use outras bibliotecas para superar o problema
Alguém mencionou spork (acelera os tempos de carregamento para o conjunto de testes em rails3), hydra / parallel_tests - para executar testes de unidade em paralelo (em vários núcleos).
Isso provavelmente deve ser usado POR ÚLTIMO. Seu verdadeiro problema está na etapa 1, 2, 3. Resolva isso e você estará em uma posição melhor para desenvolver a infraestrutura adicional.