Como o título diz, estou procurando uma maneira simples de executar os testes do JUnit 4.x várias vezes seguidas automaticamente usando o Eclipse.
Um exemplo seria executar o mesmo teste 10 vezes seguidas e reportar o resultado.
Já temos uma maneira complexa de fazer isso, mas estou procurando uma maneira simples de fazê-lo, para que eu possa ter certeza de que o teste superficial que estou tentando corrigir permanece fixo.
Uma solução ideal seria um plugin / configuração / recurso do Eclipse que eu desconheço.
Respostas:
A maneira mais fácil (como é necessária a quantidade mínima de código novo) para fazer isso é executar o teste como um teste parametrizado (anote com
@RunWith(Parameterized.class)
e adicione um método para fornecer 10 parâmetros vazios). Dessa forma, a estrutura executará o teste 10 vezes.Esse teste precisaria ser o único na classe, ou melhor, todos os métodos de teste precisariam ser executados 10 vezes na classe.
Aqui está um exemplo:
Com o exposto, é possível fazê-lo com um construtor sem parâmetros, mas não tenho certeza se os autores da estrutura pretendiam isso ou se isso seria interrompido no futuro.
Se você estiver implementando seu próprio corredor, poderá fazer com que o corredor execute o teste 10 vezes. Se você estiver usando um corredor de terceiros, com o 4.7, poderá usar a nova
@Rule
anotação e implementar aMethodRule
interface para que ela pegue a instrução e a execute 10 vezes em um loop for. A desvantagem atual dessa abordagem é essa@Before
e@After
é executada apenas uma vez. Provavelmente, isso mudará na próxima versão do JUnit (o que@Before
será executado após o@Rule
), mas independentemente você estará agindo na mesma instância do objeto (algo que não é verdadeiro para oParameterized
corredor). Isso pressupõe que qualquer corredor com o qual você esteja executando a classe reconheça corretamente as@Rule
anotações. Esse é apenas o caso se estiver delegando para os corredores JUnit.Se você estiver executando com um corredor personalizado que não reconheça a
@Rule
anotação, ficará realmente com a necessidade de escrever seu próprio corredor, que delega adequadamente esse corredor e o executa 10 vezes.Observe que existem outras maneiras de resolver isso potencialmente (como o corredor de teorias), mas todas elas exigem um corredor. Infelizmente, o JUnit atualmente não suporta camadas de corredores. Esse é um corredor que liga outros corredores.
fonte
Com o IntelliJ, você pode fazer isso na configuração de teste. Depois de abrir esta janela, você pode optar por executar o teste quantas vezes quiser.
Quando você executa o teste, o intellij executará todos os testes selecionados para o número de vezes que você especificou.
Exemplo executando 624 testes 10 vezes:
fonte
Descobri que a anotação repetida do Spring é útil para esse tipo de coisa:
Documento mais recente (API Spring Framework 4.3.11.RELEASE):
fonte
Inspirado nos seguintes recursos:
Exemplo
Crie e use uma
@Repeat
anotação da seguinte maneira:Repeat.java
RepeatRule.java
PowerMock
Para usar esta solução
@RunWith(PowerMockRunner.class)
, é necessário atualizar para o Powermock 1.6.5 (que inclui um patch ).fonte
Com o JUnit 5, consegui resolver isso usando a anotação @RepeatedTest :
Observe que a
@Test
anotação não deve ser usada junto com@RepeatedTest
.fonte
Algo errado com:
Ao contrário do caso em que você está testando cada uma de uma matriz de valores, não se importa particularmente com a falha na execução.
Não é necessário fazer na configuração ou anotação o que você pode fazer no código.
fonte
@Before
método anotado, antesitWorks()
resolveu o meu problema.Isso funciona muito mais fácil para mim.
fonte
public class RepeatRunner extends BlockJUnit4ClassRunner { public RepeatRunner(Class klass) throws InitializationError { super(klass); } @Override public void run(final RunNotifier notifier) { for (int i = 0; i < 10; i++) { super.run(notifier); } } }
Embora pelo menos no plug-in Eclipse JUnit você obtenha resultados como: "10/1 testes aprovados"Há uma anotação intermitente na biblioteca tempus-fugit que funciona com o JUnit 4.7
@Rule
para repetir um teste várias vezes ou com@RunWith
.Por exemplo,
Após a execução do teste (com o IntermittentTestRunner no
@RunWith
),testCounter
seria igual a 99.fonte
Eu construo um módulo que permite fazer esse tipo de teste. Mas é focado não apenas na repetição. Mas, para garantir que algum trecho de código seja seguro para threads.
https://github.com/anderson-marques/concurrent-testing
Dependência do Maven:
Exemplo de uso:
Este é um projeto de código aberto. Sinta-se livre para melhorar.
fonte
Você pode executar seu teste JUnit a partir de um método principal e repeti-lo quantas vezes precisar:
fonte
Esta é essencialmente a resposta que Yishai forneceu acima, reescrita em Kotlin:
fonte