Eu herdei uma carga de teste Junit, mas esses testes (além da maioria não está funcionando) são uma mistura de testes de unidade e testes de integração reais (exigindo sistemas externos, banco de dados, etc.).
Então, eu estou tentando pensar em uma maneira de separá-los, para que eu possa executar o teste de unidade de maneira agradável e rápida e os testes de integração depois disso.
As opções são ..
Divida-os em diretórios separados.
Vá para Junit4 (da v3) e anote as classes para separá-las.
Use uma convenção de nomenclatura de arquivos para informar o que é uma classe, ou seja, AdapterATest e AdapterAIntergrationTest.
3 tem o problema de que o Eclipse tem a opção de "Executar todos os testes no projeto / pacote ou pasta selecionado". Portanto, seria muito difícil apenas executar os testes de integração.
2: corre o risco de que os desenvolvedores possam começar a escrever testes de integração em classes de teste de unidade e isso fica confuso.
1: Parece a melhor solução, mas meu intestino diz que deve haver uma solução melhor por aí.
Portanto, essa é minha pergunta: como você divide os testes de integração e os testes de unidade adequados?
fonte
Respostas:
Atualmente, uso diretórios separados devido à política organizacional (e ao legado do Junit 3), mas estou procurando fazer a transição para anotações agora que estou no Junit 4.
Eu não estaria muito preocupado com os desenvolvedores colocando testes de integração em suas classes de teste de unidade - adicione uma regra nos seus padrões de codificação, se necessário.
Estou interessado em saber que tipo de outras soluções podem existir além de anotações ou separar fisicamente as classes.
fonte
Você pode dividi-los facilmente usando as categorias JUnit e Maven.
Isso é mostrado muito, muito brevemente abaixo, dividindo os testes de unidade e integração.
Definir uma interface de marcador
A primeira etapa no agrupamento de um teste usando categorias é criar uma interface de marcador.Essa interface será usada para marcar todos os testes que você deseja executar como testes de integração.
Marque suas aulas de teste
Adicione a anotação da categoria ao topo da sua classe de teste. Leva o nome da sua nova interface.
Configurar testes de unidade Maven
A beleza desta solução é que nada realmente muda para o lado do teste de unidade.Simplesmente adicionamos alguma configuração ao plug-in maven surefire para que ele ignore todos os testes de integração.
Quando você faz um teste de limpeza mvn, apenas os testes de unidade não marcados serão executados.
Configurar testes de integração do Maven
Novamente, a configuração para isso é muito simples.Para executar apenas os testes de integração, use o seguinte:
Se você agrupar isso em um perfil com id
IT
, poderá executar apenas os testes rápidos usandomvn clean install
. Para executar apenas os testes de integração / lentos, usemvn clean install -P IT
.Mas na maioria das vezes, você desejará executar os testes rápidos por padrão e todos os testes com
-P IT
. Se for esse o caso, você precisará usar um truque:Como você pode ver, estou excluindo os testes anotados
java.io.Serializable
. Isso é necessário porque o perfil herdará a configuração padrão do plug-in Surefire; portanto, mesmo se você disser<excludedGroups/>
ou<excludedGroups></excludedGroups>
, o valorcom.test.annotation.type.IntegrationTest
será usado.Você também não pode usá-
none
lo, pois deve ser uma interface no caminho de classe (o Maven verificará isso).Notas:
surefire-junit47
é necessária apenas quando o Maven não muda automaticamente para o corredor JUnit 4. O uso do elementogroups
ouexcludedGroups
deve acionar a chave. Veja aqui .@RunWith()
anotações para executar suítes ou testes baseados em Spring.fonte
Usamos o Maven Surefire Plugin para executar testes de unidade e o Maven Failsafe Plugin para executar testes de integração. Os testes de unidade seguem as
**/Test*.java **/*Test.java **/*TestCase.java
convenções de nomenclatura, testes de integração -**/IT*.java **/*IT.java **/*ITCase.java
. Então, na verdade, é a sua opção número três.Em alguns projetos, usamos o TestNG e definimos diferentes grupos de testes para integração / testes de unidade, mas isso provavelmente não é adequado para você.
fonte
Eu mudaria para o Junit4 apenas por tê-lo :)
Você pode separá-los em diferentes suítes de teste. Não sei como eles estão organizados no Junit3, mas no Junit4 deve ser fácil apenas criar conjuntos de testes e colocar todos os testes de unidade reais em um deles e usar um segundo conjunto para os testes de integração.
Agora defina uma configuração de execução para os dois conjuntos no eclipse e você pode executar facilmente um único conjunto. Esses conjuntos também podem ser iniciados a partir de um processo automatizado, permitindo que você execute os testes de unidade sempre que a fonte for alterada e talvez os testes de integração (se eles forem realmente grandes) apenas uma vez por dia ou uma vez por hora.
fonte
O uso da anotação de mola IfProfileValue possibilita isso sem a necessidade de um plug-in ou configuração maven.
Anote as classes ou métodos de teste de integração usando o IfProfileValue
Para executar usando apenas testes de unidade:
Para executar usando testes de integração e testes de unidade:
Além disso, "Executar todos os testes" em um IDE executaria apenas testes de unidade. Adicione
-Dtest-groups=integration
argumentos à VM para executar testes de integração e unidade.fonte
Não existe uma resposta certa. Como você explicou, existem várias maneiras de fazer isso que funcionarão. Eu fiz o esquema de nomeação de arquivos e dividi as coisas em diretórios diferentes.
Parece que dividir as coisas em diretórios diferentes pode funcionar melhor para você, e isso me parece um pouco mais claro, então eu me inclino para isso.
Acho que não tentaria anotações porque isso me parece mais refinado. Deseja realmente esses dois tipos de testes combinados no mesmo arquivo? Eu não faria.
fonte