Execute um único teste de uma classe JUnit usando a linha de comando

95

Estou tentando encontrar uma abordagem que me permita executar um único teste de uma classe JUnit usando apenas a linha de comando e java.

Posso executar todo o conjunto de testes da classe usando o seguinte:

java -cp .... org.junit.runner.JUnitCore org.package.classname

O que eu realmente quero fazer é algo assim:

java -cp .... org.junit.runner.JUnitCore org.package.classname.method

ou:

java -cp .... org.junit.runner.JUnitCore org.package.classname#method

Percebi que pode haver maneiras de fazer isso usando anotações JUnit, mas prefiro não modificar a fonte de minhas classes de teste manualmente (tentando automatizar isso). Também percebi que Maven pode ter uma maneira de fazer isso, mas, se possível, gostaria de evitar depender de Maven.

Então, eu estou me perguntando se há alguma maneira de fazer isso?


Pontos-chave que procuro:

  • Capacidade de executar um único teste de uma classe de teste JUnit
  • Linha de comando (usando JUnit)
  • Evite modificar a fonte de teste
  • Evite usar ferramentas adicionais
Kevin Jalbert
fonte
4
Legal, outro entusiasta do tipo "Unix é meu IDE". Eu gosto de usar um IDE para um editor (particularmente com o plug-in vim para NetBeans), mas concordo que pequenas ferramentas afiadas que duram "para sempre" e podem ser montadas em configurações arbitrárias, muitas vezes são melhores do que reaprender constantemente recursos esotéricos de uma série de marcas e versões IDE. Bom para você!
Roboprog
2
Você disse que queria evitar o maven. Para quem quer fazer isso usando Maven ver olhada aqui, maven.apache.org/plugins/maven-surefire-plugin/examples/...
reevesy

Respostas:

79

Você pode fazer um corredor JUnit básico e personalizado com bastante facilidade. Aqui está um que executará um único método de teste no formulário com.package.TestClass#methodName:

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

Você pode invocá-lo assim:

> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

Após uma rápida olhada no código-fonte do JUnit, cheguei à mesma conclusão que você de que o JUnit não oferece suporte nativo. Isso nunca foi um problema para mim, pois todos os IDEs têm integrações JUnit personalizadas que permitem executar o método de teste sob o cursor, entre outras ações. Nunca executei testes JUnit diretamente da linha de comando; Eu sempre deixei o IDE ou a ferramenta de construção (Ant, Maven) cuidar disso. Especialmente porque o ponto de entrada CLI padrão (JUnitCore) não produz nenhuma saída de resultado além de um código de saída diferente de zero em falha (ões) de teste.

NOTA: para a versão JUnit> = 4.9, você precisa da biblioteca hamcrest no classpath

Mark Peters
fonte
2
Na verdade, parece que me lembro de obter um rastreamento de pilha completo no log quando uma asserção em um teste falhou, bem como a mensagem (opcional, quando definida) de cada asserção que descreve a expectativa não realizada. Obrigado pela solução alternativa.
Roboprog
48

Eu uso o Maven para construir meu projeto e uso o plug-in SureFire maven para executar os testes junit. Desde que você tenha essa configuração, você pode fazer:

mvn -Dtest=GreatTestClass#testMethod test

Neste exemplo, acabamos de executar um método de teste denominado "testMethod" dentro da classe "GreatTestClass".

Para obter mais detalhes, consulte http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html

Yiling Lu
fonte
-2

Usamos o IntelliJ e passamos um bom tempo tentando descobrir também.

Basicamente, envolve 2 etapas:

Etapa 1: compilar a classe de teste

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

Etapa 2: execute o teste

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest

Benjamin Tan Wei Hao
fonte
6
Isso executa todos os testes da classe, não apenas um teste.
Ladrão de