Esse recurso entrou no JUnit 4.11 .
Para usar alterar o nome dos testes parametrizados, você diz:
@Parameters(name="namestring")
namestring
é uma sequência, que pode ter os seguintes espaços reservados especiais:
{index}
- o índice desse conjunto de argumentos. O padrão namestring
é{index}
.
{0}
- o primeiro valor do parâmetro dessa invocação do teste.
{1}
- o segundo valor do parâmetro
- e assim por diante
O nome final do teste será o nome do método de teste, seguido pelos namestring
parênteses, como mostrado abaixo.
Por exemplo (adaptado do teste de unidade para a Parameterized
anotação):
@RunWith(Parameterized.class)
static public class FibonacciTest {
@Parameters( name = "{index}: fib({0})={1}" )
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
private final int fInput;
private final int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void testFib() {
assertEquals(fExpected, fib(fInput));
}
private int fib(int x) {
// TODO: actually calculate Fibonacci numbers
return 0;
}
}
dará nomes como testFib[1: fib(1)=1]
e testFib[4: fib(4)=3]
. (A testFib
parte do nome é o nome do método do @Test
).
{0}
e se e{1}
são matrizes? IdealmenteArrays.toString({0})
, a JUnit deve chamar , não{0}.toString()
. Por exemplo, meudata()
método retornaArrays.asList(new Object[][] {{ new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 } }});
.Olhando para o JUnit 4.5, seu corredor claramente não suporta isso, pois essa lógica está oculta dentro de uma classe privada dentro da classe Parameterized. Você não pode usar o runner JUnit Parameterized e criar o seu próprio que entenderia o conceito de nomes (o que leva à questão de como você pode definir um nome ...).
Da perspectiva de JUnit, seria bom que, em vez de (ou além de) apenas passar um incremento, passassem os argumentos delimitados por vírgula. O TestNG faz isso. Se o recurso for importante para você, você pode comentar na lista de emails do yahoo mencionada em www.junit.org.
fonte
Recentemente, deparei-me com o mesmo problema ao usar o JUnit 4.3.1. Eu implementei uma nova classe que estende Parameterized chamado LabelledParameterized. Foi testado usando o JUnit 4.3.1, 4.4 e 4.5. Ele reconstrói a instância Description usando a representação String do primeiro argumento de cada matriz de parâmetros do método @Parameters. Você pode ver o código para isso em:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
e um exemplo de seu uso em:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
A descrição do teste é bem formatada no Eclipse, o que eu queria, pois isso facilita muito a localização dos testes com falha! Provavelmente irei refinar e documentar as aulas nos próximos dias / semanas. Largue o '?' parte dos URLs, se você quiser o limite. :-)
Para usá-lo, basta copiar essa classe (GPL v3) e alterar @RunWith (Parameterized.class) para @RunWith (LabelledParameterized.class) assumindo que o primeiro elemento da sua lista de parâmetros seja um rótulo sensato.
Não sei se alguma versão posterior do JUnit aborda esse problema, mas mesmo se o fizesse, não consigo atualizar o JUnit, pois todos os meus co-desenvolvedores precisariam atualizar também e temos prioridades mais altas do que as re-ferramentas. Portanto, o trabalho na classe deve ser compilável por várias versões do JUnit.
Nota: existe um pouco de reflexão-piada para que seja executado nas diferentes versões do JUnit, conforme listado acima. A versão específica para o JUnit 4.3.1 pode ser encontrada aqui e, para o JUnit 4.4 e 4.5, aqui .
fonte
execute[0], execute[1] ... execute[n]
nos relatórios de teste gerados.Com
Parameterized
como um modelo, eu escrevi o meu próprio teste personalizado corredor / suite - só levou cerca de meia hora. É um pouco diferente do da darrenp,LabelledParameterized
pois permite especificar um nome explicitamente, em vez de depender do primeiro parâmetrotoString()
.Também não usa matrizes porque eu odeio matrizes. :)
E um exemplo:
fonte
do junit4.8.2, você pode criar sua própria classe MyParameterized simplesmente copiando a classe Parameterized. altere os métodos getName () e testName () em TestClassRunnerForParameters.
fonte
Você também pode experimentar o JUnitParams: http://code.google.com/p/junitparams/
fonte
Você pode criar um método como
Embora eu não usasse o tempo todo, seria útil descobrir exatamente qual é o número de teste 143.
fonte
Faço uso extensivo da importação estática para Assert e amigos, para que seja fácil redefinir a afirmação:
Por exemplo, você pode adicionar um campo "nome" à sua classe de teste, inicializada no construtor e exibi-lo na falha do teste. Apenas passe-o como os primeiros elementos da sua matriz de parâmetros para cada teste. Isso também ajuda a rotular os dados:
fonte
Nada disso estava funcionando para mim, então eu peguei a fonte para Parameterized e a modifiquei para criar um novo executor de teste. Eu não tive que mudar muito, mas FUNCIONA !!!
fonte
Uma solução alternativa seria capturar e aninhar todos os Throwables em um novo Throwable com uma mensagem personalizada que contenha todas as informações sobre os parâmetros. A mensagem apareceria no rastreamento da pilha. Isso funciona sempre que um teste falha em todas as asserções, erros e exceções, pois todas são subclasses de Throwable.
Meu código fica assim:
O rastreamento de pilha do teste com falha é:
fonte
Confira JUnitParams como dsaff mencionado, trabalha usando ant para criar descrições parametrizadas de métodos de teste no relatório html.
Isso foi depois de tentar LabelledParameterized e descobrir que, embora funcione com o eclipse, não funciona com o ant no que diz respeito ao relatório html.
Felicidades,
fonte
Como o parâmetro acessado (por exemplo,
"{0}"
sempre retorna atoString()
representação, uma solução alternativa seria fazer uma implementação anônima e substituirtoString()
em cada caso. Por exemplo:fonte