No JUnit 3, eu poderia obter o nome do teste atualmente em execução assim:
public class MyTest extends TestCase
{
public void testSomething()
{
System.out.println("Current test is " + getName());
...
}
}
que imprimiria "Teste atual é testSomething".
Existe alguma maneira simples ou imediata de fazer isso no JUnit 4?
Antecedentes: Obviamente, não quero apenas imprimir o nome do teste. Desejo carregar dados específicos de teste armazenados em um recurso com o mesmo nome que o teste. Você sabe, convenção sobre configuração e tudo mais.
java
unit-testing
junit
Dave Ray
fonte
fonte
Respostas:
O JUnit 4.7 adicionou esse recurso, aparentemente usando a regra TestName . Parece que você receberá o nome do método:
fonte
@Rule
antes@Before
- eu sou novo no JUnit e dependia doTestName
meu@Before
sem nenhuma dificuldade.JUnit 4.9.xe superior
Desde a JUnit 4.9, a
TestWatchman
classe foi preterida em favor daTestWatcher
classe, que foi chamada:Nota: A classe que contém deve ser declarada
public
.JUnit 4.7.x - 4.8.x
A abordagem a seguir imprimirá nomes de métodos para todos os testes em uma classe:
fonte
public
campo?JUnit 5 e superior
No JUnit 5, você pode injetar, o
TestInfo
que simplifica os metadados de teste, fornecendo aos métodos de teste. Por exemplo:Veja mais: Guia do usuário do JUnit 5 , TestInfo javadoc .
fonte
Tente isso:
A saída é assim:
NOTA: Isso NÃO funciona se o seu teste for uma subclasse do TestCase ! O teste é executado, mas o código @Rule simplesmente nunca é executado.
fonte
Considere que o uso do SLF4J (Simple Logging Facade for Java) fornece algumas melhorias simples usando mensagens parametrizadas. A combinação de implementações de regra SLF4J com JUnit 4 pode fornecer técnicas de log de classe de teste mais eficientes.
fonte
Uma maneira complicada é criar seu próprio Runner subclassificando org.junit.runners.BlockJUnit4ClassRunner.
Você pode fazer algo assim:
Em seguida, para cada classe de teste, você precisará adicionar uma anotação @RunWith (NameAwareRunner.class). Como alternativa, você pode colocar essa anotação em uma superclasse de Teste, se não quiser lembrá-la todas as vezes. Obviamente, isso limita sua seleção de corredores, mas isso pode ser aceitável.
Além disso, pode levar um pouco de kung fu para tirar o nome do teste atual do Runner e entrar em sua estrutura, mas isso pelo menos dá o nome a você.
fonte
O JUnit 4 não possui nenhum mecanismo pronto para uso para que um caso de teste obtenha seu próprio nome (inclusive durante a instalação e desmontagem).
fonte
fonte
Com base no comentário anterior e considerando ainda mais, criei uma extensão do TestWather que você pode usar nos métodos de teste JUnit com isso:
A classe auxiliar de teste é a seguinte:
Aproveitar!
fonte
ImportUtilsTest
, recebo um erro, parece ser uma classe de logger, tenho mais informações? Obrigadofonte
Sugiro que você dissocie o nome do método de teste do seu conjunto de dados de teste. Eu modelaria uma classe DataLoaderFactory que carrega / armazena em cache os conjuntos de dados de teste de seus recursos e, em seu caso de teste, cam chama algum método de interface que retorna um conjunto de dados de teste para o caso de teste. Ter os dados de teste vinculados ao nome do método de teste pressupõe que os dados de teste possam ser usados apenas uma vez, onde na maioria dos casos eu sugeriria que os mesmos dados de teste sejam usados em vários testes para verificar vários aspectos da lógica de negócios.
fonte
Você pode conseguir isso usando
Slf4j
eTestWatcher
fonte
No JUnit 5
TestInfo
atua como um substituto para a regra TestName da JUnit 4.A partir da documentação:
Para recuperar o nome do método do teste executado atualmente, você tem duas opções:
String TestInfo.getDisplayName()
eMethod TestInfo.getTestMethod()
.Recuperar apenas o nome do método de teste atual
TestInfo.getDisplayName()
pode não ser suficiente, pois o nome de exibição padrão do método de teste émethodName(TypeArg1, TypeArg2, ... TypeArg3)
.Duplicar nomes de métodos
@DisplayName("..")
não é uma boa idéia.Como alternativa, você pode usar
TestInfo.getTestMethod()
isso retorna umOptional<Method>
objeto.Se o método de recuperação for usado dentro de um método de teste, você nem precisará testar o
Optional
valor agrupado.fonte
JUnit 5 via ExtensionContext
Vantagem:
Você obtém as funcionalidades adicionais
ExtensionContext
substituindoafterEach(ExtensionContext context)
.fonte